summaryrefslogtreecommitdiff
path: root/boost/spirit
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-10-30 12:57:26 -0700
committerAnas Nashif <anas.nashif@intel.com>2012-10-30 12:57:26 -0700
commit1a78a62555be32868418fe52f8e330c9d0f95d5a (patch)
treed3765a80e7d3b9640ec2e930743630cd6b9fce2b /boost/spirit
downloadboost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.gz
boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.bz2
boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.zip
Imported Upstream version 1.49.0upstream/1.49.0
Diffstat (limited to 'boost/spirit')
-rw-r--r--boost/spirit/actor.hpp27
-rw-r--r--boost/spirit/actor/assign_actor.hpp27
-rw-r--r--boost/spirit/actor/assign_key_actor.hpp27
-rw-r--r--boost/spirit/actor/clear_actor.hpp27
-rw-r--r--boost/spirit/actor/decrement_actor.hpp27
-rw-r--r--boost/spirit/actor/erase_actor.hpp27
-rw-r--r--boost/spirit/actor/increment_actor.hpp27
-rw-r--r--boost/spirit/actor/insert_at_actor.hpp27
-rw-r--r--boost/spirit/actor/insert_key_actor.hpp27
-rw-r--r--boost/spirit/actor/push_back_actor.hpp27
-rw-r--r--boost/spirit/actor/push_front_actor.hpp27
-rw-r--r--boost/spirit/actor/ref_actor.hpp27
-rw-r--r--boost/spirit/actor/ref_const_ref_actor.hpp27
-rw-r--r--boost/spirit/actor/ref_const_ref_const_ref_a.hpp27
-rw-r--r--boost/spirit/actor/ref_const_ref_value_actor.hpp27
-rw-r--r--boost/spirit/actor/ref_value_actor.hpp27
-rw-r--r--boost/spirit/actor/swap_actor.hpp27
-rw-r--r--boost/spirit/actor/typeof.hpp27
-rw-r--r--boost/spirit/attribute.hpp27
-rw-r--r--boost/spirit/attribute/closure.hpp27
-rw-r--r--boost/spirit/attribute/closure_context.hpp27
-rw-r--r--boost/spirit/attribute/closure_fwd.hpp27
-rw-r--r--boost/spirit/attribute/parametric.hpp27
-rw-r--r--boost/spirit/attribute/typeof.hpp27
-rw-r--r--boost/spirit/core.hpp27
-rw-r--r--boost/spirit/core/assert.hpp27
-rw-r--r--boost/spirit/core/composite/actions.hpp27
-rw-r--r--boost/spirit/core/composite/alternative.hpp27
-rw-r--r--boost/spirit/core/composite/composite.hpp27
-rw-r--r--boost/spirit/core/composite/difference.hpp27
-rw-r--r--boost/spirit/core/composite/directives.hpp27
-rw-r--r--boost/spirit/core/composite/epsilon.hpp27
-rw-r--r--boost/spirit/core/composite/exclusive_or.hpp27
-rw-r--r--boost/spirit/core/composite/intersection.hpp27
-rw-r--r--boost/spirit/core/composite/kleene_star.hpp27
-rw-r--r--boost/spirit/core/composite/list.hpp27
-rw-r--r--boost/spirit/core/composite/no_actions.hpp27
-rw-r--r--boost/spirit/core/composite/operators.hpp27
-rw-r--r--boost/spirit/core/composite/optional.hpp27
-rw-r--r--boost/spirit/core/composite/positive.hpp27
-rw-r--r--boost/spirit/core/composite/sequence.hpp27
-rw-r--r--boost/spirit/core/composite/sequential_and.hpp27
-rw-r--r--boost/spirit/core/composite/sequential_or.hpp27
-rw-r--r--boost/spirit/core/config.hpp27
-rw-r--r--boost/spirit/core/match.hpp27
-rw-r--r--boost/spirit/core/nil.hpp27
-rw-r--r--boost/spirit/core/non_terminal/grammar.hpp27
-rw-r--r--boost/spirit/core/non_terminal/parser_context.hpp27
-rw-r--r--boost/spirit/core/non_terminal/parser_id.hpp27
-rw-r--r--boost/spirit/core/non_terminal/rule.hpp27
-rw-r--r--boost/spirit/core/non_terminal/subrule.hpp27
-rw-r--r--boost/spirit/core/non_terminal/subrule_fwd.hpp27
-rw-r--r--boost/spirit/core/parser.hpp27
-rw-r--r--boost/spirit/core/primitives/numerics.hpp27
-rw-r--r--boost/spirit/core/primitives/numerics_fwd.hpp27
-rw-r--r--boost/spirit/core/primitives/primitives.hpp27
-rw-r--r--boost/spirit/core/safe_bool.hpp27
-rw-r--r--boost/spirit/core/scanner/scanner.hpp27
-rw-r--r--boost/spirit/core/scanner/scanner_fwd.hpp27
-rw-r--r--boost/spirit/core/scanner/skipper.hpp27
-rw-r--r--boost/spirit/core/scanner/skipper_fwd.hpp27
-rw-r--r--boost/spirit/core/typeof.hpp27
-rw-r--r--boost/spirit/debug.hpp27
-rw-r--r--boost/spirit/debug/debug_node.hpp27
-rw-r--r--boost/spirit/debug/minimal.hpp27
-rw-r--r--boost/spirit/debug/parser_names.hpp27
-rw-r--r--boost/spirit/debug/typeof.hpp27
-rw-r--r--boost/spirit/dynamic.hpp27
-rw-r--r--boost/spirit/dynamic/for.hpp27
-rw-r--r--boost/spirit/dynamic/if.hpp27
-rw-r--r--boost/spirit/dynamic/lazy.hpp27
-rw-r--r--boost/spirit/dynamic/rule_alias.hpp27
-rw-r--r--boost/spirit/dynamic/select.hpp27
-rw-r--r--boost/spirit/dynamic/stored_rule.hpp27
-rw-r--r--boost/spirit/dynamic/stored_rule_fwd.hpp27
-rw-r--r--boost/spirit/dynamic/switch.hpp27
-rw-r--r--boost/spirit/dynamic/typeof.hpp27
-rw-r--r--boost/spirit/dynamic/while.hpp27
-rw-r--r--boost/spirit/error_handling.hpp27
-rw-r--r--boost/spirit/error_handling/exceptions.hpp27
-rw-r--r--boost/spirit/error_handling/exceptions_fwd.hpp27
-rw-r--r--boost/spirit/error_handling/typeof.hpp27
-rw-r--r--boost/spirit/home/classic.hpp32
-rw-r--r--boost/spirit/home/classic/actor.hpp113
-rw-r--r--boost/spirit/home/classic/actor/assign_actor.hpp100
-rw-r--r--boost/spirit/home/classic/actor/assign_key_actor.hpp96
-rw-r--r--boost/spirit/home/classic/actor/clear_actor.hpp61
-rw-r--r--boost/spirit/home/classic/actor/decrement_actor.hpp60
-rw-r--r--boost/spirit/home/classic/actor/erase_actor.hpp89
-rw-r--r--boost/spirit/home/classic/actor/increment_actor.hpp60
-rw-r--r--boost/spirit/home/classic/actor/insert_at_actor.hpp121
-rw-r--r--boost/spirit/home/classic/actor/insert_key_actor.hpp97
-rw-r--r--boost/spirit/home/classic/actor/push_back_actor.hpp101
-rw-r--r--boost/spirit/home/classic/actor/push_front_actor.hpp91
-rw-r--r--boost/spirit/home/classic/actor/ref_actor.hpp70
-rw-r--r--boost/spirit/home/classic/actor/ref_const_ref_actor.hpp78
-rw-r--r--boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp87
-rw-r--r--boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp78
-rw-r--r--boost/spirit/home/classic/actor/ref_value_actor.hpp82
-rw-r--r--boost/spirit/home/classic/actor/swap_actor.hpp85
-rw-r--r--boost/spirit/home/classic/actor/typeof.hpp74
-rw-r--r--boost/spirit/home/classic/attribute.hpp37
-rw-r--r--boost/spirit/home/classic/attribute/closure.hpp1083
-rw-r--r--boost/spirit/home/classic/attribute/closure_context.hpp56
-rw-r--r--boost/spirit/home/classic/attribute/closure_fwd.hpp69
-rw-r--r--boost/spirit/home/classic/attribute/parametric.hpp144
-rw-r--r--boost/spirit/home/classic/attribute/typeof.hpp67
-rw-r--r--boost/spirit/home/classic/core.hpp73
-rw-r--r--boost/spirit/home/classic/core/assert.hpp38
-rw-r--r--boost/spirit/home/classic/core/composite/actions.hpp136
-rw-r--r--boost/spirit/home/classic/core/composite/alternative.hpp147
-rw-r--r--boost/spirit/home/classic/core/composite/composite.hpp151
-rw-r--r--boost/spirit/home/classic/core/composite/difference.hpp150
-rw-r--r--boost/spirit/home/classic/core/composite/directives.hpp607
-rw-r--r--boost/spirit/home/classic/core/composite/epsilon.hpp276
-rw-r--r--boost/spirit/home/classic/core/composite/exclusive_or.hpp142
-rw-r--r--boost/spirit/home/classic/core/composite/impl/alternative.ipp90
-rw-r--r--boost/spirit/home/classic/core/composite/impl/difference.ipp90
-rw-r--r--boost/spirit/home/classic/core/composite/impl/directives.ipp374
-rw-r--r--boost/spirit/home/classic/core/composite/impl/exclusive_or.ipp90
-rw-r--r--boost/spirit/home/classic/core/composite/impl/intersection.ipp90
-rw-r--r--boost/spirit/home/classic/core/composite/impl/kleene_star.ipp34
-rw-r--r--boost/spirit/home/classic/core/composite/impl/list.ipp93
-rw-r--r--boost/spirit/home/classic/core/composite/impl/optional.ipp34
-rw-r--r--boost/spirit/home/classic/core/composite/impl/positive.ipp34
-rw-r--r--boost/spirit/home/classic/core/composite/impl/sequence.ipp90
-rw-r--r--boost/spirit/home/classic/core/composite/impl/sequential_and.ipp90
-rw-r--r--boost/spirit/home/classic/core/composite/impl/sequential_or.ipp90
-rw-r--r--boost/spirit/home/classic/core/composite/intersection.hpp142
-rw-r--r--boost/spirit/home/classic/core/composite/kleene_star.hpp109
-rw-r--r--boost/spirit/home/classic/core/composite/list.hpp73
-rw-r--r--boost/spirit/home/classic/core/composite/no_actions.hpp165
-rw-r--r--boost/spirit/home/classic/core/composite/operators.hpp25
-rw-r--r--boost/spirit/home/classic/core/composite/optional.hpp94
-rw-r--r--boost/spirit/home/classic/core/composite/positive.hpp112
-rw-r--r--boost/spirit/home/classic/core/composite/sequence.hpp142
-rw-r--r--boost/spirit/home/classic/core/composite/sequential_and.hpp76
-rw-r--r--boost/spirit/home/classic/core/composite/sequential_or.hpp154
-rw-r--r--boost/spirit/home/classic/core/config.hpp62
-rw-r--r--boost/spirit/home/classic/core/impl/match.ipp113
-rw-r--r--boost/spirit/home/classic/core/impl/match_attr_traits.ipp102
-rw-r--r--boost/spirit/home/classic/core/impl/parser.ipp55
-rw-r--r--boost/spirit/home/classic/core/match.hpp185
-rw-r--r--boost/spirit/home/classic/core/nil.hpp25
-rw-r--r--boost/spirit/home/classic/core/non_terminal/grammar.hpp85
-rw-r--r--boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp407
-rw-r--r--boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp191
-rw-r--r--boost/spirit/home/classic/core/non_terminal/impl/rule.ipp420
-rw-r--r--boost/spirit/home/classic/core/non_terminal/impl/static.hpp120
-rw-r--r--boost/spirit/home/classic/core/non_terminal/impl/subrule.ipp211
-rw-r--r--boost/spirit/home/classic/core/non_terminal/parser_context.hpp150
-rw-r--r--boost/spirit/home/classic/core/non_terminal/parser_id.hpp122
-rw-r--r--boost/spirit/home/classic/core/non_terminal/rule.hpp175
-rw-r--r--boost/spirit/home/classic/core/non_terminal/subrule.hpp300
-rw-r--r--boost/spirit/home/classic/core/non_terminal/subrule_fwd.hpp35
-rw-r--r--boost/spirit/home/classic/core/parser.hpp223
-rw-r--r--boost/spirit/home/classic/core/primitives/impl/numerics.ipp478
-rw-r--r--boost/spirit/home/classic/core/primitives/impl/primitives.ipp476
-rw-r--r--boost/spirit/home/classic/core/primitives/numerics.hpp289
-rw-r--r--boost/spirit/home/classic/core/primitives/numerics_fwd.hpp88
-rw-r--r--boost/spirit/home/classic/core/primitives/primitives.hpp654
-rw-r--r--boost/spirit/home/classic/core/safe_bool.hpp64
-rw-r--r--boost/spirit/home/classic/core/scanner/impl/skipper.ipp181
-rw-r--r--boost/spirit/home/classic/core/scanner/scanner.hpp329
-rw-r--r--boost/spirit/home/classic/core/scanner/scanner_fwd.hpp52
-rw-r--r--boost/spirit/home/classic/core/scanner/skipper.hpp197
-rw-r--r--boost/spirit/home/classic/core/scanner/skipper_fwd.hpp32
-rw-r--r--boost/spirit/home/classic/core/typeof.hpp343
-rw-r--r--boost/spirit/home/classic/debug.hpp154
-rw-r--r--boost/spirit/home/classic/debug/debug_node.hpp319
-rw-r--r--boost/spirit/home/classic/debug/impl/parser_names.ipp555
-rw-r--r--boost/spirit/home/classic/debug/minimal.hpp81
-rw-r--r--boost/spirit/home/classic/debug/parser_names.hpp254
-rw-r--r--boost/spirit/home/classic/debug/typeof.hpp37
-rw-r--r--boost/spirit/home/classic/dynamic.hpp30
-rw-r--r--boost/spirit/home/classic/dynamic/for.hpp187
-rw-r--r--boost/spirit/home/classic/dynamic/if.hpp229
-rw-r--r--boost/spirit/home/classic/dynamic/impl/conditions.ipp104
-rw-r--r--boost/spirit/home/classic/dynamic/impl/select.ipp120
-rw-r--r--boost/spirit/home/classic/dynamic/impl/switch.ipp574
-rw-r--r--boost/spirit/home/classic/dynamic/lazy.hpp66
-rw-r--r--boost/spirit/home/classic/dynamic/rule_alias.hpp76
-rw-r--r--boost/spirit/home/classic/dynamic/select.hpp245
-rw-r--r--boost/spirit/home/classic/dynamic/stored_rule.hpp127
-rw-r--r--boost/spirit/home/classic/dynamic/stored_rule_fwd.hpp31
-rw-r--r--boost/spirit/home/classic/dynamic/switch.hpp259
-rw-r--r--boost/spirit/home/classic/dynamic/typeof.hpp89
-rw-r--r--boost/spirit/home/classic/dynamic/while.hpp189
-rw-r--r--boost/spirit/home/classic/error_handling.hpp21
-rw-r--r--boost/spirit/home/classic/error_handling/exceptions.hpp365
-rw-r--r--boost/spirit/home/classic/error_handling/exceptions_fwd.hpp41
-rw-r--r--boost/spirit/home/classic/error_handling/impl/exceptions.ipp93
-rw-r--r--boost/spirit/home/classic/error_handling/typeof.hpp33
-rw-r--r--boost/spirit/home/classic/iterator.hpp25
-rw-r--r--boost/spirit/home/classic/iterator/file_iterator.hpp229
-rw-r--r--boost/spirit/home/classic/iterator/file_iterator_fwd.hpp39
-rw-r--r--boost/spirit/home/classic/iterator/fixed_size_queue.hpp402
-rw-r--r--boost/spirit/home/classic/iterator/impl/file_iterator.ipp467
-rw-r--r--boost/spirit/home/classic/iterator/impl/position_iterator.ipp138
-rw-r--r--boost/spirit/home/classic/iterator/multi_pass.hpp1307
-rw-r--r--boost/spirit/home/classic/iterator/multi_pass_fwd.hpp47
-rw-r--r--boost/spirit/home/classic/iterator/position_iterator.hpp436
-rw-r--r--boost/spirit/home/classic/iterator/position_iterator_fwd.hpp60
-rw-r--r--boost/spirit/home/classic/iterator/typeof.hpp94
-rw-r--r--boost/spirit/home/classic/meta.hpp26
-rw-r--r--boost/spirit/home/classic/meta/as_parser.hpp113
-rw-r--r--boost/spirit/home/classic/meta/fundamental.hpp56
-rw-r--r--boost/spirit/home/classic/meta/impl/fundamental.ipp309
-rw-r--r--boost/spirit/home/classic/meta/impl/parser_traits.ipp191
-rw-r--r--boost/spirit/home/classic/meta/impl/refactoring.ipp451
-rw-r--r--boost/spirit/home/classic/meta/impl/traverse.ipp393
-rw-r--r--boost/spirit/home/classic/meta/parser_traits.hpp320
-rw-r--r--boost/spirit/home/classic/meta/refactoring.hpp287
-rw-r--r--boost/spirit/home/classic/meta/traverse.hpp222
-rw-r--r--boost/spirit/home/classic/namespace.hpp35
-rw-r--r--boost/spirit/home/classic/phoenix.hpp25
-rw-r--r--boost/spirit/home/classic/phoenix/actor.hpp604
-rw-r--r--boost/spirit/home/classic/phoenix/binders.hpp4066
-rw-r--r--boost/spirit/home/classic/phoenix/casts.hpp1470
-rw-r--r--boost/spirit/home/classic/phoenix/closures.hpp446
-rw-r--r--boost/spirit/home/classic/phoenix/composite.hpp1431
-rw-r--r--boost/spirit/home/classic/phoenix/functions.hpp760
-rw-r--r--boost/spirit/home/classic/phoenix/new.hpp1315
-rw-r--r--boost/spirit/home/classic/phoenix/operators.hpp2203
-rw-r--r--boost/spirit/home/classic/phoenix/primitives.hpp256
-rw-r--r--boost/spirit/home/classic/phoenix/special_ops.hpp341
-rw-r--r--boost/spirit/home/classic/phoenix/statements.hpp443
-rw-r--r--boost/spirit/home/classic/phoenix/tuple_helpers.hpp1075
-rw-r--r--boost/spirit/home/classic/phoenix/tuples.hpp1338
-rw-r--r--boost/spirit/home/classic/symbols.hpp21
-rw-r--r--boost/spirit/home/classic/symbols/impl/symbols.ipp118
-rw-r--r--boost/spirit/home/classic/symbols/impl/tst.ipp281
-rw-r--r--boost/spirit/home/classic/symbols/symbols.hpp229
-rw-r--r--boost/spirit/home/classic/symbols/symbols_fwd.hpp39
-rw-r--r--boost/spirit/home/classic/symbols/typeof.hpp25
-rw-r--r--boost/spirit/home/classic/tree/ast.hpp387
-rw-r--r--boost/spirit/home/classic/tree/ast_fwd.hpp42
-rw-r--r--boost/spirit/home/classic/tree/common.hpp1588
-rw-r--r--boost/spirit/home/classic/tree/common_fwd.hpp96
-rw-r--r--boost/spirit/home/classic/tree/impl/parse_tree_utils.ipp135
-rw-r--r--boost/spirit/home/classic/tree/impl/tree_to_xml.ipp526
-rw-r--r--boost/spirit/home/classic/tree/parse_tree.hpp296
-rw-r--r--boost/spirit/home/classic/tree/parse_tree_fwd.hpp39
-rw-r--r--boost/spirit/home/classic/tree/parse_tree_utils.hpp64
-rw-r--r--boost/spirit/home/classic/tree/parsetree.dtd21
-rw-r--r--boost/spirit/home/classic/tree/tree_to_xml.hpp116
-rw-r--r--boost/spirit/home/classic/tree/typeof.hpp80
-rw-r--r--boost/spirit/home/classic/utility.hpp40
-rw-r--r--boost/spirit/home/classic/utility/chset.hpp187
-rw-r--r--boost/spirit/home/classic/utility/chset_operators.hpp402
-rw-r--r--boost/spirit/home/classic/utility/confix.hpp405
-rw-r--r--boost/spirit/home/classic/utility/confix_fwd.hpp39
-rw-r--r--boost/spirit/home/classic/utility/distinct.hpp229
-rw-r--r--boost/spirit/home/classic/utility/distinct_fwd.hpp37
-rw-r--r--boost/spirit/home/classic/utility/escape_char.hpp184
-rw-r--r--boost/spirit/home/classic/utility/escape_char_fwd.hpp30
-rw-r--r--boost/spirit/home/classic/utility/flush_multi_pass.hpp77
-rw-r--r--boost/spirit/home/classic/utility/functor_parser.hpp71
-rw-r--r--boost/spirit/home/classic/utility/grammar_def.hpp307
-rw-r--r--boost/spirit/home/classic/utility/grammar_def_fwd.hpp52
-rw-r--r--boost/spirit/home/classic/utility/impl/chset.ipp366
-rw-r--r--boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp107
-rw-r--r--boost/spirit/home/classic/utility/impl/chset/basic_chset.ipp246
-rw-r--r--boost/spirit/home/classic/utility/impl/chset/range_run.hpp127
-rw-r--r--boost/spirit/home/classic/utility/impl/chset/range_run.ipp218
-rw-r--r--boost/spirit/home/classic/utility/impl/chset_operators.ipp666
-rw-r--r--boost/spirit/home/classic/utility/impl/confix.ipp221
-rw-r--r--boost/spirit/home/classic/utility/impl/escape_char.ipp224
-rw-r--r--boost/spirit/home/classic/utility/impl/lists.ipp168
-rw-r--r--boost/spirit/home/classic/utility/impl/regex.ipp81
-rw-r--r--boost/spirit/home/classic/utility/lists.hpp340
-rw-r--r--boost/spirit/home/classic/utility/lists_fwd.hpp31
-rw-r--r--boost/spirit/home/classic/utility/loops.hpp317
-rw-r--r--boost/spirit/home/classic/utility/regex.hpp112
-rw-r--r--boost/spirit/home/classic/utility/rule_parser.hpp1142
-rw-r--r--boost/spirit/home/classic/utility/scoped_lock.hpp112
-rw-r--r--boost/spirit/home/classic/utility/typeof.hpp150
-rw-r--r--boost/spirit/home/classic/version.hpp30
-rw-r--r--boost/spirit/home/karma.hpp31
-rw-r--r--boost/spirit/home/karma/action.hpp15
-rw-r--r--boost/spirit/home/karma/action/action.hpp137
-rw-r--r--boost/spirit/home/karma/auto.hpp16
-rw-r--r--boost/spirit/home/karma/auto/auto.hpp188
-rw-r--r--boost/spirit/home/karma/auto/create_generator.hpp46
-rw-r--r--boost/spirit/home/karma/auto/meta_create.hpp339
-rw-r--r--boost/spirit/home/karma/auxiliary.hpp18
-rw-r--r--boost/spirit/home/karma/auxiliary/attr_cast.hpp120
-rw-r--r--boost/spirit/home/karma/auxiliary/eol.hpp81
-rw-r--r--boost/spirit/home/karma/auxiliary/eps.hpp137
-rw-r--r--boost/spirit/home/karma/auxiliary/lazy.hpp267
-rw-r--r--boost/spirit/home/karma/binary.hpp16
-rw-r--r--boost/spirit/home/karma/binary/binary.hpp438
-rw-r--r--boost/spirit/home/karma/binary/padding.hpp115
-rw-r--r--boost/spirit/home/karma/char.hpp16
-rw-r--r--boost/spirit/home/karma/char/char.hpp547
-rw-r--r--boost/spirit/home/karma/char/char_class.hpp226
-rw-r--r--boost/spirit/home/karma/char/char_generator.hpp168
-rw-r--r--boost/spirit/home/karma/delimit_flag.hpp27
-rw-r--r--boost/spirit/home/karma/delimit_out.hpp45
-rw-r--r--boost/spirit/home/karma/detail/alternative_function.hpp250
-rw-r--r--boost/spirit/home/karma/detail/as.hpp74
-rw-r--r--boost/spirit/home/karma/detail/attributes.hpp108
-rw-r--r--boost/spirit/home/karma/detail/default_width.hpp75
-rw-r--r--boost/spirit/home/karma/detail/enable_lit.hpp30
-rw-r--r--boost/spirit/home/karma/detail/extract_from.hpp274
-rw-r--r--boost/spirit/home/karma/detail/fail_function.hpp60
-rw-r--r--boost/spirit/home/karma/detail/generate.hpp131
-rw-r--r--boost/spirit/home/karma/detail/generate_auto.hpp63
-rw-r--r--boost/spirit/home/karma/detail/generate_to.hpp67
-rw-r--r--boost/spirit/home/karma/detail/get_casetag.hpp29
-rw-r--r--boost/spirit/home/karma/detail/get_stricttag.hpp33
-rw-r--r--boost/spirit/home/karma/detail/indirect_iterator.hpp96
-rw-r--r--boost/spirit/home/karma/detail/output_iterator.hpp616
-rw-r--r--boost/spirit/home/karma/detail/pass_container.hpp350
-rw-r--r--boost/spirit/home/karma/detail/string_compare.hpp76
-rw-r--r--boost/spirit/home/karma/detail/string_generate.hpp155
-rw-r--r--boost/spirit/home/karma/detail/unused_delimiter.hpp51
-rw-r--r--boost/spirit/home/karma/directive.hpp75
-rw-r--r--boost/spirit/home/karma/directive/as.hpp165
-rw-r--r--boost/spirit/home/karma/directive/buffer.hpp132
-rw-r--r--boost/spirit/home/karma/directive/center_alignment.hpp335
-rw-r--r--boost/spirit/home/karma/directive/columns.hpp292
-rw-r--r--boost/spirit/home/karma/directive/delimit.hpp200
-rw-r--r--boost/spirit/home/karma/directive/duplicate.hpp230
-rw-r--r--boost/spirit/home/karma/directive/encoding.hpp35
-rw-r--r--boost/spirit/home/karma/directive/left_alignment.hpp318
-rw-r--r--boost/spirit/home/karma/directive/maxwidth.hpp246
-rw-r--r--boost/spirit/home/karma/directive/no_delimit.hpp116
-rw-r--r--boost/spirit/home/karma/directive/omit.hpp135
-rw-r--r--boost/spirit/home/karma/directive/repeat.hpp397
-rw-r--r--boost/spirit/home/karma/directive/right_alignment.hpp327
-rw-r--r--boost/spirit/home/karma/directive/strict_relaxed.hpp78
-rw-r--r--boost/spirit/home/karma/directive/upper_lower_case.hpp85
-rw-r--r--boost/spirit/home/karma/directive/verbatim.hpp114
-rw-r--r--boost/spirit/home/karma/domain.hpp74
-rw-r--r--boost/spirit/home/karma/format.hpp16
-rw-r--r--boost/spirit/home/karma/format_auto.hpp16
-rw-r--r--boost/spirit/home/karma/generate.hpp232
-rw-r--r--boost/spirit/home/karma/generate_attr.hpp212
-rw-r--r--boost/spirit/home/karma/generator.hpp159
-rw-r--r--boost/spirit/home/karma/meta_compiler.hpp177
-rw-r--r--boost/spirit/home/karma/nonterminal.hpp18
-rw-r--r--boost/spirit/home/karma/nonterminal/debug_handler.hpp134
-rw-r--r--boost/spirit/home/karma/nonterminal/debug_handler_state.hpp23
-rw-r--r--boost/spirit/home/karma/nonterminal/detail/fcall.hpp53
-rw-r--r--boost/spirit/home/karma/nonterminal/detail/generator_binder.hpp86
-rw-r--r--boost/spirit/home/karma/nonterminal/detail/parameterized.hpp76
-rw-r--r--boost/spirit/home/karma/nonterminal/grammar.hpp134
-rw-r--r--boost/spirit/home/karma/nonterminal/nonterminal_fwd.hpp31
-rw-r--r--boost/spirit/home/karma/nonterminal/rule.hpp447
-rw-r--r--boost/spirit/home/karma/nonterminal/simple_trace.hpp134
-rw-r--r--boost/spirit/home/karma/numeric.hpp18
-rw-r--r--boost/spirit/home/karma/numeric/bool.hpp424
-rw-r--r--boost/spirit/home/karma/numeric/bool_policies.hpp117
-rw-r--r--boost/spirit/home/karma/numeric/detail/bool_utils.hpp67
-rw-r--r--boost/spirit/home/karma/numeric/detail/numeric_utils.hpp770
-rw-r--r--boost/spirit/home/karma/numeric/detail/real_utils.hpp185
-rw-r--r--boost/spirit/home/karma/numeric/int.hpp525
-rw-r--r--boost/spirit/home/karma/numeric/real.hpp453
-rw-r--r--boost/spirit/home/karma/numeric/real_policies.hpp333
-rw-r--r--boost/spirit/home/karma/numeric/uint.hpp576
-rw-r--r--boost/spirit/home/karma/operator.hpp22
-rw-r--r--boost/spirit/home/karma/operator/alternative.hpp208
-rw-r--r--boost/spirit/home/karma/operator/and_predicate.hpp95
-rw-r--r--boost/spirit/home/karma/operator/kleene.hpp208
-rw-r--r--boost/spirit/home/karma/operator/list.hpp229
-rw-r--r--boost/spirit/home/karma/operator/not_predicate.hpp96
-rw-r--r--boost/spirit/home/karma/operator/optional.hpp105
-rw-r--r--boost/spirit/home/karma/operator/plus.hpp226
-rw-r--r--boost/spirit/home/karma/operator/sequence.hpp313
-rw-r--r--boost/spirit/home/karma/phoenix_attributes.hpp124
-rw-r--r--boost/spirit/home/karma/reference.hpp91
-rw-r--r--boost/spirit/home/karma/stream.hpp16
-rw-r--r--boost/spirit/home/karma/stream/detail/format_manip.hpp207
-rw-r--r--boost/spirit/home/karma/stream/detail/format_manip_auto.hpp56
-rw-r--r--boost/spirit/home/karma/stream/detail/iterator_sink.hpp55
-rw-r--r--boost/spirit/home/karma/stream/format_manip.hpp117
-rw-r--r--boost/spirit/home/karma/stream/format_manip_attr.hpp123
-rw-r--r--boost/spirit/home/karma/stream/ostream_iterator.hpp65
-rw-r--r--boost/spirit/home/karma/stream/stream.hpp371
-rw-r--r--boost/spirit/home/karma/string.hpp16
-rw-r--r--boost/spirit/home/karma/string/lit.hpp334
-rw-r--r--boost/spirit/home/karma/string/symbols.hpp768
-rw-r--r--boost/spirit/home/karma/what.hpp33
-rw-r--r--boost/spirit/home/lex.hpp18
-rw-r--r--boost/spirit/home/lex/argument.hpp362
-rw-r--r--boost/spirit/home/lex/argument_phoenix.hpp251
-rw-r--r--boost/spirit/home/lex/detail/sequence_function.hpp63
-rw-r--r--boost/spirit/home/lex/domain.hpp31
-rw-r--r--boost/spirit/home/lex/lexer.hpp21
-rw-r--r--boost/spirit/home/lex/lexer/action.hpp97
-rw-r--r--boost/spirit/home/lex/lexer/char_token_def.hpp242
-rw-r--r--boost/spirit/home/lex/lexer/lexer.hpp405
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/functor.hpp300
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/functor_data.hpp552
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/generate_static.hpp1026
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/iterator.hpp121
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp255
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/lexer.hpp399
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/position_token.hpp934
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/semantic_action_data.hpp121
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/static_functor_data.hpp572
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp279
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/static_version.hpp20
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/token.hpp654
-rw-r--r--boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp154
-rw-r--r--boost/spirit/home/lex/lexer/pass_flags.hpp28
-rw-r--r--boost/spirit/home/lex/lexer/sequence.hpp72
-rw-r--r--boost/spirit/home/lex/lexer/string_token_def.hpp178
-rw-r--r--boost/spirit/home/lex/lexer/support_functions.hpp205
-rw-r--r--boost/spirit/home/lex/lexer/support_functions_expression.hpp135
-rw-r--r--boost/spirit/home/lex/lexer/terminals.hpp23
-rw-r--r--boost/spirit/home/lex/lexer/token_def.hpp246
-rw-r--r--boost/spirit/home/lex/lexer_lexertl.hpp18
-rw-r--r--boost/spirit/home/lex/lexer_static_lexertl.hpp18
-rw-r--r--boost/spirit/home/lex/lexer_type.hpp100
-rw-r--r--boost/spirit/home/lex/meta_compiler.hpp104
-rw-r--r--boost/spirit/home/lex/primitives.hpp16
-rw-r--r--boost/spirit/home/lex/qi.hpp20
-rw-r--r--boost/spirit/home/lex/qi/in_state.hpp32
-rw-r--r--boost/spirit/home/lex/qi/plain_raw_token.hpp149
-rw-r--r--boost/spirit/home/lex/qi/plain_token.hpp242
-rw-r--r--boost/spirit/home/lex/qi/plain_tokenid.hpp242
-rw-r--r--boost/spirit/home/lex/qi/plain_tokenid_mask.hpp138
-rw-r--r--boost/spirit/home/lex/qi/state_switcher.hpp270
-rw-r--r--boost/spirit/home/lex/reference.hpp85
-rw-r--r--boost/spirit/home/lex/tokenize_and_parse.hpp325
-rw-r--r--boost/spirit/home/lex/tokenize_and_parse_attr.hpp114
-rw-r--r--boost/spirit/home/phoenix.hpp23
-rw-r--r--boost/spirit/home/phoenix/algorithm.hpp14
-rw-r--r--boost/spirit/home/phoenix/bind.hpp16
-rw-r--r--boost/spirit/home/phoenix/bind/bind_function.hpp58
-rw-r--r--boost/spirit/home/phoenix/bind/bind_function_object.hpp40
-rw-r--r--boost/spirit/home/phoenix/bind/bind_member_function.hpp77
-rw-r--r--boost/spirit/home/phoenix/bind/bind_member_variable.hpp105
-rw-r--r--boost/spirit/home/phoenix/bind/detail/bind_function.hpp53
-rw-r--r--boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp43
-rw-r--r--boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp132
-rw-r--r--boost/spirit/home/phoenix/bind/detail/function_ptr.hpp99
-rw-r--r--boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp119
-rw-r--r--boost/spirit/home/phoenix/container.hpp12
-rw-r--r--boost/spirit/home/phoenix/core.hpp23
-rw-r--r--boost/spirit/home/phoenix/core/actor.hpp194
-rw-r--r--boost/spirit/home/phoenix/core/argument.hpp99
-rw-r--r--boost/spirit/home/phoenix/core/as_actor.hpp62
-rw-r--r--boost/spirit/home/phoenix/core/basic_environment.hpp81
-rw-r--r--boost/spirit/home/phoenix/core/compose.hpp118
-rw-r--r--boost/spirit/home/phoenix/core/composite.hpp96
-rw-r--r--boost/spirit/home/phoenix/core/detail/actor.hpp65
-rw-r--r--boost/spirit/home/phoenix/core/detail/basic_environment.hpp38
-rw-r--r--boost/spirit/home/phoenix/core/detail/compose.hpp47
-rw-r--r--boost/spirit/home/phoenix/core/detail/composite.hpp36
-rw-r--r--boost/spirit/home/phoenix/core/detail/composite_eval.hpp106
-rw-r--r--boost/spirit/home/phoenix/core/detail/composite_info.hpp40
-rw-r--r--boost/spirit/home/phoenix/core/detail/function_eval.hpp142
-rw-r--r--boost/spirit/home/phoenix/core/is_actor.hpp29
-rw-r--r--boost/spirit/home/phoenix/core/limits.hpp79
-rw-r--r--boost/spirit/home/phoenix/core/nothing.hpp42
-rw-r--r--boost/spirit/home/phoenix/core/reference.hpp80
-rw-r--r--boost/spirit/home/phoenix/core/value.hpp158
-rw-r--r--boost/spirit/home/phoenix/detail/local_reference.hpp44
-rw-r--r--boost/spirit/home/phoenix/detail/type_deduction.hpp497
-rw-r--r--boost/spirit/home/phoenix/function.hpp13
-rw-r--r--boost/spirit/home/phoenix/function/detail/function_call.hpp42
-rw-r--r--boost/spirit/home/phoenix/function/function.hpp48
-rw-r--r--boost/spirit/home/phoenix/fusion.hpp12
-rw-r--r--boost/spirit/home/phoenix/fusion/at.hpp49
-rw-r--r--boost/spirit/home/phoenix/object.hpp19
-rw-r--r--boost/spirit/home/phoenix/object/const_cast.hpp42
-rw-r--r--boost/spirit/home/phoenix/object/construct.hpp80
-rw-r--r--boost/spirit/home/phoenix/object/delete.hpp41
-rw-r--r--boost/spirit/home/phoenix/object/detail/construct.hpp42
-rw-r--r--boost/spirit/home/phoenix/object/detail/construct_eval.hpp46
-rw-r--r--boost/spirit/home/phoenix/object/detail/new.hpp42
-rw-r--r--boost/spirit/home/phoenix/object/detail/new_eval.hpp47
-rw-r--r--boost/spirit/home/phoenix/object/dynamic_cast.hpp42
-rw-r--r--boost/spirit/home/phoenix/object/new.hpp80
-rw-r--r--boost/spirit/home/phoenix/object/reinterpret_cast.hpp42
-rw-r--r--boost/spirit/home/phoenix/object/static_cast.hpp42
-rw-r--r--boost/spirit/home/phoenix/operator.hpp20
-rw-r--r--boost/spirit/home/phoenix/operator/arithmetic.hpp115
-rw-r--r--boost/spirit/home/phoenix/operator/bitwise.hpp91
-rw-r--r--boost/spirit/home/phoenix/operator/comparison.hpp55
-rw-r--r--boost/spirit/home/phoenix/operator/detail/binary_compose.hpp32
-rw-r--r--boost/spirit/home/phoenix/operator/detail/binary_eval.hpp44
-rw-r--r--boost/spirit/home/phoenix/operator/detail/io.hpp78
-rw-r--r--boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp76
-rw-r--r--boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp69
-rw-r--r--boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp65
-rw-r--r--boost/spirit/home/phoenix/operator/detail/unary_compose.hpp18
-rw-r--r--boost/spirit/home/phoenix/operator/detail/unary_eval.hpp40
-rw-r--r--boost/spirit/home/phoenix/operator/if_else.hpp78
-rw-r--r--boost/spirit/home/phoenix/operator/io.hpp86
-rw-r--r--boost/spirit/home/phoenix/operator/logical.hpp43
-rw-r--r--boost/spirit/home/phoenix/operator/member.hpp145
-rw-r--r--boost/spirit/home/phoenix/operator/self.hpp75
-rw-r--r--boost/spirit/home/phoenix/scope.hpp16
-rw-r--r--boost/spirit/home/phoenix/scope/detail/local_gen.hpp57
-rw-r--r--boost/spirit/home/phoenix/scope/detail/local_variable.hpp198
-rw-r--r--boost/spirit/home/phoenix/scope/dynamic.hpp193
-rw-r--r--boost/spirit/home/phoenix/scope/lambda.hpp176
-rw-r--r--boost/spirit/home/phoenix/scope/let.hpp145
-rw-r--r--boost/spirit/home/phoenix/scope/local_variable.hpp111
-rw-r--r--boost/spirit/home/phoenix/scope/scoped_environment.hpp47
-rw-r--r--boost/spirit/home/phoenix/statement.hpp20
-rw-r--r--boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp101
-rw-r--r--boost/spirit/home/phoenix/statement/detail/catch_composite.hpp62
-rw-r--r--boost/spirit/home/phoenix/statement/detail/catch_eval.hpp79
-rw-r--r--boost/spirit/home/phoenix/statement/detail/switch.hpp172
-rw-r--r--boost/spirit/home/phoenix/statement/detail/switch_eval.hpp111
-rw-r--r--boost/spirit/home/phoenix/statement/detail/switch_eval.ipp74
-rw-r--r--boost/spirit/home/phoenix/statement/do_while.hpp62
-rw-r--r--boost/spirit/home/phoenix/statement/for.hpp64
-rw-r--r--boost/spirit/home/phoenix/statement/if.hpp130
-rw-r--r--boost/spirit/home/phoenix/statement/sequence.hpp55
-rw-r--r--boost/spirit/home/phoenix/statement/switch.hpp164
-rw-r--r--boost/spirit/home/phoenix/statement/throw.hpp66
-rw-r--r--boost/spirit/home/phoenix/statement/try_catch.hpp188
-rw-r--r--boost/spirit/home/phoenix/statement/while.hpp56
-rw-r--r--boost/spirit/home/phoenix/stl.hpp15
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm.hpp17
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp28
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp30
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp28
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp51
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp51
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp51
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp34
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp34
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp34
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp34
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp34
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp51
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_map.hpp87
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_set.hpp83
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/is_std_list.hpp41
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/is_std_map.hpp58
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/is_std_set.hpp56
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_map_fwd.hpp70
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_set_fwd.hpp66
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/iteration.hpp69
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/querying.hpp502
-rw-r--r--boost/spirit/home/phoenix/stl/algorithm/transformation.hpp1071
-rw-r--r--boost/spirit/home/phoenix/stl/container.hpp13
-rw-r--r--boost/spirit/home/phoenix/stl/container/container.hpp706
-rw-r--r--boost/spirit/home/phoenix/stl/container/detail/container.hpp173
-rw-r--r--boost/spirit/home/phoenix/version.hpp18
-rw-r--r--boost/spirit/home/qi.hpp31
-rw-r--r--boost/spirit/home/qi/action.hpp16
-rw-r--r--boost/spirit/home/qi/action/action.hpp202
-rw-r--r--boost/spirit/home/qi/auto.hpp18
-rw-r--r--boost/spirit/home/qi/auto/auto.hpp90
-rw-r--r--boost/spirit/home/qi/auto/create_parser.hpp45
-rw-r--r--boost/spirit/home/qi/auto/meta_create.hpp274
-rw-r--r--boost/spirit/home/qi/auxiliary.hpp22
-rw-r--r--boost/spirit/home/qi/auxiliary/attr.hpp110
-rw-r--r--boost/spirit/home/qi/auxiliary/attr_cast.hpp145
-rw-r--r--boost/spirit/home/qi/auxiliary/eoi.hpp80
-rw-r--r--boost/spirit/home/qi/auxiliary/eol.hpp98
-rw-r--r--boost/spirit/home/qi/auxiliary/eps.hpp132
-rw-r--r--boost/spirit/home/qi/auxiliary/lazy.hpp287
-rw-r--r--boost/spirit/home/qi/binary.hpp16
-rw-r--r--boost/spirit/home/qi/binary/binary.hpp413
-rw-r--r--boost/spirit/home/qi/char.hpp18
-rw-r--r--boost/spirit/home/qi/char/char.hpp615
-rw-r--r--boost/spirit/home/qi/char/char_class.hpp118
-rw-r--r--boost/spirit/home/qi/char/char_parser.hpp157
-rw-r--r--boost/spirit/home/qi/detail/alternative_function.hpp214
-rw-r--r--boost/spirit/home/qi/detail/assign_to.hpp363
-rw-r--r--boost/spirit/home/qi/detail/attributes.hpp176
-rw-r--r--boost/spirit/home/qi/detail/construct.hpp202
-rw-r--r--boost/spirit/home/qi/detail/enable_lit.hpp30
-rw-r--r--boost/spirit/home/qi/detail/expect_function.hpp105
-rw-r--r--boost/spirit/home/qi/detail/fail_function.hpp59
-rw-r--r--boost/spirit/home/qi/detail/parse.hpp97
-rw-r--r--boost/spirit/home/qi/detail/parse_auto.hpp191
-rw-r--r--boost/spirit/home/qi/detail/pass_container.hpp362
-rw-r--r--boost/spirit/home/qi/detail/pass_function.hpp70
-rw-r--r--boost/spirit/home/qi/detail/permute_function.hpp88
-rw-r--r--boost/spirit/home/qi/detail/string_parse.hpp89
-rw-r--r--boost/spirit/home/qi/detail/unused_skipper.hpp50
-rw-r--r--boost/spirit/home/qi/directive.hpp26
-rw-r--r--boost/spirit/home/qi/directive/as.hpp178
-rw-r--r--boost/spirit/home/qi/directive/encoding.hpp32
-rw-r--r--boost/spirit/home/qi/directive/hold.hpp109
-rw-r--r--boost/spirit/home/qi/directive/lexeme.hpp106
-rw-r--r--boost/spirit/home/qi/directive/matches.hpp108
-rw-r--r--boost/spirit/home/qi/directive/no_case.hpp32
-rw-r--r--boost/spirit/home/qi/directive/no_skip.hpp108
-rw-r--r--boost/spirit/home/qi/directive/omit.hpp107
-rw-r--r--boost/spirit/home/qi/directive/raw.hpp111
-rw-r--r--boost/spirit/home/qi/directive/repeat.hpp297
-rw-r--r--boost/spirit/home/qi/directive/skip.hpp190
-rw-r--r--boost/spirit/home/qi/domain.hpp74
-rw-r--r--boost/spirit/home/qi/match.hpp16
-rw-r--r--boost/spirit/home/qi/match_auto.hpp16
-rw-r--r--boost/spirit/home/qi/meta_compiler.hpp177
-rw-r--r--boost/spirit/home/qi/nonterminal.hpp21
-rw-r--r--boost/spirit/home/qi/nonterminal/debug_handler.hpp145
-rw-r--r--boost/spirit/home/qi/nonterminal/debug_handler_state.hpp24
-rw-r--r--boost/spirit/home/qi/nonterminal/detail/fcall.hpp53
-rw-r--r--boost/spirit/home/qi/nonterminal/detail/parameterized.hpp75
-rw-r--r--boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp87
-rw-r--r--boost/spirit/home/qi/nonterminal/error_handler.hpp176
-rw-r--r--boost/spirit/home/qi/nonterminal/grammar.hpp132
-rw-r--r--boost/spirit/home/qi/nonterminal/nonterminal_fwd.hpp31
-rw-r--r--boost/spirit/home/qi/nonterminal/rule.hpp439
-rw-r--r--boost/spirit/home/qi/nonterminal/simple_trace.hpp135
-rw-r--r--boost/spirit/home/qi/nonterminal/success_handler.hpp83
-rw-r--r--boost/spirit/home/qi/numeric.hpp19
-rw-r--r--boost/spirit/home/qi/numeric/bool.hpp338
-rw-r--r--boost/spirit/home/qi/numeric/bool_policies.hpp81
-rw-r--r--boost/spirit/home/qi/numeric/detail/numeric_utils.hpp505
-rw-r--r--boost/spirit/home/qi/numeric/detail/real_impl.hpp271
-rw-r--r--boost/spirit/home/qi/numeric/int.hpp407
-rw-r--r--boost/spirit/home/qi/numeric/numeric_utils.hpp149
-rw-r--r--boost/spirit/home/qi/numeric/real.hpp342
-rw-r--r--boost/spirit/home/qi/numeric/real_policies.hpp186
-rw-r--r--boost/spirit/home/qi/numeric/uint.hpp464
-rw-r--r--boost/spirit/home/qi/operator.hpp27
-rw-r--r--boost/spirit/home/qi/operator/alternative.hpp118
-rw-r--r--boost/spirit/home/qi/operator/and_predicate.hpp92
-rw-r--r--boost/spirit/home/qi/operator/difference.hpp112
-rw-r--r--boost/spirit/home/qi/operator/expect.hpp103
-rw-r--r--boost/spirit/home/qi/operator/kleene.hpp134
-rw-r--r--boost/spirit/home/qi/operator/list.hpp135
-rw-r--r--boost/spirit/home/qi/operator/not_predicate.hpp91
-rw-r--r--boost/spirit/home/qi/operator/optional.hpp135
-rw-r--r--boost/spirit/home/qi/operator/permutation.hpp146
-rw-r--r--boost/spirit/home/qi/operator/plus.hpp125
-rw-r--r--boost/spirit/home/qi/operator/sequence.hpp96
-rw-r--r--boost/spirit/home/qi/operator/sequence_base.hpp140
-rw-r--r--boost/spirit/home/qi/operator/sequential_or.hpp126
-rw-r--r--boost/spirit/home/qi/parse.hpp215
-rw-r--r--boost/spirit/home/qi/parse_attr.hpp177
-rw-r--r--boost/spirit/home/qi/parser.hpp140
-rw-r--r--boost/spirit/home/qi/reference.hpp69
-rw-r--r--boost/spirit/home/qi/skip_flag.hpp29
-rw-r--r--boost/spirit/home/qi/skip_over.hpp44
-rw-r--r--boost/spirit/home/qi/stream.hpp17
-rw-r--r--boost/spirit/home/qi/stream/detail/iterator_source.hpp80
-rw-r--r--boost/spirit/home/qi/stream/detail/match_manip.hpp230
-rw-r--r--boost/spirit/home/qi/stream/detail/match_manip_auto.hpp63
-rw-r--r--boost/spirit/home/qi/stream/match_manip.hpp123
-rw-r--r--boost/spirit/home/qi/stream/match_manip_attr.hpp133
-rw-r--r--boost/spirit/home/qi/stream/stream.hpp113
-rw-r--r--boost/spirit/home/qi/string.hpp17
-rw-r--r--boost/spirit/home/qi/string/detail/tst.hpp213
-rw-r--r--boost/spirit/home/qi/string/lit.hpp312
-rw-r--r--boost/spirit/home/qi/string/symbols.hpp431
-rw-r--r--boost/spirit/home/qi/string/tst.hpp137
-rw-r--r--boost/spirit/home/qi/string/tst_map.hpp216
-rw-r--r--boost/spirit/home/qi/what.hpp33
-rw-r--r--boost/spirit/home/support.hpp34
-rw-r--r--boost/spirit/home/support/action_dispatch.hpp217
-rw-r--r--boost/spirit/home/support/adapt_adt_attributes.hpp406
-rw-r--r--boost/spirit/home/support/algorithm/any.hpp76
-rw-r--r--boost/spirit/home/support/algorithm/any_if.hpp220
-rw-r--r--boost/spirit/home/support/algorithm/any_if_ns.hpp91
-rw-r--r--boost/spirit/home/support/algorithm/any_ns.hpp102
-rw-r--r--boost/spirit/home/support/argument.hpp217
-rw-r--r--boost/spirit/home/support/argument_expression.hpp132
-rw-r--r--boost/spirit/home/support/assert_msg.hpp31
-rw-r--r--boost/spirit/home/support/attributes.hpp1358
-rw-r--r--boost/spirit/home/support/attributes_fwd.hpp297
-rw-r--r--boost/spirit/home/support/auto/meta_create.hpp212
-rw-r--r--boost/spirit/home/support/auxiliary/attr_cast.hpp47
-rw-r--r--boost/spirit/home/support/char_class.hpp797
-rw-r--r--boost/spirit/home/support/char_encoding/ascii.hpp313
-rw-r--r--boost/spirit/home/support/char_encoding/iso8859_1.hpp711
-rw-r--r--boost/spirit/home/support/char_encoding/standard.hpp137
-rw-r--r--boost/spirit/home/support/char_encoding/standard_wide.hpp182
-rw-r--r--boost/spirit/home/support/char_encoding/unicode.hpp339
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/DerivedCoreProperties.txt9247
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/PropList.txt1303
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/Scripts.txt1976
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/UnicodeData.txt19336
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/category_table.hpp2216
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/create_tables.cpp583
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/lowercase_table.hpp620
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/query.hpp305
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/script_table.hpp2159
-rw-r--r--boost/spirit/home/support/char_encoding/unicode/uppercase_table.hpp639
-rw-r--r--boost/spirit/home/support/char_set/basic_chset.hpp249
-rw-r--r--boost/spirit/home/support/char_set/range.hpp32
-rw-r--r--boost/spirit/home/support/char_set/range_functions.hpp98
-rw-r--r--boost/spirit/home/support/char_set/range_run.hpp56
-rw-r--r--boost/spirit/home/support/char_set/range_run_impl.hpp189
-rw-r--r--boost/spirit/home/support/common_terminals.hpp437
-rw-r--r--boost/spirit/home/support/container.hpp575
-rw-r--r--boost/spirit/home/support/context.hpp299
-rw-r--r--boost/spirit/home/support/detail/as_variant.hpp104
-rw-r--r--boost/spirit/home/support/detail/endian.hpp29
-rw-r--r--boost/spirit/home/support/detail/endian/cover_operators.hpp115
-rw-r--r--boost/spirit/home/support/detail/endian/endian.hpp568
-rw-r--r--boost/spirit/home/support/detail/get_encoding.hpp75
-rw-r--r--boost/spirit/home/support/detail/hold_any.hpp459
-rw-r--r--boost/spirit/home/support/detail/is_spirit_tag.hpp20
-rw-r--r--boost/spirit/home/support/detail/lexer/char_traits.hpp54
-rw-r--r--boost/spirit/home/support/detail/lexer/consts.hpp39
-rw-r--r--boost/spirit/home/support/detail/lexer/containers/ptr_list.hpp71
-rw-r--r--boost/spirit/home/support/detail/lexer/containers/ptr_vector.hpp108
-rw-r--r--boost/spirit/home/support/detail/lexer/conversion/char_state_machine.hpp77
-rw-r--r--boost/spirit/home/support/detail/lexer/debug.hpp285
-rw-r--r--boost/spirit/home/support/detail/lexer/file_input.hpp483
-rw-r--r--boost/spirit/home/support/detail/lexer/generate_cpp.hpp577
-rw-r--r--boost/spirit/home/support/detail/lexer/generate_re2c.hpp444
-rw-r--r--boost/spirit/home/support/detail/lexer/generator.hpp858
-rw-r--r--boost/spirit/home/support/detail/lexer/input.hpp537
-rw-r--r--boost/spirit/home/support/detail/lexer/internals.hpp60
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/parser.hpp511
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tokeniser/num_token.hpp146
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser.hpp574
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_helper.hpp549
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_state.hpp98
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tree/end_node.hpp90
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tree/iteration_node.hpp90
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tree/leaf_node.hpp107
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tree/node.hpp188
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tree/selection_node.hpp94
-rw-r--r--boost/spirit/home/support/detail/lexer/parser/tree/sequence_node.hpp112
-rw-r--r--boost/spirit/home/support/detail/lexer/partition/charset.hpp81
-rw-r--r--boost/spirit/home/support/detail/lexer/partition/equivset.hpp140
-rw-r--r--boost/spirit/home/support/detail/lexer/rules.hpp806
-rw-r--r--boost/spirit/home/support/detail/lexer/runtime_error.hpp26
-rw-r--r--boost/spirit/home/support/detail/lexer/serialise.hpp35
-rw-r--r--boost/spirit/home/support/detail/lexer/size_t.hpp21
-rw-r--r--boost/spirit/home/support/detail/lexer/state_machine.hpp439
-rw-r--r--boost/spirit/home/support/detail/lexer/string_token.hpp413
-rw-r--r--boost/spirit/home/support/detail/make_cons.hpp86
-rw-r--r--boost/spirit/home/support/detail/make_vector.hpp114
-rw-r--r--boost/spirit/home/support/detail/math/detail/fp_traits.hpp583
-rw-r--r--boost/spirit/home/support/detail/math/fpclassify.hpp235
-rw-r--r--boost/spirit/home/support/detail/math/signbit.hpp92
-rw-r--r--boost/spirit/home/support/detail/pow10.hpp113
-rw-r--r--boost/spirit/home/support/detail/scoped_enum_emulation.hpp28
-rw-r--r--boost/spirit/home/support/detail/sign.hpp71
-rw-r--r--boost/spirit/home/support/detail/what_function.hpp48
-rw-r--r--boost/spirit/home/support/extended_variant.hpp115
-rw-r--r--boost/spirit/home/support/handles_container.hpp55
-rw-r--r--boost/spirit/home/support/has_semantic_action.hpp47
-rw-r--r--boost/spirit/home/support/info.hpp159
-rw-r--r--boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp90
-rw-r--r--boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp130
-rw-r--r--boost/spirit/home/support/iterators/detail/combine_policies.hpp558
-rw-r--r--boost/spirit/home/support/iterators/detail/first_owner_policy.hpp62
-rw-r--r--boost/spirit/home/support/iterators/detail/fixed_size_queue.hpp392
-rw-r--r--boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp128
-rw-r--r--boost/spirit/home/support/iterators/detail/functor_input_policy.hpp114
-rw-r--r--boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp111
-rw-r--r--boost/spirit/home/support/iterators/detail/istream_policy.hpp124
-rw-r--r--boost/spirit/home/support/iterators/detail/lex_input_policy.hpp86
-rw-r--r--boost/spirit/home/support/iterators/detail/multi_pass.hpp132
-rw-r--r--boost/spirit/home/support/iterators/detail/no_check_policy.hpp31
-rw-r--r--boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp79
-rw-r--r--boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp201
-rw-r--r--boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp170
-rw-r--r--boost/spirit/home/support/iterators/istream_iterator.hpp80
-rw-r--r--boost/spirit/home/support/iterators/line_pos_iterator.hpp180
-rw-r--r--boost/spirit/home/support/iterators/look_ahead.hpp69
-rw-r--r--boost/spirit/home/support/iterators/multi_pass.hpp252
-rw-r--r--boost/spirit/home/support/iterators/multi_pass_fwd.hpp91
-rw-r--r--boost/spirit/home/support/iterators/ostream_iterator.hpp16
-rw-r--r--boost/spirit/home/support/lazy.hpp41
-rw-r--r--boost/spirit/home/support/limits.hpp35
-rw-r--r--boost/spirit/home/support/make_component.hpp474
-rw-r--r--boost/spirit/home/support/meta_compiler.hpp320
-rw-r--r--boost/spirit/home/support/modify.hpp124
-rw-r--r--boost/spirit/home/support/multi_pass.hpp39
-rw-r--r--boost/spirit/home/support/multi_pass_wrapper.hpp52
-rw-r--r--boost/spirit/home/support/nonterminal/expand_arg.hpp88
-rw-r--r--boost/spirit/home/support/nonterminal/extract_param.hpp123
-rw-r--r--boost/spirit/home/support/nonterminal/locals.hpp54
-rw-r--r--boost/spirit/home/support/numeric_traits.hpp118
-rw-r--r--boost/spirit/home/support/sequence_base_id.hpp39
-rw-r--r--boost/spirit/home/support/string_traits.hpp358
-rw-r--r--boost/spirit/home/support/terminal.hpp655
-rw-r--r--boost/spirit/home/support/terminal_expression.hpp75
-rw-r--r--boost/spirit/home/support/unused.hpp105
-rw-r--r--boost/spirit/home/support/utf8.hpp72
-rw-r--r--boost/spirit/home/support/utree.hpp20
-rw-r--r--boost/spirit/home/support/utree/detail/utree_detail1.hpp146
-rw-r--r--boost/spirit/home/support/utree/detail/utree_detail2.hpp1632
-rw-r--r--boost/spirit/home/support/utree/operators.hpp704
-rw-r--r--boost/spirit/home/support/utree/utree.hpp642
-rw-r--r--boost/spirit/home/support/utree/utree_traits.hpp1294
-rw-r--r--boost/spirit/home/support/utree/utree_traits_fwd.hpp24
-rw-r--r--boost/spirit/include/classic.hpp12
-rw-r--r--boost/spirit/include/classic_actions.hpp12
-rw-r--r--boost/spirit/include/classic_actor.hpp12
-rw-r--r--boost/spirit/include/classic_alternative.hpp12
-rw-r--r--boost/spirit/include/classic_as_parser.hpp12
-rw-r--r--boost/spirit/include/classic_assert.hpp12
-rw-r--r--boost/spirit/include/classic_assign_actor.hpp12
-rw-r--r--boost/spirit/include/classic_assign_key_actor.hpp12
-rw-r--r--boost/spirit/include/classic_ast.hpp12
-rw-r--r--boost/spirit/include/classic_ast_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_attribute.hpp12
-rw-r--r--boost/spirit/include/classic_basic_chset.hpp12
-rw-r--r--boost/spirit/include/classic_chset.hpp12
-rw-r--r--boost/spirit/include/classic_chset_operators.hpp12
-rw-r--r--boost/spirit/include/classic_clear_actor.hpp12
-rw-r--r--boost/spirit/include/classic_closure.hpp12
-rw-r--r--boost/spirit/include/classic_closure_context.hpp12
-rw-r--r--boost/spirit/include/classic_closure_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_common.hpp12
-rw-r--r--boost/spirit/include/classic_common_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_composite.hpp12
-rw-r--r--boost/spirit/include/classic_config.hpp12
-rw-r--r--boost/spirit/include/classic_confix.hpp12
-rw-r--r--boost/spirit/include/classic_confix_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_core.hpp12
-rw-r--r--boost/spirit/include/classic_debug.hpp12
-rw-r--r--boost/spirit/include/classic_debug_node.hpp12
-rw-r--r--boost/spirit/include/classic_decrement_actor.hpp12
-rw-r--r--boost/spirit/include/classic_difference.hpp12
-rw-r--r--boost/spirit/include/classic_directives.hpp12
-rw-r--r--boost/spirit/include/classic_distinct.hpp12
-rw-r--r--boost/spirit/include/classic_distinct_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_dynamic.hpp12
-rw-r--r--boost/spirit/include/classic_epsilon.hpp12
-rw-r--r--boost/spirit/include/classic_erase_actor.hpp12
-rw-r--r--boost/spirit/include/classic_error_handling.hpp12
-rw-r--r--boost/spirit/include/classic_escape_char.hpp12
-rw-r--r--boost/spirit/include/classic_escape_char_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_exceptions.hpp12
-rw-r--r--boost/spirit/include/classic_exceptions_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_exclusive_or.hpp12
-rw-r--r--boost/spirit/include/classic_file_iterator.hpp12
-rw-r--r--boost/spirit/include/classic_file_iterator_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_fixed_size_queue.hpp12
-rw-r--r--boost/spirit/include/classic_flush_multi_pass.hpp12
-rw-r--r--boost/spirit/include/classic_for.hpp12
-rw-r--r--boost/spirit/include/classic_functor_parser.hpp12
-rw-r--r--boost/spirit/include/classic_fundamental.hpp12
-rw-r--r--boost/spirit/include/classic_grammar.hpp12
-rw-r--r--boost/spirit/include/classic_grammar_def.hpp12
-rw-r--r--boost/spirit/include/classic_grammar_def_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_if.hpp12
-rw-r--r--boost/spirit/include/classic_increment_actor.hpp12
-rw-r--r--boost/spirit/include/classic_insert_at_actor.hpp12
-rw-r--r--boost/spirit/include/classic_insert_key_actor.hpp12
-rw-r--r--boost/spirit/include/classic_intersection.hpp12
-rw-r--r--boost/spirit/include/classic_iterator.hpp12
-rw-r--r--boost/spirit/include/classic_kleene_star.hpp12
-rw-r--r--boost/spirit/include/classic_lazy.hpp12
-rw-r--r--boost/spirit/include/classic_list.hpp12
-rw-r--r--boost/spirit/include/classic_lists.hpp12
-rw-r--r--boost/spirit/include/classic_lists_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_loops.hpp12
-rw-r--r--boost/spirit/include/classic_match.hpp12
-rw-r--r--boost/spirit/include/classic_meta.hpp12
-rw-r--r--boost/spirit/include/classic_minimal.hpp12
-rw-r--r--boost/spirit/include/classic_multi_pass.hpp12
-rw-r--r--boost/spirit/include/classic_multi_pass_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_nil.hpp12
-rw-r--r--boost/spirit/include/classic_no_actions.hpp12
-rw-r--r--boost/spirit/include/classic_numerics.hpp12
-rw-r--r--boost/spirit/include/classic_numerics_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_operators.hpp12
-rw-r--r--boost/spirit/include/classic_optional.hpp12
-rw-r--r--boost/spirit/include/classic_parametric.hpp12
-rw-r--r--boost/spirit/include/classic_parse_tree.hpp12
-rw-r--r--boost/spirit/include/classic_parse_tree_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_parse_tree_utils.hpp12
-rw-r--r--boost/spirit/include/classic_parser.hpp12
-rw-r--r--boost/spirit/include/classic_parser_context.hpp12
-rw-r--r--boost/spirit/include/classic_parser_id.hpp12
-rw-r--r--boost/spirit/include/classic_parser_names.hpp12
-rw-r--r--boost/spirit/include/classic_parser_traits.hpp12
-rw-r--r--boost/spirit/include/classic_position_iterator.hpp12
-rw-r--r--boost/spirit/include/classic_position_iterator_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_positive.hpp12
-rw-r--r--boost/spirit/include/classic_primitives.hpp12
-rw-r--r--boost/spirit/include/classic_push_back_actor.hpp12
-rw-r--r--boost/spirit/include/classic_push_front_actor.hpp12
-rw-r--r--boost/spirit/include/classic_range_run.hpp12
-rw-r--r--boost/spirit/include/classic_ref_actor.hpp12
-rw-r--r--boost/spirit/include/classic_ref_const_ref_actor.hpp12
-rw-r--r--boost/spirit/include/classic_ref_const_ref_const_ref_a.hpp12
-rw-r--r--boost/spirit/include/classic_ref_const_ref_value_actor.hpp12
-rw-r--r--boost/spirit/include/classic_ref_value_actor.hpp12
-rw-r--r--boost/spirit/include/classic_refactoring.hpp12
-rw-r--r--boost/spirit/include/classic_regex.hpp12
-rw-r--r--boost/spirit/include/classic_rule.hpp12
-rw-r--r--boost/spirit/include/classic_rule_alias.hpp12
-rw-r--r--boost/spirit/include/classic_rule_parser.hpp12
-rw-r--r--boost/spirit/include/classic_safe_bool.hpp12
-rw-r--r--boost/spirit/include/classic_scanner.hpp12
-rw-r--r--boost/spirit/include/classic_scanner_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_scoped_lock.hpp12
-rw-r--r--boost/spirit/include/classic_select.hpp12
-rw-r--r--boost/spirit/include/classic_sequence.hpp12
-rw-r--r--boost/spirit/include/classic_sequential_and.hpp12
-rw-r--r--boost/spirit/include/classic_sequential_or.hpp12
-rw-r--r--boost/spirit/include/classic_skipper.hpp12
-rw-r--r--boost/spirit/include/classic_skipper_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_spirit.hpp13
-rw-r--r--boost/spirit/include/classic_static.hpp12
-rw-r--r--boost/spirit/include/classic_stored_rule.hpp12
-rw-r--r--boost/spirit/include/classic_stored_rule_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_subrule.hpp12
-rw-r--r--boost/spirit/include/classic_subrule_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_swap_actor.hpp12
-rw-r--r--boost/spirit/include/classic_switch.hpp12
-rw-r--r--boost/spirit/include/classic_symbols.hpp12
-rw-r--r--boost/spirit/include/classic_symbols_fwd.hpp12
-rw-r--r--boost/spirit/include/classic_traverse.hpp12
-rw-r--r--boost/spirit/include/classic_tree_to_xml.hpp12
-rw-r--r--boost/spirit/include/classic_typeof.hpp12
-rw-r--r--boost/spirit/include/classic_utility.hpp12
-rw-r--r--boost/spirit/include/classic_version.hpp12
-rw-r--r--boost/spirit/include/classic_while.hpp12
-rw-r--r--boost/spirit/include/karma.hpp18
-rw-r--r--boost/spirit/include/karma_action.hpp18
-rw-r--r--boost/spirit/include/karma_alternative.hpp18
-rw-r--r--boost/spirit/include/karma_and_predicate.hpp18
-rw-r--r--boost/spirit/include/karma_as.hpp19
-rw-r--r--boost/spirit/include/karma_attr_cast.hpp18
-rw-r--r--boost/spirit/include/karma_auto.hpp18
-rw-r--r--boost/spirit/include/karma_auxiliary.hpp18
-rw-r--r--boost/spirit/include/karma_binary.hpp18
-rw-r--r--boost/spirit/include/karma_bool.hpp18
-rw-r--r--boost/spirit/include/karma_buffer.hpp18
-rw-r--r--boost/spirit/include/karma_center_alignment.hpp18
-rw-r--r--boost/spirit/include/karma_char.hpp18
-rw-r--r--boost/spirit/include/karma_char_.hpp18
-rw-r--r--boost/spirit/include/karma_char_class.hpp18
-rw-r--r--boost/spirit/include/karma_columns.hpp18
-rw-r--r--boost/spirit/include/karma_delimit.hpp18
-rw-r--r--boost/spirit/include/karma_directive.hpp18
-rw-r--r--boost/spirit/include/karma_domain.hpp18
-rw-r--r--boost/spirit/include/karma_duplicate.hpp18
-rw-r--r--boost/spirit/include/karma_eol.hpp18
-rw-r--r--boost/spirit/include/karma_eps.hpp18
-rw-r--r--boost/spirit/include/karma_format.hpp18
-rw-r--r--boost/spirit/include/karma_format_attr.hpp18
-rw-r--r--boost/spirit/include/karma_format_auto.hpp18
-rw-r--r--boost/spirit/include/karma_generate.hpp18
-rw-r--r--boost/spirit/include/karma_generate_attr.hpp18
-rw-r--r--boost/spirit/include/karma_generate_auto.hpp19
-rw-r--r--boost/spirit/include/karma_grammar.hpp18
-rw-r--r--boost/spirit/include/karma_int.hpp18
-rw-r--r--boost/spirit/include/karma_kleene.hpp18
-rw-r--r--boost/spirit/include/karma_lazy.hpp18
-rw-r--r--boost/spirit/include/karma_left_alignment.hpp18
-rw-r--r--boost/spirit/include/karma_list.hpp18
-rw-r--r--boost/spirit/include/karma_maxwidth.hpp18
-rw-r--r--boost/spirit/include/karma_no_delimit.hpp18
-rw-r--r--boost/spirit/include/karma_nonterminal.hpp18
-rw-r--r--boost/spirit/include/karma_not_predicate.hpp18
-rw-r--r--boost/spirit/include/karma_numeric.hpp18
-rw-r--r--boost/spirit/include/karma_omit.hpp18
-rw-r--r--boost/spirit/include/karma_operator.hpp18
-rw-r--r--boost/spirit/include/karma_optional.hpp18
-rw-r--r--boost/spirit/include/karma_phoenix_attributes.hpp18
-rw-r--r--boost/spirit/include/karma_plus.hpp18
-rw-r--r--boost/spirit/include/karma_real.hpp18
-rw-r--r--boost/spirit/include/karma_repeat.hpp18
-rw-r--r--boost/spirit/include/karma_right_alignment.hpp18
-rw-r--r--boost/spirit/include/karma_rule.hpp18
-rw-r--r--boost/spirit/include/karma_sequence.hpp18
-rw-r--r--boost/spirit/include/karma_stream.hpp18
-rw-r--r--boost/spirit/include/karma_strict_relaxed.hpp18
-rw-r--r--boost/spirit/include/karma_string.hpp18
-rw-r--r--boost/spirit/include/karma_symbols.hpp18
-rw-r--r--boost/spirit/include/karma_uint.hpp18
-rw-r--r--boost/spirit/include/karma_upper_lower_case.hpp18
-rw-r--r--boost/spirit/include/karma_verbatim.hpp18
-rw-r--r--boost/spirit/include/karma_what.hpp18
-rw-r--r--boost/spirit/include/lex.hpp18
-rw-r--r--boost/spirit/include/lex_char_token_def.hpp18
-rw-r--r--boost/spirit/include/lex_domain.hpp18
-rw-r--r--boost/spirit/include/lex_generate_static_lexertl.hpp18
-rw-r--r--boost/spirit/include/lex_lexer.hpp18
-rw-r--r--boost/spirit/include/lex_lexertl.hpp18
-rw-r--r--boost/spirit/include/lex_lexertl_position_token.hpp18
-rw-r--r--boost/spirit/include/lex_lexertl_token.hpp18
-rw-r--r--boost/spirit/include/lex_plain_token.hpp18
-rw-r--r--boost/spirit/include/lex_primitives.hpp18
-rw-r--r--boost/spirit/include/lex_static_lexertl.hpp18
-rw-r--r--boost/spirit/include/lex_tokenize_and_parse.hpp18
-rw-r--r--boost/spirit/include/lex_tokenize_and_parse_attr.hpp18
-rw-r--r--boost/spirit/include/phoenix.hpp18
-rw-r--r--boost/spirit/include/phoenix1.hpp12
-rw-r--r--boost/spirit/include/phoenix1_actor.hpp12
-rw-r--r--boost/spirit/include/phoenix1_binders.hpp12
-rw-r--r--boost/spirit/include/phoenix1_casts.hpp12
-rw-r--r--boost/spirit/include/phoenix1_closures.hpp12
-rw-r--r--boost/spirit/include/phoenix1_composite.hpp12
-rw-r--r--boost/spirit/include/phoenix1_functions.hpp12
-rw-r--r--boost/spirit/include/phoenix1_new.hpp12
-rw-r--r--boost/spirit/include/phoenix1_operators.hpp12
-rw-r--r--boost/spirit/include/phoenix1_primitives.hpp12
-rw-r--r--boost/spirit/include/phoenix1_special_ops.hpp12
-rw-r--r--boost/spirit/include/phoenix1_statements.hpp12
-rw-r--r--boost/spirit/include/phoenix1_tuple_helpers.hpp12
-rw-r--r--boost/spirit/include/phoenix1_tuples.hpp12
-rw-r--r--boost/spirit/include/phoenix_algorithm.hpp18
-rw-r--r--boost/spirit/include/phoenix_bind.hpp18
-rw-r--r--boost/spirit/include/phoenix_container.hpp18
-rw-r--r--boost/spirit/include/phoenix_core.hpp19
-rw-r--r--boost/spirit/include/phoenix_function.hpp18
-rw-r--r--boost/spirit/include/phoenix_fusion.hpp18
-rw-r--r--boost/spirit/include/phoenix_limits.hpp16
-rw-r--r--boost/spirit/include/phoenix_object.hpp18
-rw-r--r--boost/spirit/include/phoenix_operator.hpp18
-rw-r--r--boost/spirit/include/phoenix_scope.hpp18
-rw-r--r--boost/spirit/include/phoenix_statement.hpp18
-rw-r--r--boost/spirit/include/phoenix_stl.hpp18
-rw-r--r--boost/spirit/include/phoenix_version.hpp12
-rw-r--r--boost/spirit/include/qi.hpp18
-rw-r--r--boost/spirit/include/qi_action.hpp18
-rw-r--r--boost/spirit/include/qi_alternative.hpp18
-rw-r--r--boost/spirit/include/qi_and_predicate.hpp18
-rw-r--r--boost/spirit/include/qi_as.hpp19
-rw-r--r--boost/spirit/include/qi_as_string.hpp18
-rw-r--r--boost/spirit/include/qi_attr.hpp18
-rw-r--r--boost/spirit/include/qi_attr_cast.hpp18
-rw-r--r--boost/spirit/include/qi_auto.hpp18
-rw-r--r--boost/spirit/include/qi_auxiliary.hpp18
-rw-r--r--boost/spirit/include/qi_binary.hpp18
-rw-r--r--boost/spirit/include/qi_bool.hpp18
-rw-r--r--boost/spirit/include/qi_char.hpp18
-rw-r--r--boost/spirit/include/qi_char_.hpp18
-rw-r--r--boost/spirit/include/qi_char_class.hpp18
-rw-r--r--boost/spirit/include/qi_core.hpp27
-rw-r--r--boost/spirit/include/qi_difference.hpp18
-rw-r--r--boost/spirit/include/qi_directive.hpp18
-rw-r--r--boost/spirit/include/qi_domain.hpp18
-rw-r--r--boost/spirit/include/qi_eoi.hpp18
-rw-r--r--boost/spirit/include/qi_eol.hpp18
-rw-r--r--boost/spirit/include/qi_eps.hpp18
-rw-r--r--boost/spirit/include/qi_expect.hpp18
-rw-r--r--boost/spirit/include/qi_grammar.hpp18
-rw-r--r--boost/spirit/include/qi_hold.hpp18
-rw-r--r--boost/spirit/include/qi_int.hpp18
-rw-r--r--boost/spirit/include/qi_kleene.hpp18
-rw-r--r--boost/spirit/include/qi_lazy.hpp18
-rw-r--r--boost/spirit/include/qi_lexeme.hpp18
-rw-r--r--boost/spirit/include/qi_list.hpp18
-rw-r--r--boost/spirit/include/qi_lit.hpp18
-rw-r--r--boost/spirit/include/qi_match.hpp18
-rw-r--r--boost/spirit/include/qi_match_attr.hpp18
-rw-r--r--boost/spirit/include/qi_match_auto.hpp18
-rw-r--r--boost/spirit/include/qi_matches.hpp18
-rw-r--r--boost/spirit/include/qi_no_case.hpp18
-rw-r--r--boost/spirit/include/qi_no_skip.hpp18
-rw-r--r--boost/spirit/include/qi_nonterminal.hpp18
-rw-r--r--boost/spirit/include/qi_not_predicate.hpp18
-rw-r--r--boost/spirit/include/qi_numeric.hpp18
-rw-r--r--boost/spirit/include/qi_omit.hpp18
-rw-r--r--boost/spirit/include/qi_operator.hpp18
-rw-r--r--boost/spirit/include/qi_optional.hpp18
-rw-r--r--boost/spirit/include/qi_parse.hpp18
-rw-r--r--boost/spirit/include/qi_parse_attr.hpp12
-rw-r--r--boost/spirit/include/qi_parse_auto.hpp19
-rw-r--r--boost/spirit/include/qi_permutation.hpp18
-rw-r--r--boost/spirit/include/qi_plus.hpp18
-rw-r--r--boost/spirit/include/qi_raw.hpp18
-rw-r--r--boost/spirit/include/qi_real.hpp18
-rw-r--r--boost/spirit/include/qi_repeat.hpp18
-rw-r--r--boost/spirit/include/qi_rule.hpp18
-rw-r--r--boost/spirit/include/qi_sequence.hpp18
-rw-r--r--boost/spirit/include/qi_sequential_or.hpp18
-rw-r--r--boost/spirit/include/qi_skip.hpp18
-rw-r--r--boost/spirit/include/qi_stream.hpp18
-rw-r--r--boost/spirit/include/qi_string.hpp18
-rw-r--r--boost/spirit/include/qi_symbols.hpp18
-rw-r--r--boost/spirit/include/qi_uint.hpp18
-rw-r--r--boost/spirit/include/qi_what.hpp18
-rw-r--r--boost/spirit/include/support.hpp18
-rw-r--r--boost/spirit/include/support_adapt_adt_attributes.hpp18
-rw-r--r--boost/spirit/include/support_any.hpp18
-rw-r--r--boost/spirit/include/support_any_if.hpp18
-rw-r--r--boost/spirit/include/support_any_if_ns.hpp18
-rw-r--r--boost/spirit/include/support_any_ns.hpp18
-rw-r--r--boost/spirit/include/support_argument.hpp18
-rw-r--r--boost/spirit/include/support_ascii.hpp18
-rw-r--r--boost/spirit/include/support_attributes.hpp18
-rw-r--r--boost/spirit/include/support_attributes_fwd.hpp18
-rw-r--r--boost/spirit/include/support_char_class.hpp18
-rw-r--r--boost/spirit/include/support_container.hpp18
-rw-r--r--boost/spirit/include/support_extended_variant.hpp18
-rw-r--r--boost/spirit/include/support_info.hpp17
-rw-r--r--boost/spirit/include/support_iso8859_1.hpp18
-rw-r--r--boost/spirit/include/support_istream_iterator.hpp18
-rw-r--r--boost/spirit/include/support_line_pos_iterator.hpp19
-rw-r--r--boost/spirit/include/support_locals.hpp18
-rw-r--r--boost/spirit/include/support_look_ahead.hpp18
-rw-r--r--boost/spirit/include/support_modify.hpp18
-rw-r--r--boost/spirit/include/support_multi_pass.hpp18
-rw-r--r--boost/spirit/include/support_multi_pass_fwd.hpp18
-rw-r--r--boost/spirit/include/support_ostream_iterator.hpp18
-rw-r--r--boost/spirit/include/support_standard.hpp18
-rw-r--r--boost/spirit/include/support_standard_wide.hpp18
-rw-r--r--boost/spirit/include/support_string_traits.hpp18
-rw-r--r--boost/spirit/include/support_unused.hpp18
-rw-r--r--boost/spirit/include/support_utree.hpp18
-rw-r--r--boost/spirit/include/version.hpp20
-rw-r--r--boost/spirit/iterator.hpp27
-rw-r--r--boost/spirit/iterator/file_iterator.hpp27
-rw-r--r--boost/spirit/iterator/file_iterator_fwd.hpp27
-rw-r--r--boost/spirit/iterator/fixed_size_queue.hpp27
-rw-r--r--boost/spirit/iterator/multi_pass.hpp27
-rw-r--r--boost/spirit/iterator/multi_pass_fwd.hpp27
-rw-r--r--boost/spirit/iterator/position_iterator.hpp27
-rw-r--r--boost/spirit/iterator/position_iterator_fwd.hpp27
-rw-r--r--boost/spirit/iterator/typeof.hpp27
-rw-r--r--boost/spirit/meta.hpp27
-rw-r--r--boost/spirit/meta/as_parser.hpp27
-rw-r--r--boost/spirit/meta/fundamental.hpp27
-rw-r--r--boost/spirit/meta/parser_traits.hpp27
-rw-r--r--boost/spirit/meta/refactoring.hpp27
-rw-r--r--boost/spirit/meta/traverse.hpp27
-rw-r--r--boost/spirit/phoenix.hpp27
-rw-r--r--boost/spirit/phoenix/actor.hpp24
-rw-r--r--boost/spirit/phoenix/binders.hpp24
-rw-r--r--boost/spirit/phoenix/casts.hpp24
-rw-r--r--boost/spirit/phoenix/closures.hpp24
-rw-r--r--boost/spirit/phoenix/composite.hpp24
-rw-r--r--boost/spirit/phoenix/functions.hpp24
-rw-r--r--boost/spirit/phoenix/new.hpp24
-rw-r--r--boost/spirit/phoenix/operators.hpp24
-rw-r--r--boost/spirit/phoenix/primitives.hpp24
-rw-r--r--boost/spirit/phoenix/special_ops.hpp24
-rw-r--r--boost/spirit/phoenix/statements.hpp24
-rw-r--r--boost/spirit/phoenix/tuple_helpers.hpp24
-rw-r--r--boost/spirit/phoenix/tuples.hpp24
-rw-r--r--boost/spirit/repository/home/karma.hpp18
-rw-r--r--boost/spirit/repository/home/karma/directive.hpp17
-rw-r--r--boost/spirit/repository/home/karma/directive/confix.hpp140
-rw-r--r--boost/spirit/repository/home/karma/nonterminal.hpp18
-rw-r--r--boost/spirit/repository/home/karma/nonterminal/subrule.hpp560
-rw-r--r--boost/spirit/repository/home/qi.hpp20
-rw-r--r--boost/spirit/repository/home/qi/directive.hpp20
-rw-r--r--boost/spirit/repository/home/qi/directive/confix.hpp150
-rw-r--r--boost/spirit/repository/home/qi/directive/distinct.hpp143
-rw-r--r--boost/spirit/repository/home/qi/directive/kwd.hpp588
-rw-r--r--boost/spirit/repository/home/qi/directive/seek.hpp134
-rw-r--r--boost/spirit/repository/home/qi/nonterminal.hpp18
-rw-r--r--boost/spirit/repository/home/qi/nonterminal/subrule.hpp586
-rw-r--r--boost/spirit/repository/home/qi/operator.hpp17
-rw-r--r--boost/spirit/repository/home/qi/operator/detail/keywords.hpp117
-rw-r--r--boost/spirit/repository/home/qi/operator/keywords.hpp640
-rw-r--r--boost/spirit/repository/home/qi/primitive.hpp19
-rw-r--r--boost/spirit/repository/home/qi/primitive/advance.hpp130
-rw-r--r--boost/spirit/repository/home/qi/primitive/flush_multi_pass.hpp92
-rw-r--r--boost/spirit/repository/home/qi/primitive/iter_pos.hpp83
-rw-r--r--boost/spirit/repository/home/support/confix.hpp22
-rw-r--r--boost/spirit/repository/home/support/distinct.hpp22
-rw-r--r--boost/spirit/repository/home/support/flush_multi_pass.hpp22
-rw-r--r--boost/spirit/repository/home/support/kwd.hpp22
-rw-r--r--boost/spirit/repository/home/support/seek.hpp25
-rw-r--r--boost/spirit/repository/home/support/subrule_context.hpp57
-rw-r--r--boost/spirit/repository/include/karma.hpp18
-rw-r--r--boost/spirit/repository/include/karma_confix.hpp18
-rw-r--r--boost/spirit/repository/include/karma_directive.hpp18
-rw-r--r--boost/spirit/repository/include/karma_nonterminal.hpp19
-rw-r--r--boost/spirit/repository/include/karma_subrule.hpp19
-rw-r--r--boost/spirit/repository/include/qi.hpp18
-rw-r--r--boost/spirit/repository/include/qi_advance.hpp17
-rw-r--r--boost/spirit/repository/include/qi_confix.hpp18
-rw-r--r--boost/spirit/repository/include/qi_directive.hpp18
-rw-r--r--boost/spirit/repository/include/qi_distinct.hpp18
-rw-r--r--boost/spirit/repository/include/qi_flush_multi_pass.hpp18
-rw-r--r--boost/spirit/repository/include/qi_iter_pos.hpp18
-rw-r--r--boost/spirit/repository/include/qi_keywords.hpp19
-rw-r--r--boost/spirit/repository/include/qi_kwd.hpp38
-rw-r--r--boost/spirit/repository/include/qi_nonterminal.hpp19
-rw-r--r--boost/spirit/repository/include/qi_primitive.hpp18
-rw-r--r--boost/spirit/repository/include/qi_seek.hpp16
-rw-r--r--boost/spirit/repository/include/qi_subrule.hpp19
-rw-r--r--boost/spirit/symbols.hpp27
-rw-r--r--boost/spirit/symbols/symbols.hpp27
-rw-r--r--boost/spirit/symbols/symbols_fwd.hpp27
-rw-r--r--boost/spirit/symbols/typeof.hpp27
-rw-r--r--boost/spirit/tree/ast.hpp27
-rw-r--r--boost/spirit/tree/ast_fwd.hpp27
-rw-r--r--boost/spirit/tree/common.hpp27
-rw-r--r--boost/spirit/tree/common_fwd.hpp27
-rw-r--r--boost/spirit/tree/parse_tree.hpp27
-rw-r--r--boost/spirit/tree/parse_tree_fwd.hpp27
-rw-r--r--boost/spirit/tree/parse_tree_utils.hpp27
-rw-r--r--boost/spirit/tree/parsetree.dtd21
-rw-r--r--boost/spirit/tree/tree_to_xml.hpp27
-rw-r--r--boost/spirit/tree/typeof.hpp27
-rw-r--r--boost/spirit/utility.hpp27
-rw-r--r--boost/spirit/utility/chset.hpp27
-rw-r--r--boost/spirit/utility/chset_operators.hpp27
-rw-r--r--boost/spirit/utility/confix.hpp27
-rw-r--r--boost/spirit/utility/confix_fwd.hpp27
-rw-r--r--boost/spirit/utility/distinct.hpp27
-rw-r--r--boost/spirit/utility/distinct_fwd.hpp27
-rw-r--r--boost/spirit/utility/escape_char.hpp27
-rw-r--r--boost/spirit/utility/escape_char_fwd.hpp27
-rw-r--r--boost/spirit/utility/flush_multi_pass.hpp27
-rw-r--r--boost/spirit/utility/functor_parser.hpp27
-rw-r--r--boost/spirit/utility/grammar_def.hpp27
-rw-r--r--boost/spirit/utility/grammar_def_fwd.hpp27
-rw-r--r--boost/spirit/utility/lists.hpp27
-rw-r--r--boost/spirit/utility/lists_fwd.hpp27
-rw-r--r--boost/spirit/utility/loops.hpp27
-rw-r--r--boost/spirit/utility/regex.hpp27
-rw-r--r--boost/spirit/utility/rule_parser.hpp27
-rw-r--r--boost/spirit/utility/scoped_lock.hpp27
-rw-r--r--boost/spirit/utility/typeof.hpp27
-rw-r--r--boost/spirit/version.hpp14
1208 files changed, 183829 insertions, 0 deletions
diff --git a/boost/spirit/actor.hpp b/boost/spirit/actor.hpp
new file mode 100644
index 0000000000..c46777cd03
--- /dev/null
+++ b/boost/spirit/actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/assign_actor.hpp b/boost/spirit/actor/assign_actor.hpp
new file mode 100644
index 0000000000..625887dff4
--- /dev/null
+++ b/boost/spirit/actor/assign_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ASSIGN_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ASSIGN_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_assign_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_assign_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_assign_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/assign_key_actor.hpp b/boost/spirit/actor/assign_key_actor.hpp
new file mode 100644
index 0000000000..4095d31d2c
--- /dev/null
+++ b/boost/spirit/actor/assign_key_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ASSIGN_KEY_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ASSIGN_KEY_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_assign_key_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_assign_key_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_assign_key_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/clear_actor.hpp b/boost/spirit/actor/clear_actor.hpp
new file mode 100644
index 0000000000..03a34b21c7
--- /dev/null
+++ b/boost/spirit/actor/clear_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CLEAR_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CLEAR_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_clear_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_clear_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_clear_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/decrement_actor.hpp b/boost/spirit/actor/decrement_actor.hpp
new file mode 100644
index 0000000000..4f9f99069d
--- /dev/null
+++ b/boost/spirit/actor/decrement_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_DECREMENT_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_DECREMENT_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_decrement_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_decrement_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_decrement_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/erase_actor.hpp b/boost/spirit/actor/erase_actor.hpp
new file mode 100644
index 0000000000..f2811580e0
--- /dev/null
+++ b/boost/spirit/actor/erase_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ERASE_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ERASE_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_erase_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_erase_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_erase_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/increment_actor.hpp b/boost/spirit/actor/increment_actor.hpp
new file mode 100644
index 0000000000..ef4c525e7d
--- /dev/null
+++ b/boost/spirit/actor/increment_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_INCREMENT_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_INCREMENT_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_increment_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_increment_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_increment_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/insert_at_actor.hpp b/boost/spirit/actor/insert_at_actor.hpp
new file mode 100644
index 0000000000..ae9e34dc29
--- /dev/null
+++ b/boost/spirit/actor/insert_at_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_INSERT_AT_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_INSERT_AT_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_insert_at_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_insert_at_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_insert_at_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/insert_key_actor.hpp b/boost/spirit/actor/insert_key_actor.hpp
new file mode 100644
index 0000000000..a5cb44222a
--- /dev/null
+++ b/boost/spirit/actor/insert_key_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_INSERT_KEY_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_INSERT_KEY_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_insert_key_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_insert_key_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_insert_key_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/push_back_actor.hpp b/boost/spirit/actor/push_back_actor.hpp
new file mode 100644
index 0000000000..84c6bdfba9
--- /dev/null
+++ b/boost/spirit/actor/push_back_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PUSH_BACK_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PUSH_BACK_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_push_back_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_push_back_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_push_back_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/push_front_actor.hpp b/boost/spirit/actor/push_front_actor.hpp
new file mode 100644
index 0000000000..0718ae17aa
--- /dev/null
+++ b/boost/spirit/actor/push_front_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PUSH_FRONT_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PUSH_FRONT_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_push_front_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_push_front_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_push_front_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/ref_actor.hpp b/boost/spirit/actor/ref_actor.hpp
new file mode 100644
index 0000000000..f107842310
--- /dev/null
+++ b/boost/spirit/actor/ref_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_REF_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_REF_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_ref_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_ref_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_ref_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/ref_const_ref_actor.hpp b/boost/spirit/actor/ref_const_ref_actor.hpp
new file mode 100644
index 0000000000..ea380b538f
--- /dev/null
+++ b/boost/spirit/actor/ref_const_ref_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_REF_CONST_REF_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_REF_CONST_REF_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_ref_const_ref_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_ref_const_ref_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_ref_const_ref_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/ref_const_ref_const_ref_a.hpp b/boost/spirit/actor/ref_const_ref_const_ref_a.hpp
new file mode 100644
index 0000000000..092a25239b
--- /dev/null
+++ b/boost/spirit/actor/ref_const_ref_const_ref_a.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_REF_CONST_REF_CONST_REF_A
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_REF_CONST_REF_CONST_REF_A
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_ref_const_ref_const_ref_a.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_ref_const_ref_const_ref_a.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_ref_const_ref_const_ref_a.hpp>
+
+#endif
diff --git a/boost/spirit/actor/ref_const_ref_value_actor.hpp b/boost/spirit/actor/ref_const_ref_value_actor.hpp
new file mode 100644
index 0000000000..e94a764c1f
--- /dev/null
+++ b/boost/spirit/actor/ref_const_ref_value_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_REF_CONST_REF_VALUE_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_REF_CONST_REF_VALUE_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_ref_const_ref_value_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_ref_const_ref_value_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_ref_const_ref_value_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/ref_value_actor.hpp b/boost/spirit/actor/ref_value_actor.hpp
new file mode 100644
index 0000000000..cbc8b4abae
--- /dev/null
+++ b/boost/spirit/actor/ref_value_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_REF_VALUE_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_REF_VALUE_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_ref_value_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_ref_value_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_ref_value_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/swap_actor.hpp b/boost/spirit/actor/swap_actor.hpp
new file mode 100644
index 0000000000..132060d35f
--- /dev/null
+++ b/boost/spirit/actor/swap_actor.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SWAP_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SWAP_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_swap_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_swap_actor.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_swap_actor.hpp>
+
+#endif
diff --git a/boost/spirit/actor/typeof.hpp b/boost/spirit/actor/typeof.hpp
new file mode 100644
index 0000000000..bc2335fb43
--- /dev/null
+++ b/boost/spirit/actor/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/attribute.hpp b/boost/spirit/attribute.hpp
new file mode 100644
index 0000000000..3f9f31b03e
--- /dev/null
+++ b/boost/spirit/attribute.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ATTRIBUTE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ATTRIBUTE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_attribute.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_attribute.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_attribute.hpp>
+
+#endif
diff --git a/boost/spirit/attribute/closure.hpp b/boost/spirit/attribute/closure.hpp
new file mode 100644
index 0000000000..e0c9207eff
--- /dev/null
+++ b/boost/spirit/attribute/closure.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CLOSURE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CLOSURE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_closure.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_closure.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_closure.hpp>
+
+#endif
diff --git a/boost/spirit/attribute/closure_context.hpp b/boost/spirit/attribute/closure_context.hpp
new file mode 100644
index 0000000000..266ee58663
--- /dev/null
+++ b/boost/spirit/attribute/closure_context.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CLOSURE_CONTEXT
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CLOSURE_CONTEXT
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_closure_context.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_closure_context.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_closure_context.hpp>
+
+#endif
diff --git a/boost/spirit/attribute/closure_fwd.hpp b/boost/spirit/attribute/closure_fwd.hpp
new file mode 100644
index 0000000000..e1d4e64eb4
--- /dev/null
+++ b/boost/spirit/attribute/closure_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CLOSURE_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CLOSURE_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_closure_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_closure_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_closure_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/attribute/parametric.hpp b/boost/spirit/attribute/parametric.hpp
new file mode 100644
index 0000000000..c9a26d411a
--- /dev/null
+++ b/boost/spirit/attribute/parametric.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARAMETRIC
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARAMETRIC
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parametric.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parametric.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parametric.hpp>
+
+#endif
diff --git a/boost/spirit/attribute/typeof.hpp b/boost/spirit/attribute/typeof.hpp
new file mode 100644
index 0000000000..7d9176ff82
--- /dev/null
+++ b/boost/spirit/attribute/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_ATTRIBUTE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_ATTRIBUTE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/core.hpp b/boost/spirit/core.hpp
new file mode 100644
index 0000000000..61658b33c7
--- /dev/null
+++ b/boost/spirit/core.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CORE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CORE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_core.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_core.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_core.hpp>
+
+#endif
diff --git a/boost/spirit/core/assert.hpp b/boost/spirit/core/assert.hpp
new file mode 100644
index 0000000000..cdbd306071
--- /dev/null
+++ b/boost/spirit/core/assert.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ASSERT
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ASSERT
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_assert.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_assert.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_assert.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/actions.hpp b/boost/spirit/core/composite/actions.hpp
new file mode 100644
index 0000000000..d35d5e3330
--- /dev/null
+++ b/boost/spirit/core/composite/actions.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ACTIONS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ACTIONS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_actions.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_actions.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_actions.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/alternative.hpp b/boost/spirit/core/composite/alternative.hpp
new file mode 100644
index 0000000000..7acff66ae0
--- /dev/null
+++ b/boost/spirit/core/composite/alternative.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ALTERNATIVE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ALTERNATIVE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_alternative.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_alternative.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_alternative.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/composite.hpp b/boost/spirit/core/composite/composite.hpp
new file mode 100644
index 0000000000..3ce954d3e8
--- /dev/null
+++ b/boost/spirit/core/composite/composite.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_COMPOSITE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_COMPOSITE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_composite.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_composite.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_composite.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/difference.hpp b/boost/spirit/core/composite/difference.hpp
new file mode 100644
index 0000000000..d9be5c34e4
--- /dev/null
+++ b/boost/spirit/core/composite/difference.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_DIFFERENCE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_DIFFERENCE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_difference.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_difference.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_difference.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/directives.hpp b/boost/spirit/core/composite/directives.hpp
new file mode 100644
index 0000000000..a29e744d62
--- /dev/null
+++ b/boost/spirit/core/composite/directives.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_DIRECTIVES
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_DIRECTIVES
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_directives.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_directives.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_directives.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/epsilon.hpp b/boost/spirit/core/composite/epsilon.hpp
new file mode 100644
index 0000000000..eda988f430
--- /dev/null
+++ b/boost/spirit/core/composite/epsilon.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_EPSILON
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_EPSILON
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_epsilon.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_epsilon.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_epsilon.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/exclusive_or.hpp b/boost/spirit/core/composite/exclusive_or.hpp
new file mode 100644
index 0000000000..0443e28a41
--- /dev/null
+++ b/boost/spirit/core/composite/exclusive_or.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_EXCLUSIVE_OR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_EXCLUSIVE_OR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_exclusive_or.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_exclusive_or.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_exclusive_or.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/intersection.hpp b/boost/spirit/core/composite/intersection.hpp
new file mode 100644
index 0000000000..7007c00159
--- /dev/null
+++ b/boost/spirit/core/composite/intersection.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_INTERSECTION
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_INTERSECTION
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_intersection.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_intersection.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_intersection.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/kleene_star.hpp b/boost/spirit/core/composite/kleene_star.hpp
new file mode 100644
index 0000000000..aa00bdd293
--- /dev/null
+++ b/boost/spirit/core/composite/kleene_star.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_KLEENE_STAR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_KLEENE_STAR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_kleene_star.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_kleene_star.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_kleene_star.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/list.hpp b/boost/spirit/core/composite/list.hpp
new file mode 100644
index 0000000000..b01a9dc360
--- /dev/null
+++ b/boost/spirit/core/composite/list.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_LIST
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_LIST
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_list.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_list.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_list.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/no_actions.hpp b/boost/spirit/core/composite/no_actions.hpp
new file mode 100644
index 0000000000..634a4b0a1a
--- /dev/null
+++ b/boost/spirit/core/composite/no_actions.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_NO_ACTIONS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_NO_ACTIONS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_no_actions.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_no_actions.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_no_actions.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/operators.hpp b/boost/spirit/core/composite/operators.hpp
new file mode 100644
index 0000000000..5474f2a55a
--- /dev/null
+++ b/boost/spirit/core/composite/operators.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_OPERATORS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_OPERATORS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_operators.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_operators.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_operators.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/optional.hpp b/boost/spirit/core/composite/optional.hpp
new file mode 100644
index 0000000000..3fee63ec9d
--- /dev/null
+++ b/boost/spirit/core/composite/optional.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_OPTIONAL
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_OPTIONAL
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_optional.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_optional.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_optional.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/positive.hpp b/boost/spirit/core/composite/positive.hpp
new file mode 100644
index 0000000000..846638d901
--- /dev/null
+++ b/boost/spirit/core/composite/positive.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_POSITIVE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_POSITIVE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_positive.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_positive.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_positive.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/sequence.hpp b/boost/spirit/core/composite/sequence.hpp
new file mode 100644
index 0000000000..9c23b0bfc6
--- /dev/null
+++ b/boost/spirit/core/composite/sequence.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SEQUENCE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SEQUENCE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_sequence.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_sequence.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_sequence.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/sequential_and.hpp b/boost/spirit/core/composite/sequential_and.hpp
new file mode 100644
index 0000000000..174576ad0a
--- /dev/null
+++ b/boost/spirit/core/composite/sequential_and.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SEQUENTIAL_AND
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SEQUENTIAL_AND
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_sequential_and.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_sequential_and.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_sequential_and.hpp>
+
+#endif
diff --git a/boost/spirit/core/composite/sequential_or.hpp b/boost/spirit/core/composite/sequential_or.hpp
new file mode 100644
index 0000000000..7de6326dd5
--- /dev/null
+++ b/boost/spirit/core/composite/sequential_or.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SEQUENTIAL_OR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SEQUENTIAL_OR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_sequential_or.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_sequential_or.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_sequential_or.hpp>
+
+#endif
diff --git a/boost/spirit/core/config.hpp b/boost/spirit/core/config.hpp
new file mode 100644
index 0000000000..ca038686a1
--- /dev/null
+++ b/boost/spirit/core/config.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CONFIG
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CONFIG
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_config.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_config.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_config.hpp>
+
+#endif
diff --git a/boost/spirit/core/match.hpp b/boost/spirit/core/match.hpp
new file mode 100644
index 0000000000..37b98fea0a
--- /dev/null
+++ b/boost/spirit/core/match.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_MATCH
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_MATCH
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_match.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_match.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_match.hpp>
+
+#endif
diff --git a/boost/spirit/core/nil.hpp b/boost/spirit/core/nil.hpp
new file mode 100644
index 0000000000..a62da8f655
--- /dev/null
+++ b/boost/spirit/core/nil.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_NIL
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_NIL
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_nil.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_nil.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_nil.hpp>
+
+#endif
diff --git a/boost/spirit/core/non_terminal/grammar.hpp b/boost/spirit/core/non_terminal/grammar.hpp
new file mode 100644
index 0000000000..81e3bb8d18
--- /dev/null
+++ b/boost/spirit/core/non_terminal/grammar.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_GRAMMAR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_GRAMMAR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_grammar.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_grammar.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_grammar.hpp>
+
+#endif
diff --git a/boost/spirit/core/non_terminal/parser_context.hpp b/boost/spirit/core/non_terminal/parser_context.hpp
new file mode 100644
index 0000000000..5652a5fbf9
--- /dev/null
+++ b/boost/spirit/core/non_terminal/parser_context.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARSER_CONTEXT
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARSER_CONTEXT
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parser_context.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parser_context.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parser_context.hpp>
+
+#endif
diff --git a/boost/spirit/core/non_terminal/parser_id.hpp b/boost/spirit/core/non_terminal/parser_id.hpp
new file mode 100644
index 0000000000..1f850339ee
--- /dev/null
+++ b/boost/spirit/core/non_terminal/parser_id.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARSER_ID
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARSER_ID
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parser_id.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parser_id.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parser_id.hpp>
+
+#endif
diff --git a/boost/spirit/core/non_terminal/rule.hpp b/boost/spirit/core/non_terminal/rule.hpp
new file mode 100644
index 0000000000..47ae7c9302
--- /dev/null
+++ b/boost/spirit/core/non_terminal/rule.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_RULE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_RULE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_rule.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_rule.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_rule.hpp>
+
+#endif
diff --git a/boost/spirit/core/non_terminal/subrule.hpp b/boost/spirit/core/non_terminal/subrule.hpp
new file mode 100644
index 0000000000..913b46211f
--- /dev/null
+++ b/boost/spirit/core/non_terminal/subrule.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SUBRULE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SUBRULE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_subrule.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_subrule.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_subrule.hpp>
+
+#endif
diff --git a/boost/spirit/core/non_terminal/subrule_fwd.hpp b/boost/spirit/core/non_terminal/subrule_fwd.hpp
new file mode 100644
index 0000000000..b6d1efaadc
--- /dev/null
+++ b/boost/spirit/core/non_terminal/subrule_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SUBRULE_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SUBRULE_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_subrule_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_subrule_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_subrule_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/core/parser.hpp b/boost/spirit/core/parser.hpp
new file mode 100644
index 0000000000..aa051417f2
--- /dev/null
+++ b/boost/spirit/core/parser.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARSER
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARSER
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parser.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parser.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parser.hpp>
+
+#endif
diff --git a/boost/spirit/core/primitives/numerics.hpp b/boost/spirit/core/primitives/numerics.hpp
new file mode 100644
index 0000000000..e03218f67e
--- /dev/null
+++ b/boost/spirit/core/primitives/numerics.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_NUMERICS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_NUMERICS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_numerics.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_numerics.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_numerics.hpp>
+
+#endif
diff --git a/boost/spirit/core/primitives/numerics_fwd.hpp b/boost/spirit/core/primitives/numerics_fwd.hpp
new file mode 100644
index 0000000000..18916968a4
--- /dev/null
+++ b/boost/spirit/core/primitives/numerics_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_NUMERICS_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_NUMERICS_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_numerics_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_numerics_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_numerics_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/core/primitives/primitives.hpp b/boost/spirit/core/primitives/primitives.hpp
new file mode 100644
index 0000000000..316b6ceca7
--- /dev/null
+++ b/boost/spirit/core/primitives/primitives.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PRIMITIVES
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PRIMITIVES
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_primitives.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_primitives.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_primitives.hpp>
+
+#endif
diff --git a/boost/spirit/core/safe_bool.hpp b/boost/spirit/core/safe_bool.hpp
new file mode 100644
index 0000000000..5dd9decd81
--- /dev/null
+++ b/boost/spirit/core/safe_bool.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SAFE_BOOL
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SAFE_BOOL
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_safe_bool.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_safe_bool.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_safe_bool.hpp>
+
+#endif
diff --git a/boost/spirit/core/scanner/scanner.hpp b/boost/spirit/core/scanner/scanner.hpp
new file mode 100644
index 0000000000..a6aac3c46f
--- /dev/null
+++ b/boost/spirit/core/scanner/scanner.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SCANNER
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SCANNER
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_scanner.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_scanner.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_scanner.hpp>
+
+#endif
diff --git a/boost/spirit/core/scanner/scanner_fwd.hpp b/boost/spirit/core/scanner/scanner_fwd.hpp
new file mode 100644
index 0000000000..96c597ffbf
--- /dev/null
+++ b/boost/spirit/core/scanner/scanner_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SCANNER_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SCANNER_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_scanner_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_scanner_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_scanner_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/core/scanner/skipper.hpp b/boost/spirit/core/scanner/skipper.hpp
new file mode 100644
index 0000000000..35fe3f1e65
--- /dev/null
+++ b/boost/spirit/core/scanner/skipper.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SKIPPER
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SKIPPER
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_skipper.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_skipper.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_skipper.hpp>
+
+#endif
diff --git a/boost/spirit/core/scanner/skipper_fwd.hpp b/boost/spirit/core/scanner/skipper_fwd.hpp
new file mode 100644
index 0000000000..aa09e9ddbc
--- /dev/null
+++ b/boost/spirit/core/scanner/skipper_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SKIPPER_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SKIPPER_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_skipper_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_skipper_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_skipper_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/core/typeof.hpp b/boost/spirit/core/typeof.hpp
new file mode 100644
index 0000000000..b7d5199863
--- /dev/null
+++ b/boost/spirit/core/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_CORE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_CORE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/debug.hpp b/boost/spirit/debug.hpp
new file mode 100644
index 0000000000..5cec6e62e4
--- /dev/null
+++ b/boost/spirit/debug.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_DEBUG
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_DEBUG
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_debug.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_debug.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_debug.hpp>
+
+#endif
diff --git a/boost/spirit/debug/debug_node.hpp b/boost/spirit/debug/debug_node.hpp
new file mode 100644
index 0000000000..b4f94ee642
--- /dev/null
+++ b/boost/spirit/debug/debug_node.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_DEBUG_NODE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_DEBUG_NODE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_debug_node.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_debug_node.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_debug_node.hpp>
+
+#endif
diff --git a/boost/spirit/debug/minimal.hpp b/boost/spirit/debug/minimal.hpp
new file mode 100644
index 0000000000..f8a7262afb
--- /dev/null
+++ b/boost/spirit/debug/minimal.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_MINIMAL
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_MINIMAL
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_minimal.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_minimal.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_minimal.hpp>
+
+#endif
diff --git a/boost/spirit/debug/parser_names.hpp b/boost/spirit/debug/parser_names.hpp
new file mode 100644
index 0000000000..3d280cabe2
--- /dev/null
+++ b/boost/spirit/debug/parser_names.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARSER_NAMES
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARSER_NAMES
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parser_names.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parser_names.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parser_names.hpp>
+
+#endif
diff --git a/boost/spirit/debug/typeof.hpp b/boost/spirit/debug/typeof.hpp
new file mode 100644
index 0000000000..48c4edcbf7
--- /dev/null
+++ b/boost/spirit/debug/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_DEBUG
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_DEBUG
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic.hpp b/boost/spirit/dynamic.hpp
new file mode 100644
index 0000000000..313db18c12
--- /dev/null
+++ b/boost/spirit/dynamic.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_DYNAMIC
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_DYNAMIC
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_dynamic.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_dynamic.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_dynamic.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/for.hpp b/boost/spirit/dynamic/for.hpp
new file mode 100644
index 0000000000..460d1588a2
--- /dev/null
+++ b/boost/spirit/dynamic/for.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_FOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_FOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_for.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_for.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_for.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/if.hpp b/boost/spirit/dynamic/if.hpp
new file mode 100644
index 0000000000..45a571a25f
--- /dev/null
+++ b/boost/spirit/dynamic/if.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_IF
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_IF
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_if.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_if.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_if.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/lazy.hpp b/boost/spirit/dynamic/lazy.hpp
new file mode 100644
index 0000000000..3ef13e0764
--- /dev/null
+++ b/boost/spirit/dynamic/lazy.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_LAZY
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_LAZY
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_lazy.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_lazy.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_lazy.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/rule_alias.hpp b/boost/spirit/dynamic/rule_alias.hpp
new file mode 100644
index 0000000000..71881947c3
--- /dev/null
+++ b/boost/spirit/dynamic/rule_alias.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_RULE_ALIAS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_RULE_ALIAS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_rule_alias.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_rule_alias.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_rule_alias.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/select.hpp b/boost/spirit/dynamic/select.hpp
new file mode 100644
index 0000000000..b334b6fc1b
--- /dev/null
+++ b/boost/spirit/dynamic/select.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SELECT
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SELECT
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_select.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_select.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_select.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/stored_rule.hpp b/boost/spirit/dynamic/stored_rule.hpp
new file mode 100644
index 0000000000..e61c5c120e
--- /dev/null
+++ b/boost/spirit/dynamic/stored_rule.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_STORED_RULE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_STORED_RULE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_stored_rule.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_stored_rule.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_stored_rule.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/stored_rule_fwd.hpp b/boost/spirit/dynamic/stored_rule_fwd.hpp
new file mode 100644
index 0000000000..9924af1417
--- /dev/null
+++ b/boost/spirit/dynamic/stored_rule_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_STORED_RULE_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_STORED_RULE_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_stored_rule_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_stored_rule_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_stored_rule_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/switch.hpp b/boost/spirit/dynamic/switch.hpp
new file mode 100644
index 0000000000..78ee46b6b5
--- /dev/null
+++ b/boost/spirit/dynamic/switch.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SWITCH
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SWITCH
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_switch.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_switch.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_switch.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/typeof.hpp b/boost/spirit/dynamic/typeof.hpp
new file mode 100644
index 0000000000..02374c2780
--- /dev/null
+++ b/boost/spirit/dynamic/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_DYNAMIC
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_DYNAMIC
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/dynamic/while.hpp b/boost/spirit/dynamic/while.hpp
new file mode 100644
index 0000000000..f09971d809
--- /dev/null
+++ b/boost/spirit/dynamic/while.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_WHILE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_WHILE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_while.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_while.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_while.hpp>
+
+#endif
diff --git a/boost/spirit/error_handling.hpp b/boost/spirit/error_handling.hpp
new file mode 100644
index 0000000000..5a434d712b
--- /dev/null
+++ b/boost/spirit/error_handling.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ERROR_HANDLING
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ERROR_HANDLING
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_error_handling.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_error_handling.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_error_handling.hpp>
+
+#endif
diff --git a/boost/spirit/error_handling/exceptions.hpp b/boost/spirit/error_handling/exceptions.hpp
new file mode 100644
index 0000000000..80cd7bfcf2
--- /dev/null
+++ b/boost/spirit/error_handling/exceptions.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_EXCEPTIONS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_EXCEPTIONS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_exceptions.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_exceptions.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_exceptions.hpp>
+
+#endif
diff --git a/boost/spirit/error_handling/exceptions_fwd.hpp b/boost/spirit/error_handling/exceptions_fwd.hpp
new file mode 100644
index 0000000000..27dd9ab437
--- /dev/null
+++ b/boost/spirit/error_handling/exceptions_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_EXCEPTIONS_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_EXCEPTIONS_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_exceptions_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_exceptions_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_exceptions_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/error_handling/typeof.hpp b/boost/spirit/error_handling/typeof.hpp
new file mode 100644
index 0000000000..6ce3318fc3
--- /dev/null
+++ b/boost/spirit/error_handling/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_ERROR_HANDLING
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_ERROR_HANDLING
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/home/classic.hpp b/boost/spirit/home/classic.hpp
new file mode 100644
index 0000000000..4d3da2a1fa
--- /dev/null
+++ b/boost/spirit/home/classic.hpp
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 1998-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2002-2003 Martin Wille
+ Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+ Copyright (c) 2002 Raghavendra Satish
+ Copyright (c) 2002 Jeff Westfahl
+ Copyright (c) 2001 Bruce Florman
+ Copyright (c) 2003 Giovanni Bajo
+ Copyright (c) 2003 Vaclav Vesely
+ Copyright (c) 2003 Jonathan de Halleux
+ http://spirit.sourceforge.net/
+ http://www.boost.org/libs/spirit
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+ See http://www.boost.org/libs/spirit for documentation
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_CLASSIC_APRIL_11_2008_0849AM)
+#define BOOST_SPIRIT_CLASSIC_APRIL_11_2008_0849AM
+
+#include <boost/spirit/home/classic/core.hpp>
+#include <boost/spirit/home/classic/meta.hpp>
+#include <boost/spirit/home/classic/error_handling.hpp>
+#include <boost/spirit/home/classic/iterator.hpp>
+#include <boost/spirit/home/classic/symbols.hpp>
+#include <boost/spirit/home/classic/utility.hpp>
+#include <boost/spirit/home/classic/attribute.hpp>
+
+#endif
diff --git a/boost/spirit/home/classic/actor.hpp b/boost/spirit/home/classic/actor.hpp
new file mode 100644
index 0000000000..706099414d
--- /dev/null
+++ b/boost/spirit/home/classic/actor.hpp
@@ -0,0 +1,113 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Actors documentation and convention
+//
+// Actors
+//
+// Actors are predefined semantic action functors. They are used to do an
+// action on the parse result if the parser has had a successful match. An
+// example of actor is the append_actor described in the Spirit
+// documentation.
+//
+// The action takes place through a call to the () operator: single argument
+// () operator call for character parsers and two argument (first,last) call
+// for phrase parsers. Actors should implement at least one of the two ()
+// operator.
+//
+// Actor instances are not created direcly since they usually involve a
+// number of template parameters. Instead generator functions ("helper
+// functions") are provided to generate actors according to their arguments.
+// All helper functions have the "_a" suffix. For example, append_actor is
+// created using the append_a function.
+//
+// Policy holder actors and policy actions
+//
+// A lot of actors need to store reference to one or more objects. For
+// example, actions on container need to store a reference to the container.
+// Therefore, this kind of actor have been broken down into
+//
+// - a action policy that does the action (act method),
+// - a policy holder actor that stores the references and feeds the act
+// method.
+//
+// Policy holder actors
+//
+// Policy holder have the following naming convention:
+// <member>_ >> *<member> >> !value >> actor
+// where member are the policy stored member, they can be of type:
+//
+// - ref, a reference,
+// - const_ref, a const reference,
+// - value, by value,
+// - empty, no stored members
+// - !value states if the policy uses the parse result or not.
+//
+// The available policy holder are enumerated below:
+//
+// - empty_actor, nothing stored, feeds parse result
+// - value_actor, 1 object stored by value, feeds value
+// - ref_actor, 1 reference stored, feeds ref
+// - ref_value_actor, 1 reference stored, feeds ref and parse result
+//
+// Doc. convention
+//
+// - ref is a reference to an object stored in a policy holder actor,
+// - value_ref,value1_ref, value2_ref are a const reference stored in a
+// policy holder actor,
+// - value is the parse result in the single argument () operator,
+// - first,last are the parse result in the two argument () operator
+//
+// Actors (generator functions) and quick description
+//
+// - assign_a(ref) assign parse result to ref
+// - assign_a(ref, value_ref) assign value_ref to ref
+// - increment_a(ref) increment ref
+// - decrement_a(ref) decrement ref
+// - push_back_a(ref) push back the parse result in ref
+// - push_back_a(ref, value_ref) push back value_ref in ref
+// - push_front_a(ref) push front the parse result in ref
+// - push_front_a(ref, value_ref) push front value_ref in ref
+// - insert_key_a(ref,value_ref) insert value_ref in ref using the
+// parse result as key
+// - insert_at_a(ref, key_ref) insert the parse result in ref at key_ref
+// - insert_at_a(ref, key_ref insert value_ref in ref at key_ref
+// , value_ref)
+// - assign_key_a(ref, value_ref) assign value_ref in ref using the
+// parse result as key
+// - erase_a(ref, key) erase data at key from ref
+// - clear_a(ref) clears ref
+// - swap_a(aref, bref) swaps aref and bref
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/home/classic/actor/ref_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_value_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp>
+
+#include <boost/spirit/home/classic/actor/assign_actor.hpp>
+#include <boost/spirit/home/classic/actor/clear_actor.hpp>
+#include <boost/spirit/home/classic/actor/increment_actor.hpp>
+#include <boost/spirit/home/classic/actor/decrement_actor.hpp>
+#include <boost/spirit/home/classic/actor/push_back_actor.hpp>
+#include <boost/spirit/home/classic/actor/push_front_actor.hpp>
+#include <boost/spirit/home/classic/actor/erase_actor.hpp>
+#include <boost/spirit/home/classic/actor/insert_key_actor.hpp>
+#include <boost/spirit/home/classic/actor/insert_at_actor.hpp>
+#include <boost/spirit/home/classic/actor/assign_key_actor.hpp>
+#include <boost/spirit/home/classic/actor/swap_actor.hpp>
+
+#endif
diff --git a/boost/spirit/home/classic/actor/assign_actor.hpp b/boost/spirit/home/classic/actor/assign_actor.hpp
new file mode 100644
index 0000000000..94551308d8
--- /dev/null
+++ b/boost/spirit/home/classic/actor/assign_actor.hpp
@@ -0,0 +1,100 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_ASSIGN_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_ASSIGN_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_value_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy that applies the assignement operator.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions (what it does):
+ // ref = value;
+ // ref = T(first,last);
+ // ref = value_ref;
+ //
+ // Policy name:
+ // assign_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_value_actor, assign_a( ref );
+ // ref_const_ref_actor, assign_a( ref, value_ref );
+ //
+ // () operators: both
+ //
+ // See also ref_value_actor and ref_const_ref_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct assign_action
+ {
+ template<
+ typename T,
+ typename ValueT
+ >
+ void act(T& ref_, ValueT const& value_) const
+ {
+ ref_ = value_;
+ }
+ template<
+ typename T,
+ typename IteratorT
+ >
+ void act(
+ T& ref_,
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ typedef T value_type;
+#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
+ value_type value(first_,last_);
+#else
+ value_type value;
+ std::copy(first_, last_, std::inserter(value, value.end()));
+#endif
+ ref_ = value;
+ }
+ };
+
+ // Deprecated. Please use assign_a
+ template<typename T>
+ inline ref_value_actor<T,assign_action> assign(T& ref_)
+ {
+ return ref_value_actor<T,assign_action>(ref_);
+ }
+
+ template<typename T>
+ inline ref_value_actor<T,assign_action> assign_a(T& ref_)
+ {
+ return ref_value_actor<T,assign_action>(ref_);
+ }
+
+ template<
+ typename T,
+ typename ValueT
+ >
+ inline ref_const_ref_actor<T,ValueT,assign_action> assign_a(
+ T& ref_,
+ ValueT const& value_
+ )
+ {
+ return ref_const_ref_actor<T,ValueT,assign_action>(ref_,value_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/assign_key_actor.hpp b/boost/spirit/home/classic/actor/assign_key_actor.hpp
new file mode 100644
index 0000000000..f6711d30fb
--- /dev/null
+++ b/boost/spirit/home/classic/actor/assign_key_actor.hpp
@@ -0,0 +1,96 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_ASSIGN_KEY_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_ASSIGN_KEY_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ struct assign_key_action
+ {
+ template<
+ typename T,
+ typename ValueT,
+ typename KeyT
+ >
+ void act(T& ref_, ValueT const& value_, KeyT const& key_) const
+ {
+ ref_[ key_ ] = value_;
+ }
+
+ template<
+ typename T,
+ typename ValueT,
+ typename IteratorT
+ >
+ void act(
+ T& ref_,
+ ValueT const& value_,
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ typedef typename T::key_type key_type;
+ key_type key(first_,last_);
+
+ ref_[key] = value_;
+ }
+ };
+
+ template<
+ typename T,
+ typename ValueT
+ >
+ inline ref_const_ref_value_actor<T,ValueT,assign_key_action>
+ assign_key_a(T& ref_, ValueT const& value_)
+ {
+ return ref_const_ref_value_actor<T,ValueT,assign_key_action>(
+ ref_,
+ value_
+ );
+ }
+
+ template<
+ typename T,
+ typename ValueT,
+ typename KeyT
+ >
+ inline ref_const_ref_const_ref_actor<
+ T,
+ ValueT,
+ KeyT,
+ assign_key_action
+ >
+ assign_key_a(
+ T& ref_,
+ ValueT const& value_,
+ KeyT const& key_
+ )
+ {
+ return ref_const_ref_const_ref_actor<
+ T,
+ ValueT,
+ KeyT,
+ assign_key_action
+ >(
+ ref_,
+ value_,
+ key_
+ );
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/clear_actor.hpp b/boost/spirit/home/classic/actor/clear_actor.hpp
new file mode 100644
index 0000000000..9af670dcc6
--- /dev/null
+++ b/boost/spirit/home/classic/actor/clear_actor.hpp
@@ -0,0 +1,61 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_CLEAR_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_CLEAR_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy that calls clear method.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions (what it does):
+ // ref.clear();
+ //
+ // Policy name:
+ // clear_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_actor, clear_a( ref );
+ //
+ // () operators: both.
+ //
+ // See also ref_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct clear_action
+ {
+ template<
+ typename T
+ >
+ void act(T& ref_) const
+ {
+ ref_.clear();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // helper method that creates a and_assign_actor.
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename T>
+ inline ref_actor<T,clear_action> clear_a(T& ref_)
+ {
+ return ref_actor<T,clear_action>(ref_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
+
diff --git a/boost/spirit/home/classic/actor/decrement_actor.hpp b/boost/spirit/home/classic/actor/decrement_actor.hpp
new file mode 100644
index 0000000000..99cdf35d7f
--- /dev/null
+++ b/boost/spirit/home/classic/actor/decrement_actor.hpp
@@ -0,0 +1,60 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_DECREMENT_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_DECREMENT_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy that calls the -- operator on a reference.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions:
+ // --ref;
+ //
+ // Policy name:
+ // decrement_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_actor, decrement_a( ref );
+ //
+ // () operators: both.
+ //
+ // See also ref_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct decrement_action
+ {
+ template<
+ typename T
+ >
+ void act(T& ref_) const
+ {
+ --ref_;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // helper method that creates a and_assign_actor.
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename T>
+ inline ref_actor<T,decrement_action> decrement_a(T& ref_)
+ {
+ return ref_actor<T,decrement_action>(ref_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/erase_actor.hpp b/boost/spirit/home/classic/actor/erase_actor.hpp
new file mode 100644
index 0000000000..dca1b40435
--- /dev/null
+++ b/boost/spirit/home/classic/actor/erase_actor.hpp
@@ -0,0 +1,89 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_ERASE_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_ERASE_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_value_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy that calss the erase method.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions (what it does):
+ // ref.erase( value );
+ // ref.erase( T::key_type(first,last) );
+ // ref.erase( key_ref );
+ //
+ // Policy name:
+ // erase_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_value_actor, erase_a( ref );
+ // ref_const_ref_actor, erase_a( ref, key_ref );
+ //
+ // () operators: both
+ //
+ // See also ref_value_actor and ref_const_ref_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct erase_action
+ {
+ template<
+ typename T,
+ typename KeyT
+ >
+ void act(T& ref_, KeyT const& key_) const
+ {
+ ref_.erase(key_);
+ }
+ template<
+ typename T,
+ typename IteratorT
+ >
+ void act(
+ T& ref_,
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ typedef typename T::key_type key_type;
+ key_type key(first_,last_);
+
+ ref_.erase(key);
+ }
+ };
+
+ template<typename T>
+ inline ref_value_actor<T,erase_action> erase_a(T& ref_)
+ {
+ return ref_value_actor<T,erase_action>(ref_);
+ }
+
+ template<
+ typename T,
+ typename KeyT
+ >
+ inline ref_const_ref_actor<T,KeyT,erase_action> erase_a(
+ T& ref_,
+ KeyT const& key_
+ )
+ {
+ return ref_const_ref_actor<T,KeyT,erase_action>(ref_,key_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/increment_actor.hpp b/boost/spirit/home/classic/actor/increment_actor.hpp
new file mode 100644
index 0000000000..776568887e
--- /dev/null
+++ b/boost/spirit/home/classic/actor/increment_actor.hpp
@@ -0,0 +1,60 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_INCREMENT_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_INCREMENT_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy that calls the ++ operator on a reference.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions:
+ // ++ref;
+ //
+ // Policy name:
+ // increment_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_actor, increment_a( ref );
+ //
+ // () operators: both.
+ //
+ // See also ref_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct increment_action
+ {
+ template<
+ typename T
+ >
+ void act(T& ref_) const
+ {
+ ++ref_;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // helper method that creates a increment_actor.
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename T>
+ inline ref_actor<T,increment_action> increment_a(T& ref_)
+ {
+ return ref_actor<T,increment_action>(ref_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/insert_at_actor.hpp b/boost/spirit/home/classic/actor/insert_at_actor.hpp
new file mode 100644
index 0000000000..5dd7497232
--- /dev/null
+++ b/boost/spirit/home/classic/actor/insert_at_actor.hpp
@@ -0,0 +1,121 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_INSERT_AT_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_INSERT_AT_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy that insert data into an associative
+ // container using a const reference to a key.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions (what it does):
+ // ref.insert( T::value_type(key_ref,value) );
+ // ref.insert( T::value_type(key_ref, T::mapped_type(first,last)));;
+ // ref.insert( T::value_type(key_ref,value_ref) );
+ //
+ // Policy name:
+ // insert_at_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_const_ref_value_actor, insert_at_a( ref, key_ref );
+ // ref_const_ref_const_ref_actor, insert_a( ref, key_ref, value_ref );
+ //
+ // () operators: both
+ //
+ // See also ref_const_ref_value_actor and ref_const_ref_const_ref_actor
+ // for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct insert_at_action
+ {
+ template<
+ typename T,
+ typename ReferentT,
+ typename ValueT
+ >
+ void act(
+ T& ref_,
+ ReferentT const& key_,
+ ValueT const& value_
+ ) const
+ {
+ typedef typename T::value_type value_type;
+ ref_.insert( value_type(key_, value_) );
+ }
+
+ template<
+ typename T,
+ typename ReferentT,
+ typename IteratorT
+ >
+ void act(
+ T& ref_,
+ ReferentT const& key_,
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ typedef typename T::mapped_type mapped_type;
+ typedef typename T::value_type value_type;
+
+ mapped_type value(first_,last_);
+ value_type key_value(key_, value);
+ ref_.insert( key_value );
+ }
+ };
+
+ template<
+ typename T,
+ typename ReferentT
+ >
+ inline ref_const_ref_value_actor<T,ReferentT,insert_at_action>
+ insert_at_a(
+ T& ref_,
+ ReferentT const& key_
+ )
+ {
+ return ref_const_ref_value_actor<
+ T,
+ ReferentT,
+ insert_at_action
+ >(ref_,key_);
+ }
+
+ template<
+ typename T,
+ typename ReferentT,
+ typename ValueT
+ >
+ inline ref_const_ref_const_ref_actor<T,ReferentT,ValueT,insert_at_action>
+ insert_at_a(
+ T& ref_,
+ ReferentT const& key_,
+ ValueT const& value_
+ )
+ {
+ return ref_const_ref_const_ref_actor<
+ T,
+ ReferentT,
+ ValueT,
+ insert_at_action
+ >(ref_,key_,value_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/insert_key_actor.hpp b/boost/spirit/home/classic/actor/insert_key_actor.hpp
new file mode 100644
index 0000000000..859a8d8363
--- /dev/null
+++ b/boost/spirit/home/classic/actor/insert_key_actor.hpp
@@ -0,0 +1,97 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_INSERT_KEY_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_INSERT_KEY_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy that insert data into an associative
+ // container using a const reference to data.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions (what it does):
+ // ref.insert( T::value_type(value,value_ref) );
+ // ref.insert( T::value_type(T::key_type(first,last), value_ref));;
+ //
+ // Policy name:
+ // insert_key_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_const_ref_value_actor, insert_key_a( ref, value_ref );
+ //
+ // () operators: both
+ //
+ // See also ref_const_ref_value_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct insert_key_action
+ {
+ template<
+ typename T,
+ typename ValueT,
+ typename ReferentT
+ >
+ void act(
+ T& ref_,
+ ValueT const& value_,
+ ReferentT const& key_
+ ) const
+ {
+ typedef typename T::value_type value_type;
+ value_type key_value(key_, value_);
+ ref_.insert( key_value );
+ }
+
+ template<
+ typename T,
+ typename ValueT,
+ typename IteratorT
+ >
+ void act(
+ T& ref_,
+ ValueT const& value_,
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ typedef typename T::key_type key_type;
+ typedef typename T::value_type value_type;
+
+ key_type key(first_,last_);
+ value_type key_value(key, value_);
+ ref_.insert( key_value );
+ }
+ };
+
+ template<
+ typename T,
+ typename ValueT
+ >
+ inline ref_const_ref_value_actor<T,ValueT,insert_key_action> insert_key_a(
+ T& ref_,
+ ValueT const& value_
+ )
+ {
+ return ref_const_ref_value_actor<
+ T,
+ ValueT,
+ insert_key_action
+ >(ref_,value_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/push_back_actor.hpp b/boost/spirit/home/classic/actor/push_back_actor.hpp
new file mode 100644
index 0000000000..cbdd790709
--- /dev/null
+++ b/boost/spirit/home/classic/actor/push_back_actor.hpp
@@ -0,0 +1,101 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_PUSH_BACK_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_PUSH_BACK_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_value_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ //
+ // A semantic action policy that appends a value to the back of a
+ // container.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions (what it does and what ref, value_ref must support):
+ // ref.push_back( value );
+ // ref.push_back( T::value_type(first,last) );
+ // ref.push_back( value_ref );
+ //
+ // Policy name:
+ // push_back_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_value_actor, push_back_a( ref );
+ // ref_const_ref_actor, push_back_a( ref, value_ref );
+ //
+ // () operators: both
+ //
+ // See also ref_value_actor and ref_const_ref_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct push_back_action
+ {
+ template<
+ typename T,
+ typename ValueT
+ >
+ void act(T& ref_, ValueT const& value_) const
+ {
+ ref_.push_back( value_ );
+ }
+ template<
+ typename T,
+ typename IteratorT
+ >
+ void act(
+ T& ref_,
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ typedef typename T::value_type value_type;
+ value_type value(first_,last_);
+
+ ref_.push_back( value );
+ }
+ };
+
+// Deprecated interface. Use push_back_a
+ template<typename T>
+ inline ref_value_actor<T,push_back_action>
+ append(T& ref_)
+ {
+ return ref_value_actor<T,push_back_action>(ref_);
+ }
+
+ template<typename T>
+ inline ref_value_actor<T,push_back_action>
+ push_back_a(T& ref_)
+ {
+ return ref_value_actor<T,push_back_action>(ref_);
+ }
+
+ template<
+ typename T,
+ typename ValueT
+ >
+ inline ref_const_ref_actor<T,ValueT,push_back_action>
+ push_back_a(
+ T& ref_,
+ ValueT const& value_
+ )
+ {
+ return ref_const_ref_actor<T,ValueT,push_back_action>(ref_,value_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/push_front_actor.hpp b/boost/spirit/home/classic/actor/push_front_actor.hpp
new file mode 100644
index 0000000000..43cb183513
--- /dev/null
+++ b/boost/spirit/home/classic/actor/push_front_actor.hpp
@@ -0,0 +1,91 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_PUSH_FRONT_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_PUSH_FRONT_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_value_actor.hpp>
+#include <boost/spirit/home/classic/actor/ref_const_ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ //
+ // A semantic action policy that appends a value to the front of a
+ // container.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions (what it does and what ref, value_ref must support):
+ // ref.push_front( value );
+ // ref.push_front( T::value_type(first,last) );
+ // ref.push_front( value_ref );
+ //
+ // Policy name:
+ // push_front_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_value_actor, push_front_a( ref );
+ // ref_const_ref_actor, push_front_a( ref, value_ref );
+ //
+ // () operators: both
+ //
+ // See also ref_value_actor and ref_const_ref_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ struct push_front_action
+ {
+ template<
+ typename T,
+ typename ValueT
+ >
+ void act(T& ref_, ValueT const& value_) const
+ {
+ ref_.push_front( value_ );
+ }
+ template<
+ typename T,
+ typename IteratorT
+ >
+ void act(
+ T& ref_,
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ typedef typename T::value_type value_type;
+ value_type value(first_,last_);
+
+ ref_.push_front( value );
+ }
+ };
+
+ template<typename T>
+ inline ref_value_actor<T,push_front_action> push_front_a(T& ref_)
+ {
+ return ref_value_actor<T,push_front_action>(ref_);
+ }
+
+ template<
+ typename T,
+ typename ValueT
+ >
+ inline ref_const_ref_actor<T,ValueT,push_front_action> push_front_a(
+ T& ref_,
+ ValueT const& value_
+ )
+ {
+ return ref_const_ref_actor<T,ValueT,push_front_action>(ref_,value_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/ref_actor.hpp b/boost/spirit/home/classic/actor/ref_actor.hpp
new file mode 100644
index 0000000000..4cf7a47c07
--- /dev/null
+++ b/boost/spirit/home/classic/actor/ref_actor.hpp
@@ -0,0 +1,70 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_REF_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_REF_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy holder. This holder stores a reference to ref,
+ // act methods are fead with this reference. The parse result is not used
+ // by this holder.
+ //
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Constructor:
+ // ...(T& ref_);
+ // where ref_ is stored.
+ //
+ // Action calls:
+ // act(ref);
+ //
+ // () operators: both
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template<
+ typename T,
+ typename ActionT
+ >
+ class ref_actor : public ActionT
+ {
+ private:
+ T& ref;
+ public:
+ explicit
+ ref_actor(T& ref_)
+ : ref(ref_){}
+
+
+ template<typename T2>
+ void operator()(T2 const& /*val*/) const
+ {
+ this->act(ref); // defined in ActionT
+ }
+
+
+ template<typename IteratorT>
+ void operator()(
+ IteratorT const& /*first*/,
+ IteratorT const& /*last*/
+ ) const
+ {
+ this->act(ref); // defined in ActionT
+ }
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/ref_const_ref_actor.hpp b/boost/spirit/home/classic/actor/ref_const_ref_actor.hpp
new file mode 100644
index 0000000000..80ee6eb3ad
--- /dev/null
+++ b/boost/spirit/home/classic/actor/ref_const_ref_actor.hpp
@@ -0,0 +1,78 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_REF_CONST_REF_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_REF_CONST_REF_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy holder. This holder stores a reference to ref
+ // and a const reference to value_ref.
+ // act methods are feed with ref and value_ref. The parse result is
+ // not used by this holder.
+ //
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Constructor:
+ // ...(T& ref_, ValueT const& value_ref_);
+ // where ref_ and value_ref_ are stored in the holder.
+ //
+ // Action calls:
+ // act(ref, value_ref);
+ //
+ // () operators: both
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template<
+ typename T,
+ typename ValueT,
+ typename ActionT
+ >
+ class ref_const_ref_actor : public ActionT
+ {
+ private:
+ T& ref;
+ ValueT const& value_ref;
+ public:
+ ref_const_ref_actor(
+ T& ref_,
+ ValueT const& value_ref_
+ )
+ :
+ ref(ref_),
+ value_ref(value_ref_)
+ {}
+
+
+ template<typename T2>
+ void operator()(T2 const& /*val*/) const
+ {
+ this->act(ref,value_ref); // defined in ActionT
+ }
+
+
+ template<typename IteratorT>
+ void operator()(
+ IteratorT const& /*first*/,
+ IteratorT const& /*last*/
+ ) const
+ {
+ this->act(ref,value_ref); // defined in ActionT
+ }
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp b/boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp
new file mode 100644
index 0000000000..2072334d67
--- /dev/null
+++ b/boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp
@@ -0,0 +1,87 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_REF_CONST_REF_CONST_REF_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_REF_CONST_REF_CONST_REF_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy holder. This holder stores a reference to ref
+ // , a const reference to value1_ref and a const reference to value2_ref.
+ // Typically, value1_ref is a key and value2_ref is value for associative
+ // container operations.
+ // act methods are feed with ref, value1_ref, value2_ref. The parse result
+ // is not used by this holder.
+ //
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Constructor:
+ // ...(
+ // T& ref_,
+ // Value1T const& value1_ref_,
+ // Value2T const& value2_ref_ );
+ // where ref_, value1_ref and value2_ref_ are stored in the holder.
+ //
+ // Action calls:
+ // act(ref, value1_ref, value2_ref);
+ //
+ // () operators: both
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template<
+ typename T,
+ typename Value1T,
+ typename Value2T,
+ typename ActionT
+ >
+ class ref_const_ref_const_ref_actor : public ActionT
+ {
+ private:
+ T& ref;
+ Value1T const& value1_ref;
+ Value2T const& value2_ref;
+ public:
+ ref_const_ref_const_ref_actor(
+ T& ref_,
+ Value1T const& value1_ref_,
+ Value2T const& value2_ref_
+ )
+ :
+ ref(ref_),
+ value1_ref(value1_ref_),
+ value2_ref(value2_ref_)
+ {}
+
+
+ template<typename T2>
+ void operator()(T2 const& /*val*/) const
+ {
+ this->act(ref,value1_ref,value2_ref); // defined in ActionT
+ }
+
+
+ template<typename IteratorT>
+ void operator()(
+ IteratorT const& /*first*/,
+ IteratorT const& /*last*/
+ ) const
+ {
+ this->act(ref,value1_ref,value2_ref); // defined in ActionT
+ }
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp b/boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp
new file mode 100644
index 0000000000..56e5fc98e9
--- /dev/null
+++ b/boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp
@@ -0,0 +1,78 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_REF_CONST_REF_VALUE_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_REF_CONST_REF_VALUE_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy holder. This holder stores a reference to ref
+ // and a const reference to value_ref.
+ // act methods are feed with ref, value_ref and the parse result.
+ //
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Constructor:
+ // ...(T& ref_, ValueT const& value_ref_);
+ // where ref_ and value_ref_ are stored in the holder.
+ //
+ // Action calls:
+ // act(ref, value_ref, value);
+ // act(ref, value_ref, first, last);
+ //
+ // () operators: both
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template<
+ typename T,
+ typename ValueT,
+ typename ActionT
+ >
+ class ref_const_ref_value_actor : public ActionT
+ {
+ private:
+ T& ref;
+ ValueT const& value_ref;
+ public:
+ ref_const_ref_value_actor(
+ T& ref_,
+ ValueT const& value_ref_
+ )
+ :
+ ref(ref_),
+ value_ref(value_ref_)
+ {}
+
+
+ template<typename T2>
+ void operator()(T2 const& val_) const
+ {
+ this->act(ref,value_ref,val_); // defined in ActionT
+ }
+
+
+ template<typename IteratorT>
+ void operator()(
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ this->act(ref,value_ref,first_,last_); // defined in ActionT
+ }
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/ref_value_actor.hpp b/boost/spirit/home/classic/actor/ref_value_actor.hpp
new file mode 100644
index 0000000000..596e219b1e
--- /dev/null
+++ b/boost/spirit/home/classic/actor/ref_value_actor.hpp
@@ -0,0 +1,82 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ Copyright (c) 2011 Bryce Lelbach
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_REF_VALUE_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_REF_VALUE_ACTOR_HPP
+
+#include <boost/detail/workaround.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy holder. This holder stores a reference to ref.
+ // act methods are feed with ref and the parse result.
+ //
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Constructor:
+ // ...(T& ref_);
+ // where ref_ is stored.
+ //
+ // Action calls:
+ // act(ref, value);
+ // act(ref, first,last);
+ //
+ // () operators: both
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template<
+ typename T,
+ typename ActionT
+ >
+ class ref_value_actor : public ActionT
+ {
+ private:
+ T& ref;
+ public:
+ explicit
+ ref_value_actor(T& ref_)
+ : ref(ref_){}
+
+
+ template<typename T2>
+ void operator()(T2 const& val_) const
+ {
+ this->act(ref,val_); // defined in ActionT
+ }
+
+
+ template<typename IteratorT>
+ void operator()(
+ IteratorT const& first_,
+ IteratorT const& last_
+ ) const
+ {
+ this->act(ref,first_,last_); // defined in ActionT
+ }
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/swap_actor.hpp b/boost/spirit/home/classic/actor/swap_actor.hpp
new file mode 100644
index 0000000000..f3fc5e4b1f
--- /dev/null
+++ b/boost/spirit/home/classic/actor/swap_actor.hpp
@@ -0,0 +1,85 @@
+/*=============================================================================
+ Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_SWAP_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_SWAP_ACTOR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/actor/ref_value_actor.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Summary:
+ // A semantic action policy that swaps values.
+ // (This doc uses convention available in actors.hpp)
+ //
+ // Actions (what it does):
+ // ref.swap( value_ref );
+ //
+ // Policy name:
+ // swap_action
+ //
+ // Policy holder, corresponding helper method:
+ // ref_value_actor, swap_a( ref );
+ // ref_const_ref_actor, swap_a( ref, value_ref );
+ //
+ // () operators: both
+ //
+ // See also ref_value_actor and ref_const_ref_actor for more details.
+ ///////////////////////////////////////////////////////////////////////////
+ template<
+ typename T
+ >
+ class swap_actor
+ {
+ private:
+ T& ref;
+ T& swap_ref;
+
+ public:
+ swap_actor(
+ T& ref_,
+ T& swap_ref_)
+ : ref(ref_), swap_ref(swap_ref_)
+ {};
+
+ template<typename T2>
+ void operator()(T2 const& /*val*/) const
+ {
+ ref.swap(swap_ref);
+ }
+
+
+ template<typename IteratorT>
+ void operator()(
+ IteratorT const& /*first*/,
+ IteratorT const& /*last*/
+ ) const
+ {
+ ref.swap(swap_ref);
+ }
+ };
+
+ template<
+ typename T
+ >
+ inline swap_actor<T> swap_a(
+ T& ref_,
+ T& swap_ref_
+ )
+ {
+ return swap_actor<T>(ref_,swap_ref_);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/actor/typeof.hpp b/boost/spirit/home/classic/actor/typeof.hpp
new file mode 100644
index 0000000000..9d4b91ce18
--- /dev/null
+++ b/boost/spirit/home/classic/actor/typeof.hpp
@@ -0,0 +1,74 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTOR_TYPEOF_HPP)
+#define BOOST_SPIRIT_ACTOR_TYPEOF_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/typeof/typeof.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template<typename T, typename ActionT> class ref_actor;
+
+ template<typename T, typename ActionT> class ref_value_actor;
+
+ template<typename T, typename ValueT, typename ActionT>
+
+ class ref_const_ref_actor;
+ template<typename T, typename ValueT, typename ActionT>
+
+ class ref_const_ref_value_actor;
+ template<typename T, typename Value1T, typename Value2T, typename ActionT>
+
+ class ref_const_ref_const_ref_actor;
+
+ struct assign_action;
+ struct clear_action;
+ struct increment_action;
+ struct decrement_action;
+ struct push_back_action;
+ struct push_front_action;
+ struct insert_key_action;
+ struct insert_at_action;
+ struct assign_key_action;
+
+ template<typename T> class swap_actor;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ref_actor,2)
+#if !defined(BOOST_SPIRIT_CORE_TYPEOF_HPP)
+// this part also lives in the core master header and is deprecated there...
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ref_value_actor,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ref_const_ref_actor,3)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::assign_action)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::push_back_action)
+#endif
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ref_const_ref_value_actor,3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ref_const_ref_const_ref_actor,4)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::clear_action)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::increment_action)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::decrement_action)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::push_front_action)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::insert_key_action)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::insert_at_action)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::assign_key_action)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::swap_actor,1)
+
+#endif
+
diff --git a/boost/spirit/home/classic/attribute.hpp b/boost/spirit/home/classic/attribute.hpp
new file mode 100644
index 0000000000..35b306b6a4
--- /dev/null
+++ b/boost/spirit/home/classic/attribute.hpp
@@ -0,0 +1,37 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ATTRIBUTE_MAIN_HPP)
+#define BOOST_SPIRIT_ATTRIBUTE_MAIN_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Master header for Spirit.Attributes
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Phoenix predefined maximum limit. This limit defines the maximum
+// number of elements a tuple can hold. This number defaults to 3. The
+// actual maximum is rounded up in multiples of 3. Thus, if this value
+// is 4, the actual limit is 6. The ultimate maximum limit in this
+// implementation is 15.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(PHOENIX_LIMIT)
+#define PHOENIX_LIMIT 6
+#endif // !defined(PHOENIX_LIMIT)
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/attribute/parametric.hpp>
+#include <boost/spirit/home/classic/attribute/closure.hpp>
+
+#endif // !defined(BOOST_SPIRIT_ATTRIBUTE_MAIN_HPP)
diff --git a/boost/spirit/home/classic/attribute/closure.hpp b/boost/spirit/home/classic/attribute/closure.hpp
new file mode 100644
index 0000000000..681bc7fb04
--- /dev/null
+++ b/boost/spirit/home/classic/attribute/closure.hpp
@@ -0,0 +1,1083 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CLOSURE_HPP
+#define BOOST_SPIRIT_CLOSURE_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/parser_context.hpp>
+#include <boost/spirit/home/classic/attribute/parametric.hpp>
+#include <boost/spirit/home/classic/attribute/closure_context.hpp>
+#include <boost/spirit/home/classic/attribute/closure_fwd.hpp>
+
+#include <boost/spirit/home/classic/phoenix/closures.hpp>
+#include <boost/spirit/home/classic/phoenix/primitives.hpp>
+#include <boost/spirit/home/classic/phoenix/casts.hpp>
+#include <boost/spirit/home/classic/phoenix/operators.hpp>
+#include <boost/spirit/home/classic/phoenix/tuple_helpers.hpp>
+
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Spirit predefined maximum closure limit. This limit defines the maximum
+// number of elements a closure can hold. This number defaults to 3. The
+// actual maximum is rounded up in multiples of 3. Thus, if this value
+// is 4, the actual limit is 6. The ultimate maximum limit in this
+// implementation is 15.
+//
+// It should NOT be greater than PHOENIX_LIMIT!
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#if !defined(BOOST_SPIRIT_CLOSURE_LIMIT)
+#define BOOST_SPIRIT_CLOSURE_LIMIT PHOENIX_LIMIT
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// ensure BOOST_SPIRIT_CLOSURE_LIMIT <= PHOENIX_LIMIT and SPIRIT_CLOSURE_LIMIT <= 15
+//
+///////////////////////////////////////////////////////////////////////////////
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLOSURE_LIMIT <= PHOENIX_LIMIT);
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLOSURE_LIMIT <= 15);
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // closure_context class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ClosureT>
+ class closure_context : public parser_context_base
+ {
+ public:
+
+ typedef typename ::phoenix::tuple_element<0,
+ typename ClosureT::tuple_t>::type attr_t;
+ typedef ClosureT base_t;
+ typedef closure_context_linker<closure_context<ClosureT> >
+ context_linker_t;
+
+ closure_context(ClosureT const& clos)
+ : frame(clos) {}
+
+ ~closure_context() {}
+
+ template <typename ParserT, typename ScannerT>
+ void pre_parse(ParserT const&, ScannerT const&) {}
+
+ template <typename ResultT, typename ParserT, typename ScannerT>
+ ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&)
+ { hit.value(frame[::phoenix::tuple_index<0>()]); return hit; }
+
+ private:
+
+ ::phoenix::closure_frame<typename ClosureT::phoenix_closure_t> frame;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // init_closure_context class
+ //
+ // The init_closure_context class is a special parser context type
+ // which additionally initializes a closure contained in the derived
+ // parser with values from a given tuple. Please note, that this
+ // given tuple does not contain the required values directly, it
+ // contains phoenix::actor objects. These actors have to be
+ // dereferenced to gain the values to be used for initialization
+ // (this is done by the help of the phoenix::convert_actors<>
+ // template).
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ template <typename ClosureT>
+ class init_closure_context : public parser_context_base
+ {
+ typedef typename ClosureT::tuple_t tuple_t;
+ typedef typename ClosureT::closure_t closure_t;
+
+ public:
+
+ init_closure_context(ClosureT const& clos)
+ : frame(clos.subject(), ::phoenix::convert_actors<tuple_t>(clos.init)) {}
+
+ ~init_closure_context() {}
+
+ template <typename ParserT, typename ScannerT>
+ void pre_parse(ParserT const& /*p*/, ScannerT const&) {}
+
+ template <typename ResultT, typename ParserT, typename ScannerT>
+ ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&)
+ { hit.value(frame[::phoenix::tuple_index<0>()]); return hit; }
+
+ private:
+
+ ::phoenix::closure_frame<closure_t> frame;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // init_closure_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ParserT, typename ActorTupleT>
+ struct init_closure_parser
+ : public unary<ParserT, parser<init_closure_parser<ParserT, ActorTupleT> > >
+ {
+ typedef init_closure_parser<ParserT, ActorTupleT> self_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+ typedef typename ParserT::phoenix_closure_t closure_t;
+ typedef typename ParserT::tuple_t tuple_t;
+ typedef typename ::phoenix::tuple_element<0, tuple_t>::type attr_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, attr_t>::type type;
+ };
+
+ init_closure_parser(ParserT const& p, ActorTupleT const& init_)
+ : base_t(p), init(init_) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse_main(ScannerT const& scan) const
+ {
+ return this->subject().parse_main(scan);
+ }
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef init_closure_context<self_t> init_context_t;
+ typedef parser_scanner_linker<ScannerT> scanner_t;
+ typedef closure_context_linker<init_context_t> context_t;
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ BOOST_SPIRIT_CONTEXT_PARSE(
+ scan, *this, scanner_t, context_t, result_t);
+ }
+
+ ActorTupleT init;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // closure class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename DerivedT
+ , typename T0
+ , typename T1
+ , typename T2
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+ , typename T3
+ , typename T4
+ , typename T5
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+ , typename T6
+ , typename T7
+ , typename T8
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+ , typename T9
+ , typename T10
+ , typename T11
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+ , typename T12
+ , typename T13
+ , typename T14
+ #endif
+ #endif
+ #endif
+ #endif
+ >
+ struct closure :
+ public ::phoenix::closure<
+ T0, T1, T2
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+ , T3, T4, T5
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+ , T6, T7, T8
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+ , T9, T10, T11
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+ , T12, T13, T14
+ #endif
+ #endif
+ #endif
+ #endif
+ >
+ {
+ typedef ::phoenix::closure<
+ T0, T1, T2
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+ , T3, T4, T5
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+ , T6, T7, T8
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+ , T9, T10, T11
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+ , T12, T13, T14
+ #endif
+ #endif
+ #endif
+ #endif
+ > phoenix_closure_t;
+
+ typedef closure_context<DerivedT> context_t;
+
+ template <typename DerivedT2>
+ struct aux
+ {
+ DerivedT2& aux_derived()
+ { return *static_cast<DerivedT2*>(this); }
+
+ DerivedT2 const& aux_derived() const
+ { return *static_cast<DerivedT2 const*>(this); }
+
+ // initialization functions
+ template <typename A>
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type
+ >
+ >
+ operator()(A const &a) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef ::phoenix::tuple<a_t> actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a)
+ )
+ );
+ }
+
+ template <typename A, typename B>
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type
+ >
+ >
+ operator()(A const &a, B const &b) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef ::phoenix::tuple<a_t, b_t> actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b)
+ )
+ );
+ }
+
+ template <typename A, typename B, typename C>
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type
+ >
+ >
+ operator()(A const &a, B const &b, C const &c) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef ::phoenix::tuple<a_t, b_t, c_t> actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c)
+ )
+ );
+ }
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+
+ template <
+ typename A, typename B, typename C, typename D
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d)
+ )
+ );
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e)
+ )
+ );
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f)
+ )
+ );
+ }
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g)
+ )
+ );
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type,
+ typename ::phoenix::as_actor<H>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g, H const &h
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef typename ::phoenix::as_actor<H>::type h_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g),
+ ::phoenix::as_actor<H>::convert(h)
+ )
+ );
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type,
+ typename ::phoenix::as_actor<H>::type,
+ typename ::phoenix::as_actor<I>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g, H const &h, I const &i
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef typename ::phoenix::as_actor<H>::type h_t;
+ typedef typename ::phoenix::as_actor<I>::type i_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g),
+ ::phoenix::as_actor<H>::convert(h),
+ ::phoenix::as_actor<I>::convert(i)
+ )
+ );
+ }
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type,
+ typename ::phoenix::as_actor<H>::type,
+ typename ::phoenix::as_actor<I>::type,
+ typename ::phoenix::as_actor<J>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g, H const &h, I const &i, J const &j
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef typename ::phoenix::as_actor<H>::type h_t;
+ typedef typename ::phoenix::as_actor<I>::type i_t;
+ typedef typename ::phoenix::as_actor<J>::type j_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g),
+ ::phoenix::as_actor<H>::convert(h),
+ ::phoenix::as_actor<I>::convert(i),
+ ::phoenix::as_actor<J>::convert(j)
+ )
+ );
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type,
+ typename ::phoenix::as_actor<H>::type,
+ typename ::phoenix::as_actor<I>::type,
+ typename ::phoenix::as_actor<J>::type,
+ typename ::phoenix::as_actor<K>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g, H const &h, I const &i, J const &j,
+ K const &k
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef typename ::phoenix::as_actor<H>::type h_t;
+ typedef typename ::phoenix::as_actor<I>::type i_t;
+ typedef typename ::phoenix::as_actor<J>::type j_t;
+ typedef typename ::phoenix::as_actor<K>::type k_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+ k_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g),
+ ::phoenix::as_actor<H>::convert(h),
+ ::phoenix::as_actor<I>::convert(i),
+ ::phoenix::as_actor<J>::convert(j),
+ ::phoenix::as_actor<K>::convert(k)
+ )
+ );
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type,
+ typename ::phoenix::as_actor<H>::type,
+ typename ::phoenix::as_actor<I>::type,
+ typename ::phoenix::as_actor<J>::type,
+ typename ::phoenix::as_actor<K>::type,
+ typename ::phoenix::as_actor<L>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g, H const &h, I const &i, J const &j,
+ K const &k, L const &l
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef typename ::phoenix::as_actor<H>::type h_t;
+ typedef typename ::phoenix::as_actor<I>::type i_t;
+ typedef typename ::phoenix::as_actor<J>::type j_t;
+ typedef typename ::phoenix::as_actor<K>::type k_t;
+ typedef typename ::phoenix::as_actor<L>::type l_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+ k_t, l_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g),
+ ::phoenix::as_actor<H>::convert(h),
+ ::phoenix::as_actor<I>::convert(i),
+ ::phoenix::as_actor<J>::convert(j),
+ ::phoenix::as_actor<K>::convert(k),
+ ::phoenix::as_actor<L>::convert(l)
+ )
+ );
+ }
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type,
+ typename ::phoenix::as_actor<H>::type,
+ typename ::phoenix::as_actor<I>::type,
+ typename ::phoenix::as_actor<J>::type,
+ typename ::phoenix::as_actor<K>::type,
+ typename ::phoenix::as_actor<L>::type,
+ typename ::phoenix::as_actor<M>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g, H const &h, I const &i, J const &j,
+ K const &k, L const &l, M const &m
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef typename ::phoenix::as_actor<H>::type h_t;
+ typedef typename ::phoenix::as_actor<I>::type i_t;
+ typedef typename ::phoenix::as_actor<J>::type j_t;
+ typedef typename ::phoenix::as_actor<K>::type k_t;
+ typedef typename ::phoenix::as_actor<L>::type l_t;
+ typedef typename ::phoenix::as_actor<M>::type m_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+ k_t, l_t, m_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g),
+ ::phoenix::as_actor<H>::convert(h),
+ ::phoenix::as_actor<I>::convert(i),
+ ::phoenix::as_actor<J>::convert(j),
+ ::phoenix::as_actor<K>::convert(k),
+ ::phoenix::as_actor<L>::convert(l),
+ ::phoenix::as_actor<M>::convert(m)
+ )
+ );
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type,
+ typename ::phoenix::as_actor<H>::type,
+ typename ::phoenix::as_actor<I>::type,
+ typename ::phoenix::as_actor<J>::type,
+ typename ::phoenix::as_actor<K>::type,
+ typename ::phoenix::as_actor<L>::type,
+ typename ::phoenix::as_actor<M>::type,
+ typename ::phoenix::as_actor<N>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g, H const &h, I const &i, J const &j,
+ K const &k, L const &l, M const &m, N const &n
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef typename ::phoenix::as_actor<H>::type h_t;
+ typedef typename ::phoenix::as_actor<I>::type i_t;
+ typedef typename ::phoenix::as_actor<J>::type j_t;
+ typedef typename ::phoenix::as_actor<K>::type k_t;
+ typedef typename ::phoenix::as_actor<L>::type l_t;
+ typedef typename ::phoenix::as_actor<M>::type m_t;
+ typedef typename ::phoenix::as_actor<N>::type n_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+ k_t, l_t, m_t, n_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g),
+ ::phoenix::as_actor<H>::convert(h),
+ ::phoenix::as_actor<I>::convert(i),
+ ::phoenix::as_actor<J>::convert(j),
+ ::phoenix::as_actor<K>::convert(k),
+ ::phoenix::as_actor<L>::convert(l),
+ ::phoenix::as_actor<M>::convert(m),
+ ::phoenix::as_actor<N>::convert(n)
+ )
+ );
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+ >
+ init_closure_parser<
+ DerivedT2,
+ ::phoenix::tuple<
+ typename ::phoenix::as_actor<A>::type,
+ typename ::phoenix::as_actor<B>::type,
+ typename ::phoenix::as_actor<C>::type,
+ typename ::phoenix::as_actor<D>::type,
+ typename ::phoenix::as_actor<E>::type,
+ typename ::phoenix::as_actor<F>::type,
+ typename ::phoenix::as_actor<G>::type,
+ typename ::phoenix::as_actor<H>::type,
+ typename ::phoenix::as_actor<I>::type,
+ typename ::phoenix::as_actor<J>::type,
+ typename ::phoenix::as_actor<K>::type,
+ typename ::phoenix::as_actor<L>::type,
+ typename ::phoenix::as_actor<M>::type,
+ typename ::phoenix::as_actor<N>::type,
+ typename ::phoenix::as_actor<O>::type
+ >
+ >
+ operator()(
+ A const &a, B const &b, C const &c, D const &d, E const &e,
+ F const &f, G const &g, H const &h, I const &i, J const &j,
+ K const &k, L const &l, M const &m, N const &n, O const &o
+ ) const
+ {
+ typedef typename ::phoenix::as_actor<A>::type a_t;
+ typedef typename ::phoenix::as_actor<B>::type b_t;
+ typedef typename ::phoenix::as_actor<C>::type c_t;
+ typedef typename ::phoenix::as_actor<D>::type d_t;
+ typedef typename ::phoenix::as_actor<E>::type e_t;
+ typedef typename ::phoenix::as_actor<F>::type f_t;
+ typedef typename ::phoenix::as_actor<G>::type g_t;
+ typedef typename ::phoenix::as_actor<H>::type h_t;
+ typedef typename ::phoenix::as_actor<I>::type i_t;
+ typedef typename ::phoenix::as_actor<J>::type j_t;
+ typedef typename ::phoenix::as_actor<K>::type k_t;
+ typedef typename ::phoenix::as_actor<L>::type l_t;
+ typedef typename ::phoenix::as_actor<M>::type m_t;
+ typedef typename ::phoenix::as_actor<N>::type n_t;
+ typedef typename ::phoenix::as_actor<O>::type o_t;
+ typedef ::phoenix::tuple<
+ a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+ k_t, l_t, m_t, n_t, o_t
+ > actor_tuple_t;
+
+ return init_closure_parser<DerivedT2, actor_tuple_t>(
+ aux_derived(),
+ actor_tuple_t(
+ ::phoenix::as_actor<A>::convert(a),
+ ::phoenix::as_actor<B>::convert(b),
+ ::phoenix::as_actor<C>::convert(c),
+ ::phoenix::as_actor<D>::convert(d),
+ ::phoenix::as_actor<E>::convert(e),
+ ::phoenix::as_actor<F>::convert(f),
+ ::phoenix::as_actor<G>::convert(g),
+ ::phoenix::as_actor<H>::convert(h),
+ ::phoenix::as_actor<I>::convert(i),
+ ::phoenix::as_actor<J>::convert(j),
+ ::phoenix::as_actor<K>::convert(k),
+ ::phoenix::as_actor<L>::convert(l),
+ ::phoenix::as_actor<M>::convert(m),
+ ::phoenix::as_actor<N>::convert(n),
+ ::phoenix::as_actor<O>::convert(o)
+ )
+ );
+ }
+
+ #endif
+ #endif
+ #endif
+ #endif
+ };
+
+ ~closure() {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // overloads for chseq_p and str_p taking in phoenix actors
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ActorT>
+ struct container_begin
+ {
+ typedef container_begin<ActorT> self_t;
+
+ template <typename TupleT>
+ struct result
+ {
+ typedef typename ::phoenix::actor_result<ActorT, TupleT>
+ ::plain_type::iterator type;
+ };
+
+ container_begin(ActorT actor_)
+ : actor(actor_) {}
+
+ template <typename TupleT>
+ typename ::phoenix::actor_result<self_t, TupleT>::type
+ eval(TupleT const& /*args*/) const
+ { return actor().begin(); }
+
+ ActorT actor;
+ };
+
+ template <typename ActorT>
+ struct container_end
+ {
+ typedef container_begin<ActorT> self_t;
+
+ template <typename TupleT>
+ struct result
+ {
+ typedef typename ::phoenix::actor_result<ActorT, TupleT>
+ ::plain_type::iterator type;
+ };
+
+ container_end(ActorT actor_)
+ : actor(actor_) {}
+
+ template <typename TupleT>
+ typename ::phoenix::actor_result<self_t, TupleT>::type
+ eval(TupleT const& /*args*/) const
+ { return actor().end(); }
+
+ ActorT actor;
+ };
+
+ template <typename BaseT>
+ inline f_chseq<
+ ::phoenix::actor<container_begin< ::phoenix::actor<BaseT> > >,
+ ::phoenix::actor<container_end< ::phoenix::actor<BaseT> > >
+ >
+ f_chseq_p(::phoenix::actor<BaseT> const& a)
+ {
+ typedef ::phoenix::actor<container_begin< ::phoenix::actor<BaseT> > >
+ container_begin_t;
+ typedef ::phoenix::actor<container_end< ::phoenix::actor<BaseT> > >
+ container_end_t;
+ typedef f_chseq<container_begin_t, container_end_t> result_t;
+
+ return result_t(container_begin_t(a), container_end_t(a));
+ }
+
+ template <typename BaseT>
+ inline f_strlit<
+ ::phoenix::actor<container_begin< ::phoenix::actor<BaseT> > >,
+ ::phoenix::actor<container_end< ::phoenix::actor<BaseT> > >
+ >
+ f_str_p(::phoenix::actor<BaseT> const& a)
+ {
+ typedef ::phoenix::actor<container_begin< ::phoenix::actor<BaseT> > >
+ container_begin_t;
+ typedef ::phoenix::actor<container_end< ::phoenix::actor<BaseT> > >
+ container_end_t;
+ typedef f_strlit<container_begin_t, container_end_t> result_t;
+
+ return result_t(container_begin_t(a), container_end_t(a));
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/attribute/closure_context.hpp b/boost/spirit/home/classic/attribute/closure_context.hpp
new file mode 100644
index 0000000000..e366854964
--- /dev/null
+++ b/boost/spirit/home/classic/attribute/closure_context.hpp
@@ -0,0 +1,56 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CLOSURE_CONTEXT_HPP)
+#define BOOST_SPIRIT_CLOSURE_CONTEXT_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+#if !defined(BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED)
+#define BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// closure_context_linker
+// { helper template for the closure extendability }
+//
+// This classes can be 'overloaded' (defined elsewhere), to plug
+// in additional functionality into the closure parsing process.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename ContextT>
+struct closure_context_linker : public ContextT
+{
+ template <typename ParserT>
+ closure_context_linker(ParserT const& p)
+ : ContextT(p) {}
+
+ template <typename ParserT, typename ScannerT>
+ void pre_parse(ParserT const& p, ScannerT const& scan)
+ { ContextT::pre_parse(p, scan); }
+
+ template <typename ResultT, typename ParserT, typename ScannerT>
+ ResultT&
+ post_parse(ResultT& hit, ParserT const& p, ScannerT const& scan)
+ { return ContextT::post_parse(hit, p, scan); }
+};
+
+#endif // !defined(BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED)
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_CLOSURE_CONTEXT_HPP
diff --git a/boost/spirit/home/classic/attribute/closure_fwd.hpp b/boost/spirit/home/classic/attribute/closure_fwd.hpp
new file mode 100644
index 0000000000..033d619c2f
--- /dev/null
+++ b/boost/spirit/home/classic/attribute/closure_fwd.hpp
@@ -0,0 +1,69 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CLOSURE_FWD_HPP)
+#define BOOST_SPIRIT_CLOSURE_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+
+#if !defined(BOOST_SPIRIT_CLOSURE_LIMIT)
+# define BOOST_SPIRIT_CLOSURE_LIMIT PHOENIX_LIMIT
+#endif
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template<typename ClosureT>
+ class closure_context;
+
+ template <typename ClosureT>
+ class init_closure_context;
+
+ template <typename ParserT, typename ActorTupleT>
+ struct init_closure_parser;
+
+ template <
+ typename DerivedT
+ , typename T0 = ::phoenix::nil_t
+ , typename T1 = ::phoenix::nil_t
+ , typename T2 = ::phoenix::nil_t
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+ , typename T3 = ::phoenix::nil_t
+ , typename T4 = ::phoenix::nil_t
+ , typename T5 = ::phoenix::nil_t
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+ , typename T6 = ::phoenix::nil_t
+ , typename T7 = ::phoenix::nil_t
+ , typename T8 = ::phoenix::nil_t
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+ , typename T9 = ::phoenix::nil_t
+ , typename T10 = ::phoenix::nil_t
+ , typename T11 = ::phoenix::nil_t
+
+ #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+ , typename T12 = ::phoenix::nil_t
+ , typename T13 = ::phoenix::nil_t
+ , typename T14 = ::phoenix::nil_t
+
+ #endif
+ #endif
+ #endif
+ #endif
+ >
+ struct closure;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/attribute/parametric.hpp b/boost/spirit/home/classic/attribute/parametric.hpp
new file mode 100644
index 0000000000..0c0b11ab09
--- /dev/null
+++ b/boost/spirit/home/classic/attribute/parametric.hpp
@@ -0,0 +1,144 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_PARAMETRIC_HPP
+#define BOOST_SPIRIT_PARAMETRIC_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // f_chlit class [ functional version of chlit ]
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ChGenT>
+ struct f_chlit : public char_parser<f_chlit<ChGenT> >
+ {
+ f_chlit(ChGenT chgen_)
+ : chgen(chgen_) {}
+
+ template <typename T>
+ bool test(T ch) const
+ { return ch == chgen(); }
+
+ ChGenT chgen;
+ };
+
+ template <typename ChGenT>
+ inline f_chlit<ChGenT>
+ f_ch_p(ChGenT chgen)
+ { return f_chlit<ChGenT>(chgen); }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // f_range class [ functional version of range ]
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ChGenAT, typename ChGenBT>
+ struct f_range : public char_parser<f_range<ChGenAT, ChGenBT> >
+ {
+ f_range(ChGenAT first_, ChGenBT last_)
+ : first(first_), last(last_)
+ {}
+
+ template <typename T>
+ bool test(T ch) const
+ {
+ BOOST_SPIRIT_ASSERT(first() <= last());
+ return (ch >= first()) && (ch <= last());
+ }
+
+ ChGenAT first;
+ ChGenBT last;
+ };
+
+ template <typename ChGenAT, typename ChGenBT>
+ inline f_range<ChGenAT, ChGenBT>
+ f_range_p(ChGenAT first, ChGenBT last)
+ { return f_range<ChGenAT, ChGenBT>(first, last); }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // f_chseq class [ functional version of chseq ]
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename IterGenAT, typename IterGenBT>
+ class f_chseq : public parser<f_chseq<IterGenAT, IterGenBT> >
+ {
+ public:
+
+ typedef f_chseq<IterGenAT, IterGenBT> self_t;
+
+ f_chseq(IterGenAT first_, IterGenBT last_)
+ : first(first_), last(last_) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::string_parser_parse<result_t>(first(), last(), scan);
+ }
+
+ private:
+
+ IterGenAT first;
+ IterGenBT last;
+ };
+
+ template <typename IterGenAT, typename IterGenBT>
+ inline f_chseq<IterGenAT, IterGenBT>
+ f_chseq_p(IterGenAT first, IterGenBT last)
+ { return f_chseq<IterGenAT, IterGenBT>(first, last); }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // f_strlit class [ functional version of strlit ]
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename IterGenAT, typename IterGenBT>
+ class f_strlit : public parser<f_strlit<IterGenAT, IterGenBT> >
+ {
+ public:
+
+ typedef f_strlit<IterGenAT, IterGenBT> self_t;
+
+ f_strlit(IterGenAT first, IterGenBT last)
+ : seq(first, last) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::contiguous_parser_parse<result_t>
+ (seq, scan, scan);
+ }
+
+ private:
+
+ f_chseq<IterGenAT, IterGenBT> seq;
+ };
+
+ template <typename IterGenAT, typename IterGenBT>
+ inline f_strlit<IterGenAT, IterGenBT>
+ f_str_p(IterGenAT first, IterGenBT last)
+ { return f_strlit<IterGenAT, IterGenBT>(first, last); }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/attribute/typeof.hpp b/boost/spirit/home/classic/attribute/typeof.hpp
new file mode 100644
index 0000000000..16bbd102a0
--- /dev/null
+++ b/boost/spirit/home/classic/attribute/typeof.hpp
@@ -0,0 +1,67 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ATTRIBUTE_TYPEOF_HPP)
+#define BOOST_SPIRIT_ATTRIBUTE_TYPEOF_HPP
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/typeof.hpp>
+#include <boost/spirit/home/classic/attribute/closure_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ // parametric.hpp
+ template<typename ChGenT> struct f_chlit;
+ template<typename ChGenAT, typename ChGenBT> struct f_range;
+ template<typename IterGenAT, typename IterGenBT> class f_chseq;
+ template<typename IterGenAT, typename IterGenBT> class f_strlit;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+
+// parametric.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::f_chlit,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::f_range,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::f_chseq,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::f_strlit,2)
+
+
+// closure.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::closure,BOOST_SPIRIT_CLOSURE_LIMIT)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::closure_context,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::init_closure_context,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::init_closure_parser,2)
+
+
+#if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::closure,12)
+#endif
+#if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::closure, 9)
+#endif
+#if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::closure, 6)
+#endif
+#if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::closure, 3)
+#endif
+
+
+
+#endif
+
diff --git a/boost/spirit/home/classic/core.hpp b/boost/spirit/home/classic/core.hpp
new file mode 100644
index 0000000000..4f9d806f17
--- /dev/null
+++ b/boost/spirit/home/classic/core.hpp
@@ -0,0 +1,73 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2001-2003 Hartmut Kaiser
+ Copyright (c) 2002-2003 Martin Wille
+ Copyright (c) 2002 Raghavendra Satish
+ Copyright (c) 2001 Bruce Florman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CORE_MAIN_HPP)
+#define BOOST_SPIRIT_CORE_MAIN_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+#include <boost/spirit/home/classic/debug.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Spirit.Core includes
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// Spirit.Core.Kernel
+#include <boost/spirit/home/classic/core/config.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+#include <boost/spirit/home/classic/core/match.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+
+// Spirit.Core.Primitives
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/primitives/numerics.hpp>
+
+// Spirit.Core.Scanner
+#include <boost/spirit/home/classic/core/scanner/scanner.hpp>
+#include <boost/spirit/home/classic/core/scanner/skipper.hpp>
+
+// Spirit.Core.NonTerminal
+#include <boost/spirit/home/classic/core/non_terminal/subrule.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/rule.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/grammar.hpp>
+
+// Spirit.Core.Composite
+#include <boost/spirit/home/classic/core/composite/actions.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/core/composite/directives.hpp>
+#include <boost/spirit/home/classic/core/composite/epsilon.hpp>
+#include <boost/spirit/home/classic/core/composite/sequence.hpp>
+#include <boost/spirit/home/classic/core/composite/sequential_and.hpp>
+#include <boost/spirit/home/classic/core/composite/sequential_or.hpp>
+#include <boost/spirit/home/classic/core/composite/alternative.hpp>
+#include <boost/spirit/home/classic/core/composite/difference.hpp>
+#include <boost/spirit/home/classic/core/composite/intersection.hpp>
+#include <boost/spirit/home/classic/core/composite/exclusive_or.hpp>
+#include <boost/spirit/home/classic/core/composite/kleene_star.hpp>
+#include <boost/spirit/home/classic/core/composite/positive.hpp>
+#include <boost/spirit/home/classic/core/composite/optional.hpp>
+#include <boost/spirit/home/classic/core/composite/list.hpp>
+#include <boost/spirit/home/classic/core/composite/no_actions.hpp>
+
+// Deprecated interface includes
+#include <boost/spirit/home/classic/actor/assign_actor.hpp>
+#include <boost/spirit/home/classic/actor/push_back_actor.hpp>
+
+#if defined(BOOST_SPIRIT_DEBUG)
+ //////////////////////////////////
+ #include <boost/spirit/home/classic/debug/parser_names.hpp>
+
+#endif // BOOST_SPIRIT_DEBUG
+
+#endif // BOOST_SPIRIT_CORE_MAIN_HPP
+
diff --git a/boost/spirit/home/classic/core/assert.hpp b/boost/spirit/home/classic/core/assert.hpp
new file mode 100644
index 0000000000..47b1b39909
--- /dev/null
+++ b/boost/spirit/home/classic/core/assert.hpp
@@ -0,0 +1,38 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ASSERT_HPP)
+#define BOOST_SPIRIT_ASSERT_HPP
+
+#include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// BOOST_SPIRIT_ASSERT is used throughout the framework. It can be
+// overridden by the user. If BOOST_SPIRIT_ASSERT_EXCEPTION is defined,
+// then that will be thrown, otherwise, BOOST_SPIRIT_ASSERT simply turns
+// into a plain BOOST_ASSERT()
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_ASSERT)
+#if defined(NDEBUG)
+ #define BOOST_SPIRIT_ASSERT(x)
+#elif defined (BOOST_SPIRIT_ASSERT_EXCEPTION)
+ #define BOOST_SPIRIT_ASSERT_AUX(f, l, x) BOOST_SPIRIT_ASSERT_AUX2(f, l, x)
+ #define BOOST_SPIRIT_ASSERT_AUX2(f, l, x) \
+ do{ if (!(x)) boost::throw_exception( \
+ BOOST_SPIRIT_ASSERT_EXCEPTION(f "(" #l "): " #x)); } while(0)
+ #define BOOST_SPIRIT_ASSERT(x) BOOST_SPIRIT_ASSERT_AUX(__FILE__, __LINE__, x)
+#else
+ #include <boost/assert.hpp>
+ #define BOOST_SPIRIT_ASSERT(x) BOOST_ASSERT(x)
+#endif
+#endif // !defined(BOOST_SPIRIT_ASSERT)
+
+#endif // BOOST_SPIRIT_ASSERT_HPP
diff --git a/boost/spirit/home/classic/core/composite/actions.hpp b/boost/spirit/home/classic/core/composite/actions.hpp
new file mode 100644
index 0000000000..864211f710
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/actions.hpp
@@ -0,0 +1,136 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTIONS_HPP
+#define BOOST_SPIRIT_ACTIONS_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // action class
+ //
+ // The action class binds a parser with a user defined semantic
+ // action. Instances of action are never created manually. Instead,
+ // action objects are typically created indirectly through
+ // expression templates of the form:
+ //
+ // p[f]
+ //
+ // where p is a parser and f is a function or functor. The semantic
+ // action may be a function or a functor. When the parser is
+ // successful, the actor calls the scanner's action_policy policy
+ // (see scanner.hpp):
+ //
+ // scan.do_action(actor, attribute, first, last);
+ //
+ // passing in these information:
+ //
+ // actor: The action's function or functor
+ // attribute: The match (returned by the parser) object's
+ // attribute (see match.hpp)
+ // first: Iterator pointing to the start of the matching
+ // portion of the input
+ // last: Iterator pointing to one past the end of the
+ // matching portion of the input
+ //
+ // It is the responsibility of the scanner's action_policy policy to
+ // dispatch the function or functor as it sees fit. The expected
+ // function or functor signature depends on the parser being
+ // wrapped. In general, if the attribute type of the parser being
+ // wrapped is a nil_t, the function or functor expect the signature:
+ //
+ // void func(Iterator first, Iterator last); // functions
+ //
+ // struct ftor // functors
+ // {
+ // void func(Iterator first, Iterator last) const;
+ // };
+ //
+ // where Iterator is the type of the iterator that is being used and
+ // first and last are the iterators pointing to the matching portion
+ // of the input.
+ //
+ // If the attribute type of the parser being wrapped is not a nil_t,
+ // the function or functor usually expect the signature:
+ //
+ // void func(T val); // functions
+ //
+ // struct ftor // functors
+ // {
+ // void func(T val) const;
+ // };
+ //
+ // where T is the attribute type and val is the attribute value
+ // returned by the parser being wrapped.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ParserT, typename ActionT>
+ class action : public unary<ParserT, parser<action<ParserT, ActionT> > >
+ {
+ public:
+
+ typedef action<ParserT, ActionT> self_t;
+ typedef action_parser_category parser_category_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+ typedef ActionT predicate_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ action(ParserT const& p, ActionT const& a)
+ : base_t(p)
+ , actor(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+
+ scan.at_end(); // allow skipper to take effect
+ iterator_t save = scan.first;
+ result_t hit = this->subject().parse(scan);
+ if (hit)
+ {
+ typename result_t::return_t val = hit.value();
+ scan.do_action(actor, val, save, scan.first);
+ }
+ return hit;
+ }
+
+ ActionT const& predicate() const { return actor; }
+
+ private:
+
+ ActionT actor;
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/alternative.hpp b/boost/spirit/home/classic/core/composite/alternative.hpp
new file mode 100644
index 0000000000..5e472a9a64
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/alternative.hpp
@@ -0,0 +1,147 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ALTERNATIVE_HPP)
+#define BOOST_SPIRIT_ALTERNATIVE_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // alternative class
+ //
+ // Handles expressions of the form:
+ //
+ // a | b
+ //
+ // where a and b are parsers. The expression returns a composite
+ // parser that matches a or b. One (not both) of the operands may
+ // be a literal char, wchar_t or a primitive string char const*,
+ // wchar_t const*.
+ //
+ // The expression is short circuit evaluated. b is never touched
+ // when a is returns a successful match.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct alternative_parser_gen;
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ template <typename A, typename B>
+ struct alternative
+ : public binary<A, B, parser<alternative<A, B> > >
+ {
+ typedef alternative<A, B> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef alternative_parser_gen parser_generator_t;
+ typedef binary<A, B, parser<self_t> > base_t;
+
+ alternative(A const& a, B const& b)
+ : base_t(a, b) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ { // scope for save
+ iterator_t save = scan.first;
+ if (result_t hit = this->left().parse(scan))
+ return hit;
+ scan.first = save;
+ }
+ return this->right().parse(scan);
+ }
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+ struct alternative_parser_gen
+ {
+ template <typename A, typename B>
+ struct result
+ {
+ typedef
+ alternative<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ type;
+ };
+
+ template <typename A, typename B>
+ static alternative<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ generate(A const& a, B const& b)
+ {
+ return alternative<BOOST_DEDUCED_TYPENAME as_parser<A>::type,
+ BOOST_DEDUCED_TYPENAME as_parser<B>::type>
+ (as_parser<A>::convert(a), as_parser<B>::convert(b));
+ }
+ };
+
+ template <typename A, typename B>
+ alternative<A, B>
+ operator|(parser<A> const& a, parser<B> const& b);
+
+ template <typename A>
+ alternative<A, chlit<char> >
+ operator|(parser<A> const& a, char b);
+
+ template <typename B>
+ alternative<chlit<char>, B>
+ operator|(char a, parser<B> const& b);
+
+ template <typename A>
+ alternative<A, strlit<char const*> >
+ operator|(parser<A> const& a, char const* b);
+
+ template <typename B>
+ alternative<strlit<char const*>, B>
+ operator|(char const* a, parser<B> const& b);
+
+ template <typename A>
+ alternative<A, chlit<wchar_t> >
+ operator|(parser<A> const& a, wchar_t b);
+
+ template <typename B>
+ alternative<chlit<wchar_t>, B>
+ operator|(wchar_t a, parser<B> const& b);
+
+ template <typename A>
+ alternative<A, strlit<wchar_t const*> >
+ operator|(parser<A> const& a, wchar_t const* b);
+
+ template <typename B>
+ alternative<strlit<wchar_t const*>, B>
+ operator|(wchar_t const* a, parser<B> const& b);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/alternative.ipp>
diff --git a/boost/spirit/home/classic/core/composite/composite.hpp b/boost/spirit/home/classic/core/composite/composite.hpp
new file mode 100644
index 0000000000..b156cab198
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/composite.hpp
@@ -0,0 +1,151 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_COMPOSITE_HPP)
+#define BOOST_SPIRIT_COMPOSITE_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/compressed_pair.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // unary class.
+ //
+ // Composite class composed of a single subject. This template class
+ // is parameterized by the subject type S and a base class to
+ // inherit from, BaseT. The unary class is meant to be a base class
+ // to inherit from. The inheritance structure, given the BaseT
+ // template parameter places the unary class in the middle of a
+ // linear, single parent hierarchy. For instance, given a class S
+ // and a base class B, a class D can derive from unary:
+ //
+ // struct D : public unary<S, B> {...};
+ //
+ // The inheritance structure is thus:
+ //
+ // B
+ // |
+ // unary (has S)
+ // |
+ // D
+ //
+ // The subject can be accessed from the derived class D as:
+ // this->subject();
+ //
+ // Typically, the subject S is specified as typename S::embed_t.
+ // embed_t specifies how the subject is embedded in the composite
+ // (See parser.hpp for details).
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename S, typename BaseT>
+ class unary : public BaseT
+ {
+ public:
+
+ typedef BaseT base_t;
+ typedef typename boost::call_traits<S>::param_type param_t;
+ typedef typename boost::call_traits<S>::const_reference return_t;
+ typedef S subject_t;
+ typedef typename S::embed_t subject_embed_t;
+
+ unary(param_t subj_)
+ : base_t(), subj(subj_) {}
+
+ unary(BaseT const& base, param_t subj_)
+ : base_t(base), subj(subj_) {}
+
+ return_t
+ subject() const
+ { return subj; }
+
+ private:
+
+ subject_embed_t subj;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // binary class.
+ //
+ // Composite class composed of a pair (left and right). This
+ // template class is parameterized by the left and right subject
+ // types A and B and a base class to inherit from, BaseT. The binary
+ // class is meant to be a base class to inherit from. The
+ // inheritance structure, given the BaseT template parameter places
+ // the binary class in the middle of a linear, single parent
+ // hierarchy. For instance, given classes X and Y and a base class
+ // B, a class D can derive from binary:
+ //
+ // struct D : public binary<X, Y, B> {...};
+ //
+ // The inheritance structure is thus:
+ //
+ // B
+ // |
+ // binary (has X and Y)
+ // |
+ // D
+ //
+ // The left and right subjects can be accessed from the derived
+ // class D as: this->left(); and this->right();
+ //
+ // Typically, the pairs X and Y are specified as typename X::embed_t
+ // and typename Y::embed_t. embed_t specifies how the subject is
+ // embedded in the composite (See parser.hpp for details).
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B, typename BaseT>
+ class binary : public BaseT
+ {
+ public:
+
+ typedef BaseT base_t;
+ typedef typename boost::call_traits<A>::param_type left_param_t;
+ typedef typename boost::call_traits<A>::const_reference left_return_t;
+ typedef typename boost::call_traits<B>::param_type right_param_t;
+ typedef typename boost::call_traits<B>::const_reference right_return_t;
+ typedef A left_t;
+ typedef typename A::embed_t left_embed_t;
+ typedef B right_t;
+ typedef typename B::embed_t right_embed_t;
+
+ binary(left_param_t a, right_param_t b)
+ : base_t(), subj(a, b) {}
+
+ left_return_t
+ left() const
+ { return subj.first(); }
+
+ right_return_t
+ right() const
+ { return subj.second(); }
+
+ private:
+
+ boost::compressed_pair<left_embed_t, right_embed_t> subj;
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/difference.hpp b/boost/spirit/home/classic/core/composite/difference.hpp
new file mode 100644
index 0000000000..7d1cb1433d
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/difference.hpp
@@ -0,0 +1,150 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DIFFERENCE_HPP)
+#define BOOST_SPIRIT_DIFFERENCE_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // difference: a - b; Matches a but not b
+ //
+ // Handles expressions of the form:
+ //
+ // a - b
+ //
+ // where a and b are parsers. The expression returns a composite
+ // parser that matches a but not b. One (not both) of the operands
+ // may be a literal char, wchar_t or a primitive string char const*,
+ // wchar_t const*.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct difference_parser_gen;
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ template <typename A, typename B>
+ struct difference
+ : public binary<A, B, parser<difference<A, B> > >
+ {
+ typedef difference<A, B> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef difference_parser_gen parser_generator_t;
+ typedef binary<A, B, parser<self_t> > base_t;
+
+ difference(A const& a, B const& b)
+ : base_t(a, b) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ iterator_t save = scan.first;
+ if (result_t hl = this->left().parse(scan))
+ {
+ std::swap(save, scan.first);
+ result_t hr = this->right().parse(scan);
+ if (!hr || (hr.length() < hl.length()))
+ {
+ scan.first = save;
+ return hl;
+ }
+ }
+
+ return scan.no_match();
+ }
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+ struct difference_parser_gen
+ {
+ template <typename A, typename B>
+ struct result
+ {
+ typedef
+ difference<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ type;
+ };
+
+ template <typename A, typename B>
+ static difference<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ generate(A const& a, B const& b)
+ {
+ return difference<BOOST_DEDUCED_TYPENAME as_parser<A>::type,
+ BOOST_DEDUCED_TYPENAME as_parser<B>::type>
+ (as_parser<A>::convert(a), as_parser<B>::convert(b));
+ }
+ };
+
+ template <typename A, typename B>
+ difference<A, B>
+ operator-(parser<A> const& a, parser<B> const& b);
+
+ template <typename A>
+ difference<A, chlit<char> >
+ operator-(parser<A> const& a, char b);
+
+ template <typename B>
+ difference<chlit<char>, B>
+ operator-(char a, parser<B> const& b);
+
+ template <typename A>
+ difference<A, strlit<char const*> >
+ operator-(parser<A> const& a, char const* b);
+
+ template <typename B>
+ difference<strlit<char const*>, B>
+ operator-(char const* a, parser<B> const& b);
+
+ template <typename A>
+ difference<A, chlit<wchar_t> >
+ operator-(parser<A> const& a, wchar_t b);
+
+ template <typename B>
+ difference<chlit<wchar_t>, B>
+ operator-(wchar_t a, parser<B> const& b);
+
+ template <typename A>
+ difference<A, strlit<wchar_t const*> >
+ operator-(parser<A> const& a, wchar_t const* b);
+
+ template <typename B>
+ difference<strlit<wchar_t const*>, B>
+ operator-(wchar_t const* a, parser<B> const& b);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/difference.ipp>
diff --git a/boost/spirit/home/classic/core/composite/directives.hpp b/boost/spirit/home/classic/core/composite/directives.hpp
new file mode 100644
index 0000000000..a66efa281f
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/directives.hpp
@@ -0,0 +1,607 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DIRECTIVES_HPP)
+#define BOOST_SPIRIT_DIRECTIVES_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <algorithm>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/scanner/skipper.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/core/composite/impl/directives.ipp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // contiguous class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct lexeme_parser_gen;
+
+ template <typename ParserT>
+ struct contiguous
+ : public unary<ParserT, parser<contiguous<ParserT> > >
+ {
+ typedef contiguous<ParserT> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef lexeme_parser_gen parser_generator_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ contiguous(ParserT const& p)
+ : base_t(p) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::contiguous_parser_parse<result_t>
+ (this->subject(), scan, scan);
+ }
+ };
+
+ struct lexeme_parser_gen
+ {
+ template <typename ParserT>
+ struct result {
+
+ typedef contiguous<ParserT> type;
+ };
+
+ template <typename ParserT>
+ static contiguous<ParserT>
+ generate(parser<ParserT> const& subject)
+ {
+ return contiguous<ParserT>(subject.derived());
+ }
+
+ template <typename ParserT>
+ contiguous<ParserT>
+ operator[](parser<ParserT> const& subject) const
+ {
+ return contiguous<ParserT>(subject.derived());
+ }
+ };
+
+ //////////////////////////////////
+ const lexeme_parser_gen lexeme_d = lexeme_parser_gen();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // lexeme_scanner
+ //
+ // Given a Scanner, return the correct scanner type that
+ // the lexeme_d uses. Scanner is assumed to be a phrase
+ // level scanner (see skipper.hpp)
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ScannerT>
+ struct lexeme_scanner
+ {
+ typedef scanner_policies<
+ no_skipper_iteration_policy<
+ typename ScannerT::iteration_policy_t>,
+ typename ScannerT::match_policy_t,
+ typename ScannerT::action_policy_t
+ > policies_t;
+
+ typedef typename
+ rebind_scanner_policies<ScannerT, policies_t>::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // inhibit_case_iteration_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename BaseT>
+ struct inhibit_case_iteration_policy : public BaseT
+ {
+ typedef BaseT base_t;
+
+ inhibit_case_iteration_policy()
+ : BaseT() {}
+
+ template <typename PolicyT>
+ inhibit_case_iteration_policy(PolicyT const& other)
+ : BaseT(other) {}
+
+ template <typename CharT>
+ CharT filter(CharT ch) const
+ { return impl::tolower_(ch); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // inhibit_case class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct inhibit_case_parser_gen;
+
+ template <typename ParserT>
+ struct inhibit_case
+ : public unary<ParserT, parser<inhibit_case<ParserT> > >
+ {
+ typedef inhibit_case<ParserT> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef inhibit_case_parser_gen parser_generator_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ inhibit_case(ParserT const& p)
+ : base_t(p) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::inhibit_case_parser_parse<result_t>
+ (this->subject(), scan, scan);
+ }
+ };
+
+ template <int N>
+ struct inhibit_case_parser_gen_base
+ {
+ // This hack is needed to make borland happy.
+ // If these member operators were defined in the
+ // inhibit_case_parser_gen class, or if this class
+ // is non-templated, borland ICEs.
+
+ static inhibit_case<strlit<char const*> >
+ generate(char const* str)
+ { return inhibit_case<strlit<char const*> >(str); }
+
+ static inhibit_case<strlit<wchar_t const*> >
+ generate(wchar_t const* str)
+ { return inhibit_case<strlit<wchar_t const*> >(str); }
+
+ static inhibit_case<chlit<char> >
+ generate(char ch)
+ { return inhibit_case<chlit<char> >(ch); }
+
+ static inhibit_case<chlit<wchar_t> >
+ generate(wchar_t ch)
+ { return inhibit_case<chlit<wchar_t> >(ch); }
+
+ template <typename ParserT>
+ static inhibit_case<ParserT>
+ generate(parser<ParserT> const& subject)
+ { return inhibit_case<ParserT>(subject.derived()); }
+
+ inhibit_case<strlit<char const*> >
+ operator[](char const* str) const
+ { return inhibit_case<strlit<char const*> >(str); }
+
+ inhibit_case<strlit<wchar_t const*> >
+ operator[](wchar_t const* str) const
+ { return inhibit_case<strlit<wchar_t const*> >(str); }
+
+ inhibit_case<chlit<char> >
+ operator[](char ch) const
+ { return inhibit_case<chlit<char> >(ch); }
+
+ inhibit_case<chlit<wchar_t> >
+ operator[](wchar_t ch) const
+ { return inhibit_case<chlit<wchar_t> >(ch); }
+
+ template <typename ParserT>
+ inhibit_case<ParserT>
+ operator[](parser<ParserT> const& subject) const
+ { return inhibit_case<ParserT>(subject.derived()); }
+ };
+
+ //////////////////////////////////
+ struct inhibit_case_parser_gen : public inhibit_case_parser_gen_base<0>
+ {
+ inhibit_case_parser_gen() {}
+ };
+
+ //////////////////////////////////
+ // Depracated
+ const inhibit_case_parser_gen nocase_d = inhibit_case_parser_gen();
+
+ // Preferred syntax
+ const inhibit_case_parser_gen as_lower_d = inhibit_case_parser_gen();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // as_lower_scanner
+ //
+ // Given a Scanner, return the correct scanner type that
+ // the as_lower_d uses. Scanner is assumed to be a scanner
+ // with an inhibit_case_iteration_policy.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ScannerT>
+ struct as_lower_scanner
+ {
+ typedef scanner_policies<
+ inhibit_case_iteration_policy<
+ typename ScannerT::iteration_policy_t>,
+ typename ScannerT::match_policy_t,
+ typename ScannerT::action_policy_t
+ > policies_t;
+
+ typedef typename
+ rebind_scanner_policies<ScannerT, policies_t>::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // longest_alternative class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct longest_parser_gen;
+
+ template <typename A, typename B>
+ struct longest_alternative
+ : public binary<A, B, parser<longest_alternative<A, B> > >
+ {
+ typedef longest_alternative<A, B> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef longest_parser_gen parser_generator_t;
+ typedef binary<A, B, parser<self_t> > base_t;
+
+ longest_alternative(A const& a, B const& b)
+ : base_t(a, b) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typename ScannerT::iterator_t save = scan.first;
+ result_t l = this->left().parse(scan);
+ std::swap(scan.first, save);
+ result_t r = this->right().parse(scan);
+
+ if (l || r)
+ {
+ if (l.length() > r.length())
+ {
+ scan.first = save;
+ return l;
+ }
+ return r;
+ }
+
+ return scan.no_match();
+ }
+ };
+
+ struct longest_parser_gen
+ {
+ template <typename A, typename B>
+ struct result {
+
+ typedef typename
+ impl::to_longest_alternative<alternative<A, B> >::result_t
+ type;
+ };
+
+ template <typename A, typename B>
+ static typename
+ impl::to_longest_alternative<alternative<A, B> >::result_t
+ generate(alternative<A, B> const& alt)
+ {
+ return impl::to_longest_alternative<alternative<A, B> >::
+ convert(alt);
+ }
+
+ //'generate' for binary composite
+ template <typename A, typename B>
+ static
+ longest_alternative<A, B>
+ generate(A const &left, B const &right)
+ {
+ return longest_alternative<A, B>(left, right);
+ }
+
+ template <typename A, typename B>
+ typename impl::to_longest_alternative<alternative<A, B> >::result_t
+ operator[](alternative<A, B> const& alt) const
+ {
+ return impl::to_longest_alternative<alternative<A, B> >::
+ convert(alt);
+ }
+ };
+
+ const longest_parser_gen longest_d = longest_parser_gen();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // shortest_alternative class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct shortest_parser_gen;
+
+ template <typename A, typename B>
+ struct shortest_alternative
+ : public binary<A, B, parser<shortest_alternative<A, B> > >
+ {
+ typedef shortest_alternative<A, B> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef shortest_parser_gen parser_generator_t;
+ typedef binary<A, B, parser<self_t> > base_t;
+
+ shortest_alternative(A const& a, B const& b)
+ : base_t(a, b) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typename ScannerT::iterator_t save = scan.first;
+ result_t l = this->left().parse(scan);
+ std::swap(scan.first, save);
+ result_t r = this->right().parse(scan);
+
+ if (l || r)
+ {
+ if ((l.length() < r.length() && l) || !r)
+ {
+ scan.first = save;
+ return l;
+ }
+ return r;
+ }
+
+ return scan.no_match();
+ }
+ };
+
+ struct shortest_parser_gen
+ {
+ template <typename A, typename B>
+ struct result {
+
+ typedef typename
+ impl::to_shortest_alternative<alternative<A, B> >::result_t
+ type;
+ };
+
+ template <typename A, typename B>
+ static typename
+ impl::to_shortest_alternative<alternative<A, B> >::result_t
+ generate(alternative<A, B> const& alt)
+ {
+ return impl::to_shortest_alternative<alternative<A, B> >::
+ convert(alt);
+ }
+
+ //'generate' for binary composite
+ template <typename A, typename B>
+ static
+ shortest_alternative<A, B>
+ generate(A const &left, B const &right)
+ {
+ return shortest_alternative<A, B>(left, right);
+ }
+
+ template <typename A, typename B>
+ typename impl::to_shortest_alternative<alternative<A, B> >::result_t
+ operator[](alternative<A, B> const& alt) const
+ {
+ return impl::to_shortest_alternative<alternative<A, B> >::
+ convert(alt);
+ }
+ };
+
+ const shortest_parser_gen shortest_d = shortest_parser_gen();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // min_bounded class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename BoundsT>
+ struct min_bounded_gen;
+
+ template <typename ParserT, typename BoundsT>
+ struct min_bounded
+ : public unary<ParserT, parser<min_bounded<ParserT, BoundsT> > >
+ {
+ typedef min_bounded<ParserT, BoundsT> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef min_bounded_gen<BoundsT> parser_generator_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ min_bounded(ParserT const& p, BoundsT const& min__)
+ : base_t(p)
+ , min_(min__) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ result_t hit = this->subject().parse(scan);
+ if (hit.has_valid_attribute() && hit.value() < min_)
+ return scan.no_match();
+ return hit;
+ }
+
+ BoundsT min_;
+ };
+
+ template <typename BoundsT>
+ struct min_bounded_gen
+ {
+ min_bounded_gen(BoundsT const& min__)
+ : min_(min__) {}
+
+ template <typename DerivedT>
+ min_bounded<DerivedT, BoundsT>
+ operator[](parser<DerivedT> const& p) const
+ { return min_bounded<DerivedT, BoundsT>(p.derived(), min_); }
+
+ BoundsT min_;
+ };
+
+ template <typename BoundsT>
+ inline min_bounded_gen<BoundsT>
+ min_limit_d(BoundsT const& min_)
+ { return min_bounded_gen<BoundsT>(min_); }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // max_bounded class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename BoundsT>
+ struct max_bounded_gen;
+
+ template <typename ParserT, typename BoundsT>
+ struct max_bounded
+ : public unary<ParserT, parser<max_bounded<ParserT, BoundsT> > >
+ {
+ typedef max_bounded<ParserT, BoundsT> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef max_bounded_gen<BoundsT> parser_generator_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ max_bounded(ParserT const& p, BoundsT const& max__)
+ : base_t(p)
+ , max_(max__) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ result_t hit = this->subject().parse(scan);
+ if (hit.has_valid_attribute() && hit.value() > max_)
+ return scan.no_match();
+ return hit;
+ }
+
+ BoundsT max_;
+ };
+
+ template <typename BoundsT>
+ struct max_bounded_gen
+ {
+ max_bounded_gen(BoundsT const& max__)
+ : max_(max__) {}
+
+ template <typename DerivedT>
+ max_bounded<DerivedT, BoundsT>
+ operator[](parser<DerivedT> const& p) const
+ { return max_bounded<DerivedT, BoundsT>(p.derived(), max_); }
+
+ BoundsT max_;
+ };
+
+ //////////////////////////////////
+ template <typename BoundsT>
+ inline max_bounded_gen<BoundsT>
+ max_limit_d(BoundsT const& max_)
+ { return max_bounded_gen<BoundsT>(max_); }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // bounded class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename BoundsT>
+ struct bounded_gen;
+
+ template <typename ParserT, typename BoundsT>
+ struct bounded
+ : public unary<ParserT, parser<bounded<ParserT, BoundsT> > >
+ {
+ typedef bounded<ParserT, BoundsT> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef bounded_gen<BoundsT> parser_generator_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ bounded(ParserT const& p, BoundsT const& min__, BoundsT const& max__)
+ : base_t(p)
+ , min_(min__)
+ , max_(max__) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ result_t hit = this->subject().parse(scan);
+ if (hit.has_valid_attribute() &&
+ (hit.value() < min_ || hit.value() > max_))
+ return scan.no_match();
+ return hit;
+ }
+
+ BoundsT min_, max_;
+ };
+
+ template <typename BoundsT>
+ struct bounded_gen
+ {
+ bounded_gen(BoundsT const& min__, BoundsT const& max__)
+ : min_(min__)
+ , max_(max__) {}
+
+ template <typename DerivedT>
+ bounded<DerivedT, BoundsT>
+ operator[](parser<DerivedT> const& p) const
+ { return bounded<DerivedT, BoundsT>(p.derived(), min_, max_); }
+
+ BoundsT min_, max_;
+ };
+
+ template <typename BoundsT>
+ inline bounded_gen<BoundsT>
+ limit_d(BoundsT const& min_, BoundsT const& max_)
+ { return bounded_gen<BoundsT>(min_, max_); }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/composite/epsilon.hpp b/boost/spirit/home/classic/core/composite/epsilon.hpp
new file mode 100644
index 0000000000..f9654e2e51
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/epsilon.hpp
@@ -0,0 +1,276 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_EPSILON_HPP
+#define BOOST_SPIRIT_EPSILON_HPP
+
+////////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/meta/parser_traits.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/core/composite/no_actions.hpp>
+
+////////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// condition_parser class
+//
+// handles expresions of the form
+//
+// epsilon_p(cond)
+//
+// where cond is a function or a functor that returns a value suitable
+// to be used in boolean context. The expression returns a parser that
+// returns an empty match when the condition evaluates to true.
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <typename CondT, bool positive_ = true>
+ struct condition_parser : parser<condition_parser<CondT, positive_> >
+ {
+ typedef condition_parser<CondT, positive_> self_t;
+
+ // not explicit! (needed for implementation of if_p et al.)
+ condition_parser(CondT const& cond_) : cond(cond_) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ if (positive_ == bool(cond())) // allow cond to return int
+ return scan.empty_match();
+ else
+ return scan.no_match();
+ }
+
+ condition_parser<CondT, !positive_>
+ negate() const
+ { return condition_parser<CondT, !positive_>(cond); }
+
+ private:
+
+ CondT cond;
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1310) || \
+ BOOST_WORKAROUND(BOOST_MSVC, == 1400) || \
+ BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580)
+// VC 7.1, VC8 and Sun CC <= 5.8 do not support general
+// expressions of non-type template parameters in instantiations
+ template <typename CondT>
+ inline condition_parser<CondT, false>
+ operator~(condition_parser<CondT, true> const& p)
+ { return p.negate(); }
+
+ template <typename CondT>
+ inline condition_parser<CondT, true>
+ operator~(condition_parser<CondT, false> const& p)
+ { return p.negate(); }
+#else // BOOST_WORKAROUND(BOOST_MSVC, == 1310) || == 1400
+ template <typename CondT, bool positive>
+ inline condition_parser<CondT, !positive>
+ operator~(condition_parser<CondT, positive> const& p)
+ { return p.negate(); }
+#endif // BOOST_WORKAROUND(BOOST_MSVC, == 1310) || == 1400
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// empty_match_parser class
+//
+// handles expressions of the form
+// epsilon_p(subject)
+// where subject is a parser. The expresion returns a composite
+// parser that returns an empty match if the subject parser matches.
+//
+///////////////////////////////////////////////////////////////////////////////
+ struct empty_match_parser_gen;
+ struct negated_empty_match_parser_gen;
+
+ template <typename SubjectT>
+ struct negated_empty_match_parser; // Forward declaration
+
+ template<typename SubjectT>
+ struct empty_match_parser
+ : unary<SubjectT, parser<empty_match_parser<SubjectT> > >
+ {
+ typedef empty_match_parser<SubjectT> self_t;
+ typedef unary<SubjectT, parser<self_t> > base_t;
+ typedef unary_parser_category parser_category_t;
+ typedef empty_match_parser_gen parser_genererator_t;
+ typedef self_t embed_t;
+
+ explicit empty_match_parser(SubjectT const& p) : base_t(p) {}
+
+ template <typename ScannerT>
+ struct result
+ { typedef typename match_result<ScannerT, nil_t>::type type; };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typename ScannerT::iterator_t save(scan.first);
+
+ typedef typename no_actions_scanner<ScannerT>::policies_t
+ policies_t;
+
+ bool matches = this->subject().parse(
+ scan.change_policies(policies_t(scan)));
+ if (matches)
+ {
+ scan.first = save; // reset the position
+ return scan.empty_match();
+ }
+ else
+ {
+ return scan.no_match();
+ }
+ }
+
+ negated_empty_match_parser<SubjectT>
+ negate() const
+ { return negated_empty_match_parser<SubjectT>(this->subject()); }
+ };
+
+ template<typename SubjectT>
+ struct negated_empty_match_parser
+ : public unary<SubjectT, parser<negated_empty_match_parser<SubjectT> > >
+ {
+ typedef negated_empty_match_parser<SubjectT> self_t;
+ typedef unary<SubjectT, parser<self_t> > base_t;
+ typedef unary_parser_category parser_category_t;
+ typedef negated_empty_match_parser_gen parser_genererator_t;
+
+ explicit negated_empty_match_parser(SubjectT const& p) : base_t(p) {}
+
+ template <typename ScannerT>
+ struct result
+ { typedef typename match_result<ScannerT, nil_t>::type type; };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typename ScannerT::iterator_t save(scan.first);
+
+ typedef typename no_actions_scanner<ScannerT>::policies_t
+ policies_t;
+
+ bool matches = this->subject().parse(
+ scan.change_policies(policies_t(scan)));
+ if (!matches)
+ {
+ scan.first = save; // reset the position
+ return scan.empty_match();
+ }
+ else
+ {
+ return scan.no_match();
+ }
+ }
+
+ empty_match_parser<SubjectT>
+ negate() const
+ { return empty_match_parser<SubjectT>(this->subject()); }
+ };
+
+ struct empty_match_parser_gen
+ {
+ template <typename SubjectT>
+ struct result
+ { typedef empty_match_parser<SubjectT> type; };
+
+ template <typename SubjectT>
+ static empty_match_parser<SubjectT>
+ generate(parser<SubjectT> const& subject)
+ { return empty_match_parser<SubjectT>(subject.derived()); }
+ };
+
+ struct negated_empty_match_parser_gen
+ {
+ template <typename SubjectT>
+ struct result
+ { typedef negated_empty_match_parser<SubjectT> type; };
+
+ template <typename SubjectT>
+ static negated_empty_match_parser<SubjectT>
+ generate(parser<SubjectT> const& subject)
+ { return negated_empty_match_parser<SubjectT>(subject.derived()); }
+ };
+
+ //////////////////////////////
+ template <typename SubjectT>
+ inline negated_empty_match_parser<SubjectT>
+ operator~(empty_match_parser<SubjectT> const& p)
+ { return p.negate(); }
+
+ template <typename SubjectT>
+ inline empty_match_parser<SubjectT>
+ operator~(negated_empty_match_parser<SubjectT> const& p)
+ { return p.negate(); }
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// epsilon_ parser and parser generator class
+//
+// Operates as primitive parser that always matches an empty sequence.
+//
+// Also operates as a parser generator. According to the type of the
+// argument an instance of empty_match_parser<> (when the argument is
+// a parser) or condition_parser<> (when the argument is not a parser)
+// is returned by operator().
+//
+///////////////////////////////////////////////////////////////////////////////
+ namespace impl
+ {
+ template <typename SubjectT>
+ struct epsilon_selector
+ {
+ typedef typename as_parser<SubjectT>::type subject_t;
+ typedef typename
+ mpl::if_<
+ is_parser<subject_t>
+ ,empty_match_parser<subject_t>
+ ,condition_parser<subject_t>
+ >::type type;
+ };
+ }
+
+ struct epsilon_parser : public parser<epsilon_parser>
+ {
+ typedef epsilon_parser self_t;
+
+ epsilon_parser() {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ { return scan.empty_match(); }
+
+ template <typename SubjectT>
+ typename impl::epsilon_selector<SubjectT>::type
+ operator()(SubjectT const& subject) const
+ {
+ typedef typename impl::epsilon_selector<SubjectT>::type result_t;
+ return result_t(subject);
+ }
+ };
+
+ epsilon_parser const epsilon_p = epsilon_parser();
+ epsilon_parser const eps_p = epsilon_parser();
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/exclusive_or.hpp b/boost/spirit/home/classic/core/composite/exclusive_or.hpp
new file mode 100644
index 0000000000..69d4859b00
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/exclusive_or.hpp
@@ -0,0 +1,142 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_EXCLUSIVE_OR_HPP)
+#define BOOST_SPIRIT_EXCLUSIVE_OR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // exclusive_or class
+ //
+ // Handles expressions of the form:
+ //
+ // a ^ b
+ //
+ // where a and b are parsers. The expression returns a composite
+ // parser that matches a or b but not both. One (not both) of the
+ // operands may be a literal char, wchar_t or a primitive string
+ // char const*, wchar_t const*.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct exclusive_or_parser_gen;
+
+ template <typename A, typename B>
+ struct exclusive_or
+ : public binary<A, B, parser<exclusive_or<A, B> > >
+ {
+ typedef exclusive_or<A, B> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef exclusive_or_parser_gen parser_generator_t;
+ typedef binary<A, B, parser<self_t> > base_t;
+
+ exclusive_or(A const& a, B const& b)
+ : base_t(a, b) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+
+ iterator_t save = scan.first;
+ result_t l = this->left().parse(scan);
+ std::swap(save, scan.first);
+ result_t r = this->right().parse(scan);
+
+ if (l ? !bool(r) : bool(r))
+ {
+ if (l)
+ scan.first = save;
+ return l ? l : r;
+ }
+
+ return scan.no_match();
+ }
+ };
+
+ struct exclusive_or_parser_gen
+ {
+ template <typename A, typename B>
+ struct result
+ {
+ typedef
+ exclusive_or<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ type;
+ };
+
+ template <typename A, typename B>
+ static exclusive_or<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ generate(A const& a, B const& b)
+ {
+ return exclusive_or<BOOST_DEDUCED_TYPENAME as_parser<A>::type,
+ BOOST_DEDUCED_TYPENAME as_parser<B>::type>
+ (as_parser<A>::convert(a), as_parser<B>::convert(b));
+ }
+ };
+
+ template <typename A, typename B>
+ exclusive_or<A, B>
+ operator^(parser<A> const& a, parser<B> const& b);
+
+ template <typename A>
+ exclusive_or<A, chlit<char> >
+ operator^(parser<A> const& a, char b);
+
+ template <typename B>
+ exclusive_or<chlit<char>, B>
+ operator^(char a, parser<B> const& b);
+
+ template <typename A>
+ exclusive_or<A, strlit<char const*> >
+ operator^(parser<A> const& a, char const* b);
+
+ template <typename B>
+ exclusive_or<strlit<char const*>, B>
+ operator^(char const* a, parser<B> const& b);
+
+ template <typename A>
+ exclusive_or<A, chlit<wchar_t> >
+ operator^(parser<A> const& a, wchar_t b);
+
+ template <typename B>
+ exclusive_or<chlit<wchar_t>, B>
+ operator^(wchar_t a, parser<B> const& b);
+
+ template <typename A>
+ exclusive_or<A, strlit<wchar_t const*> >
+ operator^(parser<A> const& a, wchar_t const* b);
+
+ template <typename B>
+ exclusive_or<strlit<wchar_t const*>, B>
+ operator^(wchar_t const* a, parser<B> const& b);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/exclusive_or.ipp>
diff --git a/boost/spirit/home/classic/core/composite/impl/alternative.ipp b/boost/spirit/home/classic/core/composite/impl/alternative.ipp
new file mode 100644
index 0000000000..7a7599b85c
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/alternative.ipp
@@ -0,0 +1,90 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_ALTERNATIVE_IPP)
+#define BOOST_SPIRIT_ALTERNATIVE_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // alternative class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ inline alternative<A, B>
+ operator|(parser<A> const& a, parser<B> const& b)
+ {
+ return alternative<A, B>(a.derived(), b.derived());
+ }
+
+ template <typename A>
+ inline alternative<A, chlit<char> >
+ operator|(parser<A> const& a, char b)
+ {
+ return alternative<A, chlit<char> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline alternative<chlit<char>, B>
+ operator|(char a, parser<B> const& b)
+ {
+ return alternative<chlit<char>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline alternative<A, strlit<char const*> >
+ operator|(parser<A> const& a, char const* b)
+ {
+ return alternative<A, strlit<char const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline alternative<strlit<char const*>, B>
+ operator|(char const* a, parser<B> const& b)
+ {
+ return alternative<strlit<char const*>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline alternative<A, chlit<wchar_t> >
+ operator|(parser<A> const& a, wchar_t b)
+ {
+ return alternative<A, chlit<wchar_t> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline alternative<chlit<wchar_t>, B>
+ operator|(wchar_t a, parser<B> const& b)
+ {
+ return alternative<chlit<wchar_t>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline alternative<A, strlit<wchar_t const*> >
+ operator|(parser<A> const& a, wchar_t const* b)
+ {
+ return alternative<A, strlit<wchar_t const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline alternative<strlit<wchar_t const*>, B>
+ operator|(wchar_t const* a, parser<B> const& b)
+ {
+ return alternative<strlit<wchar_t const*>, B>(a, b.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/difference.ipp b/boost/spirit/home/classic/core/composite/impl/difference.ipp
new file mode 100644
index 0000000000..f5df8c7528
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/difference.ipp
@@ -0,0 +1,90 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_DIFFERENCE_IPP)
+#define BOOST_SPIRIT_DIFFERENCE_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // difference class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ inline difference<A, B>
+ operator-(parser<A> const& a, parser<B> const& b)
+ {
+ return difference<A, B>(a.derived(), b.derived());
+ }
+
+ template <typename A>
+ inline difference<A, chlit<char> >
+ operator-(parser<A> const& a, char b)
+ {
+ return difference<A, chlit<char> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline difference<chlit<char>, B>
+ operator-(char a, parser<B> const& b)
+ {
+ return difference<chlit<char>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline difference<A, strlit<char const*> >
+ operator-(parser<A> const& a, char const* b)
+ {
+ return difference<A, strlit<char const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline difference<strlit<char const*>, B>
+ operator-(char const* a, parser<B> const& b)
+ {
+ return difference<strlit<char const*>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline difference<A, chlit<wchar_t> >
+ operator-(parser<A> const& a, wchar_t b)
+ {
+ return difference<A, chlit<wchar_t> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline difference<chlit<wchar_t>, B>
+ operator-(wchar_t a, parser<B> const& b)
+ {
+ return difference<chlit<wchar_t>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline difference<A, strlit<wchar_t const*> >
+ operator-(parser<A> const& a, wchar_t const* b)
+ {
+ return difference<A, strlit<wchar_t const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline difference<strlit<wchar_t const*>, B>
+ operator-(wchar_t const* a, parser<B> const& b)
+ {
+ return difference<strlit<wchar_t const*>, B>(a, b.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/directives.ipp b/boost/spirit/home/classic/core/composite/impl/directives.ipp
new file mode 100644
index 0000000000..b25b25fdc0
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/directives.ipp
@@ -0,0 +1,374 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2001 Bruce Florman
+ Copyright (c) 2002 Raghavendra Satish
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_DIRECTIVES_IPP)
+#define BOOST_SPIRIT_DIRECTIVES_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/core/scanner/skipper.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename BaseT>
+ struct no_skipper_iteration_policy;
+
+ template <typename BaseT>
+ struct inhibit_case_iteration_policy;
+
+ template <typename A, typename B>
+ struct alternative;
+
+ template <typename A, typename B>
+ struct longest_alternative;
+
+ template <typename A, typename B>
+ struct shortest_alternative;
+
+ namespace impl
+ {
+ template <typename RT, typename ST, typename ScannerT, typename BaseT>
+ inline RT
+ contiguous_parser_parse(
+ ST const& s,
+ ScannerT const& scan,
+ skipper_iteration_policy<BaseT> const&)
+ {
+ typedef scanner_policies<
+ no_skipper_iteration_policy<
+ BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
+ BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
+ BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
+ > policies_t;
+
+ scan.skip(scan);
+ RT hit = s.parse(scan.change_policies(policies_t(scan)));
+ // We will not do a post skip!!!
+ return hit;
+ }
+
+ template <typename RT, typename ST, typename ScannerT, typename BaseT>
+ inline RT
+ contiguous_parser_parse(
+ ST const& s,
+ ScannerT const& scan,
+ no_skipper_iteration_policy<BaseT> const&)
+ {
+ return s.parse(scan);
+ }
+
+ template <typename RT, typename ST, typename ScannerT>
+ inline RT
+ contiguous_parser_parse(
+ ST const& s,
+ ScannerT const& scan,
+ iteration_policy const&)
+ {
+ return s.parse(scan);
+ }
+
+ template <
+ typename RT,
+ typename ParserT,
+ typename ScannerT,
+ typename BaseT>
+ inline RT
+ implicit_lexeme_parse(
+ ParserT const& p,
+ ScannerT const& scan,
+ skipper_iteration_policy<BaseT> const&)
+ {
+ typedef scanner_policies<
+ no_skipper_iteration_policy<
+ BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
+ BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
+ BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
+ > policies_t;
+
+ scan.skip(scan);
+ RT hit = p.parse_main(scan.change_policies(policies_t(scan)));
+ // We will not do a post skip!!!
+ return hit;
+ }
+
+ template <
+ typename RT,
+ typename ParserT,
+ typename ScannerT,
+ typename BaseT>
+ inline RT
+ implicit_lexeme_parse(
+ ParserT const& p,
+ ScannerT const& scan,
+ no_skipper_iteration_policy<BaseT> const&)
+ {
+ return p.parse_main(scan);
+ }
+
+ template <typename RT, typename ParserT, typename ScannerT>
+ inline RT
+ implicit_lexeme_parse(
+ ParserT const& p,
+ ScannerT const& scan,
+ iteration_policy const&)
+ {
+ return p.parse_main(scan);
+ }
+
+ template <typename RT, typename ST, typename ScannerT>
+ inline RT
+ inhibit_case_parser_parse(
+ ST const& s,
+ ScannerT const& scan,
+ iteration_policy const&)
+ {
+ typedef scanner_policies<
+ inhibit_case_iteration_policy<
+ BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
+ BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
+ BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
+ > policies_t;
+
+ return s.parse(scan.change_policies(policies_t(scan)));
+ }
+
+ template <typename RT, typename ST, typename ScannerT, typename BaseT>
+ inline RT
+ inhibit_case_parser_parse(
+ ST const& s,
+ ScannerT const& scan,
+ inhibit_case_iteration_policy<BaseT> const&)
+ {
+ return s.parse(scan);
+ }
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // from spirit 1.1 (copyright (c) 2001 Bruce Florman)
+ // various workarounds to support longest and shortest directives
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct is_alternative
+ {
+ // Determine at compile time (without partial specialization)
+ // whether a given type is an instance of the alternative<A,B>
+
+ static T t();
+ template <typename A, typename B>
+ static char test_(alternative<A, B> const&); // no implementation
+ static int test_(...); // no implementation
+ enum { r = sizeof(char) == sizeof(test_(t())) };
+ typedef mpl::bool_<r> value;
+ };
+
+ template <typename T> struct select_to_longest;
+
+ template <typename T>
+ struct to_longest_alternative
+ {
+ typedef typename select_to_longest<T>::result_t result_t;
+ typedef typename select_to_longest<T>::plain_t plain_t;
+ typedef typename select_to_longest<T>::choose_t choose_t;
+ static result_t convert(T const& a);
+ };
+
+ template <typename T>
+ struct to_longest_generic
+ {
+ typedef T const& result_t;
+ typedef T plain_t;
+ typedef mpl::false_ choose_t;
+ };
+
+ template <typename T>
+ inline T const&
+ to_longest_convert(T const& a, mpl::false_)
+ { return a; }
+
+ template <typename T>
+ struct to_longest_recursive
+ {
+ typedef typename to_longest_alternative<
+ typename T::left_t>::plain_t a_t;
+ typedef typename to_longest_alternative<
+ typename T::right_t>::plain_t b_t;
+
+ typedef longest_alternative<a_t, b_t> result_t;
+
+ typedef result_t plain_t;
+ typedef mpl::true_ choose_t;
+ };
+
+ template <typename A, typename B>
+ inline typename to_longest_alternative<alternative<A, B> >::result_t
+ to_longest_convert(alternative<A, B> const& alt, mpl::true_)
+ {
+ typedef typename to_longest_alternative<
+ alternative<A, B> >::result_t result_t;
+ return result_t(
+ to_longest_alternative<A>::convert(alt.left()),
+ to_longest_alternative<B>::convert(alt.right()));
+ }
+
+ template <typename T>
+ inline typename to_longest_alternative<T>::result_t
+ to_longest_alternative<T>::convert(T const& a)
+ {
+ return to_longest_convert(
+ a, to_longest_alternative<T>::choose_t());
+ }
+
+ template <typename T>
+ struct select_to_longest
+ {
+ typedef typename mpl::if_<
+ is_alternative<T> // IF
+ , to_longest_recursive<T> // THEN
+ , to_longest_generic<T> // ELSE
+ >::type type;
+
+ typedef typename select_to_longest::type::result_t result_t;
+ typedef typename select_to_longest::type::plain_t plain_t;
+ typedef typename select_to_longest::type::choose_t choose_t;
+ };
+
+ template <typename T> struct select_to_shortest;
+
+ template <typename T>
+ struct to_shortest_alternative
+ {
+ typedef typename select_to_shortest<T>::result_t result_t;
+ typedef typename select_to_shortest<T>::plain_t plain_t;
+ typedef typename select_to_shortest<T>::choose_t choose_t;
+ static result_t convert(T const& a);
+ };
+
+ template <typename T>
+ struct to_shortest_generic
+ {
+ typedef T const& result_t;
+ typedef T plain_t;
+ typedef mpl::false_ choose_t;
+ };
+
+ template <typename T>
+ inline T const&
+ to_shortest_convert(T const& a, mpl::false_) { return a; }
+
+ template <typename T>
+ struct to_shortest_recursive
+ {
+ typedef typename to_shortest_alternative<
+ typename T::left_t>::plain_t a_t;
+ typedef typename to_shortest_alternative<
+ typename T::right_t>::plain_t b_t;
+
+ typedef shortest_alternative<a_t, b_t> result_t;
+
+ typedef result_t plain_t;
+ typedef mpl::true_ choose_t;
+ };
+
+ template <typename A, typename B>
+ inline typename to_shortest_alternative<alternative<A, B> >::result_t
+ to_shortest_convert(alternative<A, B> const& alt, mpl::true_)
+ {
+ typedef typename to_shortest_alternative<
+ alternative<A, B> >::result_t result_t;
+ return result_t(
+ to_shortest_alternative<A>::convert(alt.left()),
+ to_shortest_alternative<B>::convert(alt.right()));
+ }
+
+ template <typename T>
+ inline typename to_shortest_alternative<T>::result_t
+ to_shortest_alternative<T>::convert(T const& a)
+ {
+ return to_shortest_convert(
+ a, to_shortest_alternative<T>::choose_t());
+ }
+
+ template <typename T>
+ struct select_to_shortest
+ {
+ typedef typename mpl::if_<
+ is_alternative<T> // IF
+ , to_shortest_recursive<T> // THEN
+ , to_shortest_generic<T> // ELSE
+ >::type type;
+
+ typedef typename select_to_shortest::type::result_t result_t;
+ typedef typename select_to_shortest::type::plain_t plain_t;
+ typedef typename select_to_shortest::type::choose_t choose_t;
+ };
+#else
+ template <typename T>
+ struct to_longest_alternative
+ {
+ typedef T result_t;
+ static result_t const&
+ convert(T const& a) // Special (end) case
+ { return a; }
+ };
+
+ template <typename A, typename B>
+ struct to_longest_alternative<alternative<A, B> >
+ {
+ typedef typename to_longest_alternative<A>::result_t a_t;
+ typedef typename to_longest_alternative<B>::result_t b_t;
+ typedef longest_alternative<a_t, b_t> result_t;
+
+ static result_t
+ convert(alternative<A, B> const& alt) // Recursive case
+ {
+ return result_t(
+ to_longest_alternative<A>::convert(alt.left()),
+ to_longest_alternative<B>::convert(alt.right()));
+ }
+ };
+
+ template <typename T>
+ struct to_shortest_alternative
+ {
+ typedef T result_t;
+ static result_t const&
+ convert(T const& a) // Special (end) case
+ { return a; }
+ };
+
+ template <typename A, typename B>
+ struct to_shortest_alternative<alternative<A, B> >
+ {
+ typedef typename to_shortest_alternative<A>::result_t a_t;
+ typedef typename to_shortest_alternative<B>::result_t b_t;
+ typedef shortest_alternative<a_t, b_t> result_t;
+
+ static result_t
+ convert(alternative<A, B> const& alt) // Recursive case
+ {
+ return result_t(
+ to_shortest_alternative<A>::convert(alt.left()),
+ to_shortest_alternative<B>::convert(alt.right()));
+ }
+ };
+#endif
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/composite/impl/exclusive_or.ipp b/boost/spirit/home/classic/core/composite/impl/exclusive_or.ipp
new file mode 100644
index 0000000000..34831a7e9f
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/exclusive_or.ipp
@@ -0,0 +1,90 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_EXCLUSIVE_OR_IPP)
+#define BOOST_SPIRIT_EXCLUSIVE_OR_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // exclusive_or class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ inline exclusive_or<A, B>
+ operator^(parser<A> const& a, parser<B> const& b)
+ {
+ return exclusive_or<A, B>(a.derived(), b.derived());
+ }
+
+ template <typename A>
+ inline exclusive_or<A, chlit<char> >
+ operator^(parser<A> const& a, char b)
+ {
+ return exclusive_or<A, chlit<char> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline exclusive_or<chlit<char>, B>
+ operator^(char a, parser<B> const& b)
+ {
+ return exclusive_or<chlit<char>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline exclusive_or<A, strlit<char const*> >
+ operator^(parser<A> const& a, char const* b)
+ {
+ return exclusive_or<A, strlit<char const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline exclusive_or<strlit<char const*>, B>
+ operator^(char const* a, parser<B> const& b)
+ {
+ return exclusive_or<strlit<char const*>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline exclusive_or<A, chlit<wchar_t> >
+ operator^(parser<A> const& a, wchar_t b)
+ {
+ return exclusive_or<A, chlit<wchar_t> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline exclusive_or<chlit<wchar_t>, B>
+ operator^(wchar_t a, parser<B> const& b)
+ {
+ return exclusive_or<chlit<wchar_t>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline exclusive_or<A, strlit<wchar_t const*> >
+ operator^(parser<A> const& a, wchar_t const* b)
+ {
+ return exclusive_or<A, strlit<wchar_t const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline exclusive_or<strlit<wchar_t const*>, B>
+ operator^(wchar_t const* a, parser<B> const& b)
+ {
+ return exclusive_or<strlit<wchar_t const*>, B>(a, b.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/intersection.ipp b/boost/spirit/home/classic/core/composite/impl/intersection.ipp
new file mode 100644
index 0000000000..2810586cd7
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/intersection.ipp
@@ -0,0 +1,90 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_INTERSECTION_IPP)
+#define BOOST_SPIRIT_INTERSECTION_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // intersection class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ inline intersection<A, B>
+ operator&(parser<A> const& a, parser<B> const& b)
+ {
+ return intersection<A, B>(a.derived(), b.derived());
+ }
+
+ template <typename A>
+ inline intersection<A, chlit<char> >
+ operator&(parser<A> const& a, char b)
+ {
+ return intersection<A, chlit<char> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline intersection<chlit<char>, B>
+ operator&(char a, parser<B> const& b)
+ {
+ return intersection<chlit<char>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline intersection<A, strlit<char const*> >
+ operator&(parser<A> const& a, char const* b)
+ {
+ return intersection<A, strlit<char const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline intersection<strlit<char const*>, B>
+ operator&(char const* a, parser<B> const& b)
+ {
+ return intersection<strlit<char const*>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline intersection<A, chlit<wchar_t> >
+ operator&(parser<A> const& a, wchar_t b)
+ {
+ return intersection<A, chlit<wchar_t> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline intersection<chlit<wchar_t>, B>
+ operator&(wchar_t a, parser<B> const& b)
+ {
+ return intersection<chlit<wchar_t>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline intersection<A, strlit<wchar_t const*> >
+ operator&(parser<A> const& a, wchar_t const* b)
+ {
+ return intersection<A, strlit<wchar_t const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline intersection<strlit<wchar_t const*>, B>
+ operator&(wchar_t const* a, parser<B> const& b)
+ {
+ return intersection<strlit<wchar_t const*>, B>(a, b.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/kleene_star.ipp b/boost/spirit/home/classic/core/composite/impl/kleene_star.ipp
new file mode 100644
index 0000000000..8c4f5135c0
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/kleene_star.ipp
@@ -0,0 +1,34 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_KLEENE_STAR_IPP)
+#define BOOST_SPIRIT_KLEENE_STAR_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // kleene_star class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename S>
+ inline kleene_star<S>
+ operator*(parser<S> const& a)
+ {
+ return kleene_star<S>(a.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/list.ipp b/boost/spirit/home/classic/core/composite/impl/list.ipp
new file mode 100644
index 0000000000..cd7965adfd
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/list.ipp
@@ -0,0 +1,93 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_LIST_IPP)
+#define BOOST_SPIRIT_LIST_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // operator% is defined as:
+ // a % b ---> a >> *(b >> a)
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ inline sequence<A, kleene_star<sequence<B, A> > >
+ operator%(parser<A> const& a, parser<B> const& b)
+ {
+ return a.derived() >> *(b.derived() >> a.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, kleene_star<sequence<chlit<char>, A> > >
+ operator%(parser<A> const& a, char b)
+ {
+ return a.derived() >> *(b >> a.derived());
+ }
+
+ template <typename B>
+ inline sequence<chlit<char>, kleene_star<sequence<B, chlit<char> > > >
+ operator%(char a, parser<B> const& b)
+ {
+ return a >> *(b.derived() >> a);
+ }
+
+ template <typename A>
+ inline sequence<A, kleene_star<sequence<strlit<char const*>, A> > >
+ operator%(parser<A> const& a, char const* b)
+ {
+ return a.derived() >> *(b >> a.derived());
+ }
+
+ template <typename B>
+ inline sequence<strlit<char const*>,
+ kleene_star<sequence<B, strlit<char const*> > > >
+ operator%(char const* a, parser<B> const& b)
+ {
+ return a >> *(b.derived() >> a);
+ }
+
+ template <typename A>
+ inline sequence<A, kleene_star<sequence<chlit<wchar_t>, A> > >
+ operator%(parser<A> const& a, wchar_t b)
+ {
+ return a.derived() >> *(b >> a.derived());
+ }
+
+ template <typename B>
+ inline sequence<chlit<wchar_t>, kleene_star<sequence<B, chlit<wchar_t> > > >
+ operator%(wchar_t a, parser<B> const& b)
+ {
+ return a >> *(b.derived() >> a);
+ }
+
+ template <typename A>
+ inline sequence<A, kleene_star<sequence<strlit<wchar_t const*>, A> > >
+ operator%(parser<A> const& a, wchar_t const* b)
+ {
+ return a.derived() >> *(b >> a.derived());
+ }
+
+ template <typename B>
+ inline sequence<strlit<wchar_t const*>,
+ kleene_star<sequence<B, strlit<wchar_t const*> > > >
+ operator%(wchar_t const* a, parser<B> const& b)
+ {
+ return a >> *(b.derived() >> a);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/optional.ipp b/boost/spirit/home/classic/core/composite/impl/optional.ipp
new file mode 100644
index 0000000000..629eac8336
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/optional.ipp
@@ -0,0 +1,34 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_OPTIONAL_IPP)
+#define BOOST_SPIRIT_OPTIONAL_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // optional class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename S>
+ optional<S>
+ operator!(parser<S> const& a)
+ {
+ return optional<S>(a.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/positive.ipp b/boost/spirit/home/classic/core/composite/impl/positive.ipp
new file mode 100644
index 0000000000..9698e69e55
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/positive.ipp
@@ -0,0 +1,34 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_POSITIVE_IPP)
+#define BOOST_SPIRIT_POSITIVE_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // positive class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename S>
+ inline positive<S>
+ operator+(parser<S> const& a)
+ {
+ return positive<S>(a.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/sequence.ipp b/boost/spirit/home/classic/core/composite/impl/sequence.ipp
new file mode 100644
index 0000000000..283d420bc3
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/sequence.ipp
@@ -0,0 +1,90 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_SEQUENCE_IPP)
+#define BOOST_SPIRIT_SEQUENCE_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // sequence class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ inline sequence<A, B>
+ operator>>(parser<A> const& a, parser<B> const& b)
+ {
+ return sequence<A, B>(a.derived(), b.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, chlit<char> >
+ operator>>(parser<A> const& a, char b)
+ {
+ return sequence<A, chlit<char> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequence<chlit<char>, B>
+ operator>>(char a, parser<B> const& b)
+ {
+ return sequence<chlit<char>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, strlit<char const*> >
+ operator>>(parser<A> const& a, char const* b)
+ {
+ return sequence<A, strlit<char const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequence<strlit<char const*>, B>
+ operator>>(char const* a, parser<B> const& b)
+ {
+ return sequence<strlit<char const*>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, chlit<wchar_t> >
+ operator>>(parser<A> const& a, wchar_t b)
+ {
+ return sequence<A, chlit<wchar_t> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequence<chlit<wchar_t>, B>
+ operator>>(wchar_t a, parser<B> const& b)
+ {
+ return sequence<chlit<wchar_t>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, strlit<wchar_t const*> >
+ operator>>(parser<A> const& a, wchar_t const* b)
+ {
+ return sequence<A, strlit<wchar_t const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequence<strlit<wchar_t const*>, B>
+ operator>>(wchar_t const* a, parser<B> const& b)
+ {
+ return sequence<strlit<wchar_t const*>, B>(a, b.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/sequential_and.ipp b/boost/spirit/home/classic/core/composite/impl/sequential_and.ipp
new file mode 100644
index 0000000000..9f577a4f55
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/sequential_and.ipp
@@ -0,0 +1,90 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_SEQUENTIAL_AND_IPP)
+#define BOOST_SPIRIT_SEQUENTIAL_AND_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // sequential-and operators implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ inline sequence<A, B>
+ operator&&(parser<A> const& a, parser<B> const& b)
+ {
+ return sequence<A, B>(a.derived(), b.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, chlit<char> >
+ operator&&(parser<A> const& a, char b)
+ {
+ return sequence<A, chlit<char> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequence<chlit<char>, B>
+ operator&&(char a, parser<B> const& b)
+ {
+ return sequence<chlit<char>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, strlit<char const*> >
+ operator&&(parser<A> const& a, char const* b)
+ {
+ return sequence<A, strlit<char const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequence<strlit<char const*>, B>
+ operator&&(char const* a, parser<B> const& b)
+ {
+ return sequence<strlit<char const*>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, chlit<wchar_t> >
+ operator&&(parser<A> const& a, wchar_t b)
+ {
+ return sequence<A, chlit<wchar_t> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequence<chlit<wchar_t>, B>
+ operator&&(wchar_t a, parser<B> const& b)
+ {
+ return sequence<chlit<wchar_t>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequence<A, strlit<wchar_t const*> >
+ operator&&(parser<A> const& a, wchar_t const* b)
+ {
+ return sequence<A, strlit<wchar_t const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequence<strlit<wchar_t const*>, B>
+ operator&&(wchar_t const* a, parser<B> const& b)
+ {
+ return sequence<strlit<wchar_t const*>, B>(a, b.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/impl/sequential_or.ipp b/boost/spirit/home/classic/core/composite/impl/sequential_or.ipp
new file mode 100644
index 0000000000..521faf61ec
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/impl/sequential_or.ipp
@@ -0,0 +1,90 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_SEQUENTIAL_OR_IPP)
+#define BOOST_SPIRIT_SEQUENTIAL_OR_IPP
+
+namespace boost { namespace spirit {
+
+ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // sequential-or class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ inline sequential_or<A, B>
+ operator||(parser<A> const& a, parser<B> const& b)
+ {
+ return sequential_or<A, B>(a.derived(), b.derived());
+ }
+
+ template <typename A>
+ inline sequential_or<A, chlit<char> >
+ operator||(parser<A> const& a, char b)
+ {
+ return sequential_or<A, chlit<char> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequential_or<chlit<char>, B>
+ operator||(char a, parser<B> const& b)
+ {
+ return sequential_or<chlit<char>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequential_or<A, strlit<char const*> >
+ operator||(parser<A> const& a, char const* b)
+ {
+ return sequential_or<A, strlit<char const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequential_or<strlit<char const*>, B>
+ operator||(char const* a, parser<B> const& b)
+ {
+ return sequential_or<strlit<char const*>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequential_or<A, chlit<wchar_t> >
+ operator||(parser<A> const& a, wchar_t b)
+ {
+ return sequential_or<A, chlit<wchar_t> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequential_or<chlit<wchar_t>, B>
+ operator||(wchar_t a, parser<B> const& b)
+ {
+ return sequential_or<chlit<wchar_t>, B>(a, b.derived());
+ }
+
+ template <typename A>
+ inline sequential_or<A, strlit<wchar_t const*> >
+ operator||(parser<A> const& a, wchar_t const* b)
+ {
+ return sequential_or<A, strlit<wchar_t const*> >(a.derived(), b);
+ }
+
+ template <typename B>
+ inline sequential_or<strlit<wchar_t const*>, B>
+ operator||(wchar_t const* a, parser<B> const& b)
+ {
+ return sequential_or<strlit<wchar_t const*>, B>(a, b.derived());
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/intersection.hpp b/boost/spirit/home/classic/core/composite/intersection.hpp
new file mode 100644
index 0000000000..867c20f330
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/intersection.hpp
@@ -0,0 +1,142 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INTERSECTION_HPP)
+#define BOOST_SPIRIT_INTERSECTION_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // intersection class
+ //
+ // Handles expressions of the form:
+ //
+ // a & b
+ //
+ // where a and b are parsers. The expression returns a composite
+ // parser that matches a and b. One (not both) of the operands may
+ // be a literal char, wchar_t or a primitive string char const*,
+ // wchar_t const*.
+ //
+ // The expression is short circuit evaluated. b is never touched
+ // when a is returns a no-match.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct intersection_parser_gen;
+
+ template <typename A, typename B>
+ struct intersection
+ : public binary<A, B, parser<intersection<A, B> > >
+ {
+ typedef intersection<A, B> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef intersection_parser_gen parser_generator_t;
+ typedef binary<A, B, parser<self_t> > base_t;
+
+ intersection(A const& a, B const& b)
+ : base_t(a, b) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ iterator_t save = scan.first;
+ if (result_t hl = this->left().parse(scan))
+ {
+ ScannerT bscan(scan.first, scan.first, scan);
+ scan.first = save;
+ result_t hr = this->right().parse(bscan);
+ if (hl.length() == hr.length())
+ return hl;
+ }
+
+ return scan.no_match();
+ }
+ };
+
+ struct intersection_parser_gen
+ {
+ template <typename A, typename B>
+ struct result
+ {
+ typedef
+ intersection<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ type;
+ };
+
+ template <typename A, typename B>
+ static intersection<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ generate(A const& a, B const& b)
+ {
+ return intersection<BOOST_DEDUCED_TYPENAME as_parser<A>::type,
+ BOOST_DEDUCED_TYPENAME as_parser<B>::type>
+ (as_parser<A>::convert(a), as_parser<B>::convert(b));
+ }
+ };
+
+ template <typename A, typename B>
+ intersection<A, B>
+ operator&(parser<A> const& a, parser<B> const& b);
+
+ template <typename A>
+ intersection<A, chlit<char> >
+ operator&(parser<A> const& a, char b);
+
+ template <typename B>
+ intersection<chlit<char>, B>
+ operator&(char a, parser<B> const& b);
+
+ template <typename A>
+ intersection<A, strlit<char const*> >
+ operator&(parser<A> const& a, char const* b);
+
+ template <typename B>
+ intersection<strlit<char const*>, B>
+ operator&(char const* a, parser<B> const& b);
+
+ template <typename A>
+ intersection<A, chlit<wchar_t> >
+ operator&(parser<A> const& a, wchar_t b);
+
+ template <typename B>
+ intersection<chlit<wchar_t>, B>
+ operator&(wchar_t a, parser<B> const& b);
+
+ template <typename A>
+ intersection<A, strlit<wchar_t const*> >
+ operator&(parser<A> const& a, wchar_t const* b);
+
+ template <typename B>
+ intersection<strlit<wchar_t const*>, B>
+ operator&(wchar_t const* a, parser<B> const& b);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/intersection.ipp>
diff --git a/boost/spirit/home/classic/core/composite/kleene_star.hpp b/boost/spirit/home/classic/core/composite/kleene_star.hpp
new file mode 100644
index 0000000000..9b6c73a008
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/kleene_star.hpp
@@ -0,0 +1,109 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_KLEENE_STAR_HPP)
+#define BOOST_SPIRIT_KLEENE_STAR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // kleene_star class
+ //
+ // Handles expressions of the form:
+ //
+ // *a
+ //
+ // where a is a parser. The expression returns a composite
+ // parser that matches its subject zero (0) or more times.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct kleene_star_parser_gen;
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ template <typename S>
+ struct kleene_star
+ : public unary<S, parser<kleene_star<S> > >
+ {
+ typedef kleene_star<S> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef kleene_star_parser_gen parser_generator_t;
+ typedef unary<S, parser<self_t> > base_t;
+
+ kleene_star(S const& a)
+ : base_t(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ result_t hit = scan.empty_match();
+
+ for (;;)
+ {
+ iterator_t save = scan.first;
+ if (result_t next = this->subject().parse(scan))
+ {
+ scan.concat_match(hit, next);
+ }
+ else
+ {
+ scan.first = save;
+ return hit;
+ }
+ }
+ }
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+ struct kleene_star_parser_gen
+ {
+ template <typename S>
+ struct result
+ {
+ typedef kleene_star<S> type;
+ };
+
+ template <typename S>
+ static kleene_star<S>
+ generate(parser<S> const& a)
+ {
+ return kleene_star<S>(a.derived());
+ }
+ };
+
+ //////////////////////////////////
+ template <typename S>
+ kleene_star<S>
+ operator*(parser<S> const& a);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/kleene_star.ipp>
diff --git a/boost/spirit/home/classic/core/composite/list.hpp b/boost/spirit/home/classic/core/composite/list.hpp
new file mode 100644
index 0000000000..cdb879e14a
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/list.hpp
@@ -0,0 +1,73 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_LIST_HPP)
+#define BOOST_SPIRIT_LIST_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // operator% is defined as:
+ // a % b ---> a >> *(b >> a)
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ sequence<A, kleene_star<sequence<B, A> > >
+ operator%(parser<A> const& a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, kleene_star<sequence<chlit<char>, A> > >
+ operator%(parser<A> const& a, char b);
+
+ template <typename B>
+ sequence<chlit<char>, kleene_star<sequence<B, chlit<char> > > >
+ operator%(char a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, kleene_star<sequence<strlit<char const*>, A> > >
+ operator%(parser<A> const& a, char const* b);
+
+ template <typename B>
+ sequence<strlit<char const*>,
+ kleene_star<sequence<B, strlit<char const*> > > >
+ operator%(char const* a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, kleene_star<sequence<chlit<wchar_t>, A> > >
+ operator%(parser<A> const& a, wchar_t b);
+
+ template <typename B>
+ sequence<chlit<wchar_t>, kleene_star<sequence<B, chlit<wchar_t> > > >
+ operator%(wchar_t a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, kleene_star<sequence<strlit<wchar_t const*>, A> > >
+ operator%(parser<A> const& a, wchar_t const* b);
+
+ template <typename B>
+ sequence<strlit<wchar_t const*>,
+ kleene_star<sequence<B, strlit<wchar_t const*> > > >
+ operator%(wchar_t const* a, parser<B> const& b);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/list.ipp>
diff --git a/boost/spirit/home/classic/core/composite/no_actions.hpp b/boost/spirit/home/classic/core/composite/no_actions.hpp
new file mode 100644
index 0000000000..638a29778f
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/no_actions.hpp
@@ -0,0 +1,165 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2003 Vaclav Vesely
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_NO_ACTIONS_HPP)
+#define BOOST_SPIRIT_NO_ACTIONS_HPP
+
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/rule.hpp>
+
+namespace boost {
+namespace spirit {
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+//-----------------------------------------------------------------------------
+// no_actions_action_policy
+
+template<typename BaseT = action_policy>
+struct no_actions_action_policy:
+ public BaseT
+{
+ typedef BaseT base_t;
+
+ no_actions_action_policy():
+ BaseT()
+ {}
+
+ template<typename PolicyT>
+ no_actions_action_policy(PolicyT const& other):
+ BaseT(other)
+ {}
+
+ template<typename ActorT, typename AttrT, typename IteratorT>
+ void
+ do_action(
+ ActorT const& actor,
+ AttrT& val,
+ IteratorT const& first,
+ IteratorT const& last) const
+ {}
+};
+
+//-----------------------------------------------------------------------------
+// no_actions_scanner
+
+
+namespace detail
+{
+ template <typename ActionPolicy>
+ struct compute_no_actions_action_policy
+ {
+ typedef no_actions_action_policy<ActionPolicy> type;
+ };
+
+ template <typename ActionPolicy>
+ struct compute_no_actions_action_policy<no_actions_action_policy<ActionPolicy> >
+ {
+ typedef no_actions_action_policy<ActionPolicy> type;
+ };
+}
+
+template<typename ScannerT = scanner<> >
+struct no_actions_scanner
+{
+ typedef scanner_policies<
+ typename ScannerT::iteration_policy_t,
+ typename ScannerT::match_policy_t,
+ typename detail::compute_no_actions_action_policy<typename ScannerT::action_policy_t>::type
+ > policies_t;
+
+ typedef typename
+ rebind_scanner_policies<ScannerT, policies_t>::type type;
+};
+
+#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+
+template<typename ScannerT = scanner<> >
+struct no_actions_scanner_list
+{
+ typedef
+ scanner_list<
+ ScannerT,
+ typename no_actions_scanner<ScannerT>::type
+ >
+ type;
+};
+
+#endif // BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+
+//-----------------------------------------------------------------------------
+// no_actions_parser
+
+struct no_actions_parser_gen;
+
+template<typename ParserT>
+struct no_actions_parser:
+ public unary<ParserT, parser<no_actions_parser<ParserT> > >
+{
+ typedef no_actions_parser<ParserT> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef no_actions_parser_gen parser_generator_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ template<typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ no_actions_parser(ParserT const& p)
+ : base_t(p)
+ {}
+
+ template<typename ScannerT>
+ typename result<ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename no_actions_scanner<ScannerT>::policies_t policies_t;
+
+ return this->subject().parse(scan.change_policies(policies_t(scan)));
+ }
+};
+
+//-----------------------------------------------------------------------------
+// no_actions_parser_gen
+
+struct no_actions_parser_gen
+{
+ template<typename ParserT>
+ struct result
+ {
+ typedef no_actions_parser<ParserT> type;
+ };
+
+ template<typename ParserT>
+ static no_actions_parser<ParserT>
+ generate(parser<ParserT> const& subject)
+ {
+ return no_actions_parser<ParserT>(subject.derived());
+ }
+
+ template<typename ParserT>
+ no_actions_parser<ParserT>
+ operator[](parser<ParserT> const& subject) const
+ {
+ return no_actions_parser<ParserT>(subject.derived());
+ }
+};
+
+//-----------------------------------------------------------------------------
+// no_actions_d
+
+const no_actions_parser_gen no_actions_d = no_actions_parser_gen();
+
+//-----------------------------------------------------------------------------
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+} // namespace spirit
+} // namespace boost
+
+#endif // !defined(BOOST_SPIRIT_NO_ACTIONS_HPP)
diff --git a/boost/spirit/home/classic/core/composite/operators.hpp b/boost/spirit/home/classic/core/composite/operators.hpp
new file mode 100644
index 0000000000..5732ef9ae7
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/operators.hpp
@@ -0,0 +1,25 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_OPERATORS_HPP)
+#define BOOST_SPIRIT_OPERATORS_HPP
+
+#include <boost/spirit/home/classic/core/composite/sequence.hpp>
+#include <boost/spirit/home/classic/core/composite/sequential_and.hpp>
+#include <boost/spirit/home/classic/core/composite/sequential_or.hpp>
+#include <boost/spirit/home/classic/core/composite/alternative.hpp>
+#include <boost/spirit/home/classic/core/composite/difference.hpp>
+#include <boost/spirit/home/classic/core/composite/intersection.hpp>
+#include <boost/spirit/home/classic/core/composite/exclusive_or.hpp>
+#include <boost/spirit/home/classic/core/composite/kleene_star.hpp>
+#include <boost/spirit/home/classic/core/composite/positive.hpp>
+#include <boost/spirit/home/classic/core/composite/optional.hpp>
+#include <boost/spirit/home/classic/core/composite/list.hpp>
+
+#endif
diff --git a/boost/spirit/home/classic/core/composite/optional.hpp b/boost/spirit/home/classic/core/composite/optional.hpp
new file mode 100644
index 0000000000..69e49f9a3a
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/optional.hpp
@@ -0,0 +1,94 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_OPTIONAL_HPP)
+#define BOOST_SPIRIT_OPTIONAL_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // optional class
+ //
+ // Handles expressions of the form:
+ //
+ // !a
+ //
+ // where a is a parser. The expression returns a composite
+ // parser that matches its subject zero (0) or one (1) time.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct optional_parser_gen;
+
+ template <typename S>
+ struct optional
+ : public unary<S, parser<optional<S> > >
+ {
+ typedef optional<S> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef optional_parser_gen parser_generator_t;
+ typedef unary<S, parser<self_t> > base_t;
+
+ optional(S const& a)
+ : base_t(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ iterator_t save = scan.first;
+ if (result_t r = this->subject().parse(scan))
+ {
+ return r;
+ }
+ else
+ {
+ scan.first = save;
+ return scan.empty_match();
+ }
+ }
+ };
+
+ struct optional_parser_gen
+ {
+ template <typename S>
+ struct result
+ {
+ typedef optional<S> type;
+ };
+
+ template <typename S>
+ static optional<S>
+ generate(parser<S> const& a)
+ {
+ return optional<S>(a.derived());
+ }
+ };
+
+ template <typename S>
+ optional<S>
+ operator!(parser<S> const& a);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/optional.ipp>
diff --git a/boost/spirit/home/classic/core/composite/positive.hpp b/boost/spirit/home/classic/core/composite/positive.hpp
new file mode 100644
index 0000000000..7b494b45ca
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/positive.hpp
@@ -0,0 +1,112 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_POSITIVE_HPP)
+#define BOOST_SPIRIT_POSITIVE_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // positive class
+ //
+ // Handles expressions of the form:
+ //
+ // +a
+ //
+ // where a is a parser. The expression returns a composite
+ // parser that matches its subject one (1) or more times.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct positive_parser_gen;
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ template <typename S>
+ struct positive
+ : public unary<S, parser<positive<S> > >
+ {
+ typedef positive<S> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef positive_parser_gen parser_generator_t;
+ typedef unary<S, parser<self_t> > base_t;
+
+ positive(S const& a)
+ : base_t(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ result_t hit = this->subject().parse(scan);
+
+ if (hit)
+ {
+ for (;;)
+ {
+ iterator_t save = scan.first;
+ if (result_t next = this->subject().parse(scan))
+ {
+ scan.concat_match(hit, next);
+ }
+ else
+ {
+ scan.first = save;
+ break;
+ }
+ }
+ }
+ return hit;
+ }
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+ struct positive_parser_gen
+ {
+ template <typename S>
+ struct result
+ {
+ typedef positive<S> type;
+ };
+
+ template <typename S>
+ static positive<S>
+ generate(parser<S> const& a)
+ {
+ return positive<S>(a.derived());
+ }
+ };
+
+ template <typename S>
+ inline positive<S>
+ operator+(parser<S> const& a);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/positive.ipp>
diff --git a/boost/spirit/home/classic/core/composite/sequence.hpp b/boost/spirit/home/classic/core/composite/sequence.hpp
new file mode 100644
index 0000000000..3ccd9ea7a8
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/sequence.hpp
@@ -0,0 +1,142 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SEQUENCE_HPP)
+#define BOOST_SPIRIT_SEQUENCE_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // sequence class
+ //
+ // Handles expressions of the form:
+ //
+ // a >> b
+ //
+ // where a and b are parsers. The expression returns a composite
+ // parser that matches a and b in sequence. One (not both) of the
+ // operands may be a literal char, wchar_t or a primitive string
+ // char const*, wchar_t const*.
+ //
+ //////////////////////////////////////////////////////////////////////////
+ struct sequence_parser_gen;
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ template <typename A, typename B>
+ struct sequence : public binary<A, B, parser<sequence<A, B> > >
+ {
+ typedef sequence<A, B> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef sequence_parser_gen parser_generator_t;
+ typedef binary<A, B, parser<self_t> > base_t;
+
+ sequence(A const& a, B const& b)
+ : base_t(a, b) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ if (result_t ma = this->left().parse(scan))
+ if (result_t mb = this->right().parse(scan))
+ {
+ scan.concat_match(ma, mb);
+ return ma;
+ }
+ return scan.no_match();
+ }
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+ struct sequence_parser_gen
+ {
+ template <typename A, typename B>
+ struct result
+ {
+ typedef
+ sequence<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ type;
+ };
+
+ template <typename A, typename B>
+ static sequence<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ generate(A const& a, B const& b)
+ {
+ return sequence<BOOST_DEDUCED_TYPENAME as_parser<A>::type,
+ BOOST_DEDUCED_TYPENAME as_parser<B>::type>
+ (as_parser<A>::convert(a), as_parser<B>::convert(b));
+ }
+ };
+
+ template <typename A, typename B>
+ sequence<A, B>
+ operator>>(parser<A> const& a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, chlit<char> >
+ operator>>(parser<A> const& a, char b);
+
+ template <typename B>
+ sequence<chlit<char>, B>
+ operator>>(char a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, strlit<char const*> >
+ operator>>(parser<A> const& a, char const* b);
+
+ template <typename B>
+ sequence<strlit<char const*>, B>
+ operator>>(char const* a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, chlit<wchar_t> >
+ operator>>(parser<A> const& a, wchar_t b);
+
+ template <typename B>
+ sequence<chlit<wchar_t>, B>
+ operator>>(wchar_t a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, strlit<wchar_t const*> >
+ operator>>(parser<A> const& a, wchar_t const* b);
+
+ template <typename B>
+ sequence<strlit<wchar_t const*>, B>
+ operator>>(wchar_t const* a, parser<B> const& b);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/sequence.ipp>
diff --git a/boost/spirit/home/classic/core/composite/sequential_and.hpp b/boost/spirit/home/classic/core/composite/sequential_and.hpp
new file mode 100644
index 0000000000..da11f8729a
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/sequential_and.hpp
@@ -0,0 +1,76 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SEQUENTIAL_AND_HPP)
+#define BOOST_SPIRIT_SEQUENTIAL_AND_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // sequential-and operators
+ //
+ // Handles expressions of the form:
+ //
+ // a && b
+ //
+ // Same as a >> b.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ sequence<A, B>
+ operator&&(parser<A> const& a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, chlit<char> >
+ operator&&(parser<A> const& a, char b);
+
+ template <typename B>
+ sequence<chlit<char>, B>
+ operator&&(char a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, strlit<char const*> >
+ operator&&(parser<A> const& a, char const* b);
+
+ template <typename B>
+ sequence<strlit<char const*>, B>
+ operator&&(char const* a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, chlit<wchar_t> >
+ operator&&(parser<A> const& a, wchar_t b);
+
+ template <typename B>
+ sequence<chlit<wchar_t>, B>
+ operator&&(wchar_t a, parser<B> const& b);
+
+ template <typename A>
+ sequence<A, strlit<wchar_t const*> >
+ operator&&(parser<A> const& a, wchar_t const* b);
+
+ template <typename B>
+ sequence<strlit<wchar_t const*>, B>
+ operator&&(wchar_t const* a, parser<B> const& b);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/sequential_and.ipp>
diff --git a/boost/spirit/home/classic/core/composite/sequential_or.hpp b/boost/spirit/home/classic/core/composite/sequential_or.hpp
new file mode 100644
index 0000000000..b276f6c9c3
--- /dev/null
+++ b/boost/spirit/home/classic/core/composite/sequential_or.hpp
@@ -0,0 +1,154 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ Copyright (c) 2002 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SEQUENTIAL_OR_HPP)
+#define BOOST_SPIRIT_SEQUENTIAL_OR_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // sequential-or class
+ //
+ // Handles expressions of the form:
+ //
+ // a || b
+ //
+ // Equivalent to
+ //
+ // a | b | a >> b;
+ //
+ // where a and b are parsers. The expression returns a composite
+ // parser that matches matches a or b in sequence. One (not both) of
+ // the operands may be a literal char, wchar_t or a primitive string
+ // char const*, wchar_t const*.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct sequential_or_parser_gen;
+
+ template <typename A, typename B>
+ struct sequential_or : public binary<A, B, parser<sequential_or<A, B> > >
+ {
+ typedef sequential_or<A, B> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef sequential_or_parser_gen parser_generator_t;
+ typedef binary<A, B, parser<self_t> > base_t;
+
+ sequential_or(A const& a, B const& b)
+ : base_t(a, b) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ { // scope for save
+ iterator_t save = scan.first;
+ if (result_t ma = this->left().parse(scan))
+ {
+ save = scan.first;
+ if (result_t mb = this->right().parse(scan))
+ {
+ // matched a b
+ scan.concat_match(ma, mb);
+ return ma;
+ }
+ else
+ {
+ // matched a
+ scan.first = save;
+ return ma;
+ }
+ }
+ scan.first = save;
+ }
+
+ // matched b
+ return this->right().parse(scan);
+ }
+ };
+
+ struct sequential_or_parser_gen
+ {
+ template <typename A, typename B>
+ struct result
+ {
+ typedef
+ sequential_or<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ type;
+ };
+
+ template <typename A, typename B>
+ static sequential_or<
+ typename as_parser<A>::type
+ , typename as_parser<B>::type
+ >
+ generate(A const& a, B const& b)
+ {
+ return sequential_or<BOOST_DEDUCED_TYPENAME as_parser<A>::type,
+ BOOST_DEDUCED_TYPENAME as_parser<B>::type>
+ (as_parser<A>::convert(a), as_parser<B>::convert(b));
+ }
+ };
+
+ template <typename A, typename B>
+ sequential_or<A, B>
+ operator||(parser<A> const& a, parser<B> const& b);
+
+ template <typename A>
+ sequential_or<A, chlit<char> >
+ operator||(parser<A> const& a, char b);
+
+ template <typename B>
+ sequential_or<chlit<char>, B>
+ operator||(char a, parser<B> const& b);
+
+ template <typename A>
+ sequential_or<A, strlit<char const*> >
+ operator||(parser<A> const& a, char const* b);
+
+ template <typename B>
+ sequential_or<strlit<char const*>, B>
+ operator||(char const* a, parser<B> const& b);
+
+ template <typename A>
+ sequential_or<A, chlit<wchar_t> >
+ operator||(parser<A> const& a, wchar_t b);
+
+ template <typename B>
+ sequential_or<chlit<wchar_t>, B>
+ operator||(wchar_t a, parser<B> const& b);
+
+ template <typename A>
+ sequential_or<A, strlit<wchar_t const*> >
+ operator||(parser<A> const& a, wchar_t const* b);
+
+ template <typename B>
+ sequential_or<strlit<wchar_t const*>, B>
+ operator||(wchar_t const* a, parser<B> const& b);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/composite/impl/sequential_or.ipp>
diff --git a/boost/spirit/home/classic/core/config.hpp b/boost/spirit/home/classic/core/config.hpp
new file mode 100644
index 0000000000..57eca7f037
--- /dev/null
+++ b/boost/spirit/home/classic/core/config.hpp
@@ -0,0 +1,62 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CONFIG_HPP)
+#define BOOST_SPIRIT_CONFIG_HPP
+
+#include <boost/config.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Compiler check:
+//
+// Historically, Spirit supported a lot of compilers, including (to some
+// extent) poorly conforming compilers such as VC6. Spirit v1.6.x will be
+// the last release that will support older poorly conforming compilers.
+// Starting from Spirit v1.8.0, ill conforming compilers will not be
+// supported. If you are still using one of these older compilers, you can
+// still use Spirit v1.6.x.
+//
+// The reason why Spirit v1.6.x worked on old non-conforming compilers is
+// that the authors laboriously took the trouble of searching for
+// workarounds to make these compilers happy. The process takes a lot of
+// time and energy, especially when one encounters the dreaded ICE or
+// "Internal Compiler Error". Sometimes searching for a single workaround
+// takes days or even weeks. Sometimes, there are no known workarounds. This
+// stifles progress a lot. And, as the library gets more progressive and
+// takes on more advanced C++ techniques, the difficulty is escalated to
+// even new heights.
+//
+// Spirit v1.6.x will still be supported. Maintenance and bug fixes will
+// still be applied. There will still be active development for the back-
+// porting of new features introduced in Spirit v1.8.0 (and Spirit 1.9.0)
+// to lesser able compilers; hopefully, fueled by contributions from the
+// community. For instance, there is already a working AST tree back-port
+// for VC6 and VC7 by Peder Holt.
+//
+// If you got here somehow, your compiler is known to be poorly conforming
+// WRT ANSI/ISO C++ standard. Library implementers get a bad reputation when
+// someone attempts to compile the code on a non-conforming compiler. She'll
+// be confronted with tons of compiler errors when she tries to compile the
+// library. Such errors will somehow make less informed users conclude that
+// the code is poorly written. It's better for the user to see a message
+// "sorry, this code has not been ported to your compiler yet", than to see
+// pages and pages of compiler error messages.
+//
+/////////////////////////////////////////////////////////////////////////////////
+#if (defined(BOOST_MSVC) && (BOOST_MSVC < 1310)) \
+ || (defined(__BORLANDC__) && (__BORLANDC__ <= 0x570)) \
+ || (defined(__GNUC__) && (__GNUC__ < 3)) \
+ || (defined(__GNUC__) && (__GNUC__ == 3) && (__GNUC_MINOR__ < 1))
+# error "Compiler not supported. See note in <boost/spirit/core/config.hpp>"
+#else
+// Pass... Compiler supported.
+#endif
+
+#endif
+
+
diff --git a/boost/spirit/home/classic/core/impl/match.ipp b/boost/spirit/home/classic/core/impl/match.ipp
new file mode 100644
index 0000000000..0319dcf4e3
--- /dev/null
+++ b/boost/spirit/home/classic/core/impl/match.ipp
@@ -0,0 +1,113 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_MATCH_IPP)
+#define BOOST_SPIRIT_MATCH_IPP
+#include <algorithm>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename T>
+ inline match<T>::match()
+ : len(-1), val() {}
+
+ template <typename T>
+ inline match<T>::match(std::size_t length_)
+ : len(length_), val() {}
+
+ template <typename T>
+ inline match<T>::match(std::size_t length_, ctor_param_t val_)
+ : len(length_), val(val_) {}
+
+ template <typename T>
+ inline bool
+ match<T>::operator!() const
+ {
+ return len < 0;
+ }
+
+ template <typename T>
+ inline std::ptrdiff_t
+ match<T>::length() const
+ {
+ return len;
+ }
+
+ template <typename T>
+ inline bool
+ match<T>::has_valid_attribute() const
+ {
+ return val.is_initialized();
+ }
+
+ template <typename T>
+ inline typename match<T>::return_t
+ match<T>::value() const
+ {
+ BOOST_SPIRIT_ASSERT(val.is_initialized());
+ return *val;
+ }
+
+ template <typename T>
+ inline void
+ match<T>::swap(match& other)
+ {
+ std::swap(len, other.len);
+ std::swap(val, other.val);
+ }
+
+ inline match<nil_t>::match()
+ : len(-1) {}
+
+ inline match<nil_t>::match(std::size_t length_)
+ : len(length_) {}
+
+ inline match<nil_t>::match(std::size_t length_, nil_t)
+ : len(length_) {}
+
+ inline bool
+ match<nil_t>::operator!() const
+ {
+ return len < 0;
+ }
+
+ inline bool
+ match<nil_t>::has_valid_attribute() const
+ {
+ return false;
+ }
+
+ inline std::ptrdiff_t
+ match<nil_t>::length() const
+ {
+ return len;
+ }
+
+ inline nil_t
+ match<nil_t>::value() const
+ {
+ return nil_t();
+ }
+
+ inline void
+ match<nil_t>::value(nil_t) {}
+
+ inline void
+ match<nil_t>::swap(match<nil_t>& other)
+ {
+ std::swap(len, other.len);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/impl/match_attr_traits.ipp b/boost/spirit/home/classic/core/impl/match_attr_traits.ipp
new file mode 100644
index 0000000000..24d9a43791
--- /dev/null
+++ b/boost/spirit/home/classic/core/impl/match_attr_traits.ipp
@@ -0,0 +1,102 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_MATCH_ATTR_TRAITS_IPP)
+#define BOOST_SPIRIT_MATCH_ATTR_TRAITS_IPP
+
+#include <boost/optional.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace impl
+{
+ template <typename T>
+ struct match_attr_traits
+ {
+ typedef typename
+ boost::optional<T>::reference_const_type
+ const_reference;
+
+ // case where src *IS* convertible to T (dest)
+ template <typename T2>
+ static void
+ convert(boost::optional<T>& dest, T2 const& src, mpl::true_)
+ {
+ dest.reset(src);
+ }
+
+ // case where src *IS NOT* convertible to T (dest)
+ template <typename T2>
+ static void
+ convert(boost::optional<T>& dest, T2 const& /*src*/, mpl::false_)
+ {
+ dest.reset();
+ }
+
+ static void
+ convert(boost::optional<T>& dest, nil_t/*src*/)
+ {
+ dest.reset();
+ }
+
+ template <typename T2>
+ static void
+ convert(boost::optional<T>& dest, T2 const& src)
+ {
+ convert(dest, src, is_convertible<T2, T>());
+ }
+
+ template <typename OtherMatchT>
+ static void
+ copy(boost::optional<T>& dest, OtherMatchT const& src)
+ {
+ if (src.has_valid_attribute())
+ convert(dest, src.value());
+ }
+
+ template <typename OtherMatchT>
+ static void
+ assign(boost::optional<T>& dest, OtherMatchT const& src)
+ {
+ if (src.has_valid_attribute())
+ convert(dest, src.value());
+ else
+ dest.reset();
+ }
+
+ // T is not reference
+ template <typename ValueT>
+ static void
+ set_value(boost::optional<T>& dest, ValueT const& val, mpl::false_)
+ {
+ dest.reset(val);
+ }
+
+ // T is a reference
+ template <typename ValueT>
+ static void
+ set_value(boost::optional<T>& dest, ValueT const& val, mpl::true_)
+ {
+ dest.get() = val;
+ }
+ };
+
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit::impl
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/impl/parser.ipp b/boost/spirit/home/classic/core/impl/parser.ipp
new file mode 100644
index 0000000000..d5abe692fa
--- /dev/null
+++ b/boost/spirit/home/classic/core/impl/parser.ipp
@@ -0,0 +1,55 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_PARSER_IPP)
+#define BOOST_SPIRIT_PARSER_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Generic parse function implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename IteratorT, typename DerivedT>
+ inline parse_info<IteratorT>
+ parse(
+ IteratorT const& first_
+ , IteratorT const& last
+ , parser<DerivedT> const& p)
+ {
+ IteratorT first = first_;
+ scanner<IteratorT, scanner_policies<> > scan(first, last);
+ match<nil_t> hit = p.derived().parse(scan);
+ return parse_info<IteratorT>(
+ first, hit, hit && (first == last), hit.length());
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Parse function for null terminated strings implementation
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT, typename DerivedT>
+ inline parse_info<CharT const*>
+ parse(CharT const* str, parser<DerivedT> const& p)
+ {
+ CharT const* last = str;
+ while (*last)
+ last++;
+ return parse(str, last, p);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/match.hpp b/boost/spirit/home/classic/core/match.hpp
new file mode 100644
index 0000000000..6f1822ece3
--- /dev/null
+++ b/boost/spirit/home/classic/core/match.hpp
@@ -0,0 +1,185 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_MATCH_HPP)
+#define BOOST_SPIRIT_MATCH_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/config.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+#include <boost/call_traits.hpp>
+#include <boost/optional.hpp>
+#include <boost/spirit/home/classic/core/assert.hpp>
+#include <boost/spirit/home/classic/core/safe_bool.hpp>
+#include <boost/spirit/home/classic/core/impl/match_attr_traits.ipp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/is_reference.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // match class
+ //
+ // The match holds the result of a parser. A match object evaluates
+ // to true when a successful match is found, otherwise false. The
+ // length of the match is the number of characters (or tokens) that
+ // is successfully matched. This can be queried through its length()
+ // member function. A negative value means that the match is
+ // unsucessful.
+ //
+ // Each parser may have an associated attribute. This attribute is
+ // also returned back to the client on a successful parse through
+ // the match object. The match's value() member function returns the
+ // match's attribute.
+ //
+ // A match attribute is valid:
+ //
+ // * on a successful match
+ // * when its value is set through the value(val) member function
+ // * if it is assigned or copied from a compatible match object
+ // (e.g. match<double> from match<int>) with a valid attribute.
+ //
+ // The match attribute is undefined:
+ //
+ // * on an unsuccessful match
+ // * when an attempt to copy or assign from another match object
+ // with an incompatible attribute type (e.g. match<std::string>
+ // from match<int>).
+ //
+ // The member function has_valid_attribute() can be queried to know if
+ // it is safe to get the match's attribute. The attribute may be set
+ // through the member function value(v) where v is the new attribute
+ // value.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T = nil_t>
+ class match : public safe_bool<match<T> >
+ {
+
+ public:
+
+ typedef typename boost::optional<T> optional_type;
+ typedef typename optional_type::argument_type ctor_param_t;
+ typedef typename optional_type::reference_const_type return_t;
+ typedef T attr_t;
+
+ match();
+ explicit match(std::size_t length);
+ match(std::size_t length, ctor_param_t val);
+
+ bool operator!() const;
+ std::ptrdiff_t length() const;
+ bool has_valid_attribute() const;
+ return_t value() const;
+ void swap(match& other);
+
+ template <typename T2>
+ match(match<T2> const& other)
+ : len(other.length()), val()
+ {
+ impl::match_attr_traits<T>::copy(val, other);
+ }
+
+ template <typename T2>
+ match&
+ operator=(match<T2> const& other)
+ {
+ impl::match_attr_traits<T>::assign(val, other);
+ len = other.length();
+ return *this;
+ }
+
+ template <typename MatchT>
+ void
+ concat(MatchT const& other)
+ {
+ BOOST_SPIRIT_ASSERT(*this && other);
+ len += other.length();
+ }
+
+ template <typename ValueT>
+ void
+ value(ValueT const& val_)
+ {
+ impl::match_attr_traits<T>::set_value(val, val_, is_reference<T>());
+ }
+
+ bool operator_bool() const
+ {
+ return len >= 0;
+ }
+
+ private:
+
+ std::ptrdiff_t len;
+ optional_type val;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // match class specialization for nil_t values
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ class match<nil_t> : public safe_bool<match<nil_t> >
+ {
+ public:
+
+ typedef nil_t attr_t;
+ typedef nil_t return_t;
+
+ match();
+ explicit match(std::size_t length);
+ match(std::size_t length, nil_t);
+
+ bool operator!() const;
+ bool has_valid_attribute() const;
+ std::ptrdiff_t length() const;
+ nil_t value() const;
+ void value(nil_t);
+ void swap(match& other);
+
+ template <typename T>
+ match(match<T> const& other)
+ : len(other.length()) {}
+
+ template <typename T>
+ match<>&
+ operator=(match<T> const& other)
+ {
+ len = other.length();
+ return *this;
+ }
+
+ template <typename T>
+ void
+ concat(match<T> const& other)
+ {
+ BOOST_SPIRIT_ASSERT(*this && other);
+ len += other.length();
+ }
+
+ bool operator_bool() const
+ {
+ return len >= 0;
+ }
+
+ private:
+
+ std::ptrdiff_t len;
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+#include <boost/spirit/home/classic/core/impl/match.ipp>
+
diff --git a/boost/spirit/home/classic/core/nil.hpp b/boost/spirit/home/classic/core/nil.hpp
new file mode 100644
index 0000000000..c94c064d6b
--- /dev/null
+++ b/boost/spirit/home/classic/core/nil.hpp
@@ -0,0 +1,25 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_NIL_HPP)
+#define BOOST_SPIRIT_NIL_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ struct nil_t {};
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
+
+
diff --git a/boost/spirit/home/classic/core/non_terminal/grammar.hpp b/boost/spirit/home/classic/core/non_terminal/grammar.hpp
new file mode 100644
index 0000000000..ae7b2658f3
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/grammar.hpp
@@ -0,0 +1,85 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Martin Wille
+ Copyright (c) 2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_GRAMMAR_HPP)
+#define BOOST_SPIRIT_GRAMMAR_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#if defined(BOOST_SPIRIT_THREADSAFE) && defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE)
+#undef BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE
+#endif
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/parser_context.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// grammar class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename DerivedT, typename ContextT = parser_context<> >
+struct grammar
+ : public parser<DerivedT>
+ , public ContextT::base_t
+ , public context_aux<ContextT, DerivedT>
+ BOOST_SPIRIT_GRAMMAR_ID
+{
+ typedef grammar<DerivedT, ContextT> self_t;
+ typedef DerivedT const& embed_t;
+ typedef typename ContextT::context_linker_t context_t;
+ typedef typename context_t::attr_t attr_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, attr_t>::type type;
+ };
+
+ grammar() {}
+ ~grammar() { impl::grammar_destruct(this); }
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse_main(ScannerT const& scan) const
+ { return impl::grammar_parser_parse<0>(this, scan); }
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef parser_scanner_linker<ScannerT> scanner_t;
+ BOOST_SPIRIT_CONTEXT_PARSE(scan, *this, scanner_t, context_t, result_t)
+ }
+
+ template <int N>
+ impl::entry_grammar<DerivedT, N, ContextT>
+ use_parser() const
+ { return impl::entry_grammar<DerivedT, N, ContextT>( this->derived()); }
+
+ BOOST_SPIRIT_GRAMMAR_STATE
+};
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#undef BOOST_SPIRIT_GRAMMAR_ID
+#undef BOOST_SPIRIT_GRAMMAR_ACCESS
+#undef BOOST_SPIRIT_GRAMMAR_STATE
+#endif
+
diff --git a/boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp b/boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp
new file mode 100644
index 0000000000..3b25b3d2e3
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp
@@ -0,0 +1,407 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Martin Wille
+ Copyright (c) 2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined BOOST_SPIRIT_GRAMMAR_IPP
+#define BOOST_SPIRIT_GRAMMAR_IPP
+
+#if !defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE)
+#include <boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp>
+#include <algorithm>
+#include <functional>
+#include <memory> // for std::auto_ptr
+#include <boost/weak_ptr.hpp>
+#endif
+
+#ifdef BOOST_SPIRIT_THREADSAFE
+#include <boost/spirit/home/classic/core/non_terminal/impl/static.hpp>
+#include <boost/thread/tss.hpp>
+#include <boost/thread/mutex.hpp>
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+template <typename DerivedT, typename ContextT>
+struct grammar;
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
+
+BOOST_SPIRIT_DEPENDENT_TEMPLATE_WRAPPER(grammar_definition_wrapper, definition);
+
+//////////////////////////////////
+template <typename GrammarT, typename ScannerT>
+struct grammar_definition
+{
+ typedef typename impl::grammar_definition_wrapper<GrammarT>
+ ::template result_<ScannerT>::param_t type;
+};
+
+#else
+
+//////////////////////////////////
+template <typename GrammarT, typename ScannerT>
+struct grammar_definition
+{
+ typedef typename GrammarT::template definition<ScannerT> type;
+};
+
+#endif
+
+ namespace impl
+ {
+
+#if !defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE)
+ struct grammar_tag {};
+
+ //////////////////////////////////
+ template <typename GrammarT>
+ struct grammar_helper_base
+ {
+ virtual int undefine(GrammarT *) = 0;
+ virtual ~grammar_helper_base() {}
+ };
+
+ //////////////////////////////////
+ template <typename GrammarT>
+ struct grammar_helper_list
+ {
+ typedef GrammarT grammar_t;
+ typedef grammar_helper_base<GrammarT> helper_t;
+ typedef std::vector<helper_t*> vector_t;
+
+ grammar_helper_list() {}
+ grammar_helper_list(grammar_helper_list const& /*x*/)
+ { // Does _not_ copy the helpers member !
+ }
+
+ grammar_helper_list& operator=(grammar_helper_list const& x)
+ { // Does _not_ copy the helpers member !
+ return *this;
+ }
+
+ void push_back(helper_t *helper)
+ { helpers.push_back(helper); }
+
+ void pop_back()
+ { helpers.pop_back(); }
+
+ typename vector_t::size_type
+ size() const
+ { return helpers.size(); }
+
+ typename vector_t::reverse_iterator
+ rbegin()
+ { return helpers.rbegin(); }
+
+ typename vector_t::reverse_iterator
+ rend()
+ { return helpers.rend(); }
+
+#ifdef BOOST_SPIRIT_THREADSAFE
+ boost::mutex & mutex()
+ { return m; }
+#endif
+
+ private:
+
+ vector_t helpers;
+#ifdef BOOST_SPIRIT_THREADSAFE
+ boost::mutex m;
+#endif
+ };
+
+ //////////////////////////////////
+ struct grammartract_helper_list;
+
+#if !defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE) \
+ && (!defined(__GNUC__) || (__GNUC__ > 2))
+
+ struct grammartract_helper_list
+ {
+ template<typename GrammarT>
+ static grammar_helper_list<GrammarT>&
+ do_(GrammarT const* g)
+ {
+ return g->helpers;
+ }
+ };
+
+#endif
+
+ //////////////////////////////////
+ template <typename GrammarT, typename DerivedT, typename ScannerT>
+ struct grammar_helper : private grammar_helper_base<GrammarT>
+ {
+ typedef GrammarT grammar_t;
+ typedef ScannerT scanner_t;
+ typedef DerivedT derived_t;
+ typedef typename grammar_definition<DerivedT, ScannerT>::type definition_t;
+
+ typedef grammar_helper<grammar_t, derived_t, scanner_t> helper_t;
+ typedef boost::shared_ptr<helper_t> helper_ptr_t;
+ typedef boost::weak_ptr<helper_t> helper_weak_ptr_t;
+
+ grammar_helper*
+ this_() { return this; }
+
+ grammar_helper(helper_weak_ptr_t& p)
+ : definitions_cnt(0)
+ , self(this_())
+ { p = self; }
+
+ definition_t&
+ define(grammar_t const* target_grammar)
+ {
+ grammar_helper_list<GrammarT> &helpers =
+#if !defined(__GNUC__) || (__GNUC__ > 2)
+ grammartract_helper_list::do_(target_grammar);
+#else
+ target_grammar->helpers;
+#endif
+ typename grammar_t::object_id id = target_grammar->get_object_id();
+
+ if (definitions.size()<=id)
+ definitions.resize(id*3/2+1);
+ if (definitions[id]!=0)
+ return *definitions[id];
+
+ std::auto_ptr<definition_t>
+ result(new definition_t(target_grammar->derived()));
+
+#ifdef BOOST_SPIRIT_THREADSAFE
+ boost::mutex::scoped_lock lock(helpers.mutex());
+#endif
+ helpers.push_back(this);
+
+ ++definitions_cnt;
+ definitions[id] = result.get();
+ return *(result.release());
+ }
+
+ int
+ undefine(grammar_t* target_grammar)
+ {
+ typename grammar_t::object_id id = target_grammar->get_object_id();
+
+ if (definitions.size()<=id)
+ return 0;
+ delete definitions[id];
+ definitions[id] = 0;
+ if (--definitions_cnt==0)
+ self.reset();
+ return 0;
+ }
+
+ private:
+
+ std::vector<definition_t*> definitions;
+ unsigned long definitions_cnt;
+ helper_ptr_t self;
+ };
+
+#endif /* defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE) */
+
+#ifdef BOOST_SPIRIT_THREADSAFE
+ class get_definition_static_data_tag
+ {
+ template<typename DerivedT, typename ContextT, typename ScannerT>
+ friend typename DerivedT::template definition<ScannerT> &
+ get_definition(grammar<DerivedT, ContextT> const* self);
+
+ get_definition_static_data_tag() {}
+ };
+#endif
+
+ template<typename DerivedT, typename ContextT, typename ScannerT>
+ inline typename DerivedT::template definition<ScannerT> &
+ get_definition(grammar<DerivedT, ContextT> const* self)
+ {
+#if defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE)
+
+ typedef typename DerivedT::template definition<ScannerT> definition_t;
+ static definition_t def(self->derived());
+ return def;
+#else
+ typedef grammar<DerivedT, ContextT> self_t;
+ typedef impl::grammar_helper<self_t, DerivedT, ScannerT> helper_t;
+ typedef typename helper_t::helper_weak_ptr_t ptr_t;
+
+# ifdef BOOST_SPIRIT_THREADSAFE
+ boost::thread_specific_ptr<ptr_t> & tld_helper
+ = static_<boost::thread_specific_ptr<ptr_t>,
+ get_definition_static_data_tag>(get_definition_static_data_tag());
+
+ if (!tld_helper.get())
+ tld_helper.reset(new ptr_t);
+ ptr_t &helper = *tld_helper;
+# else
+ static ptr_t helper;
+# endif
+ if (helper.expired())
+ new helper_t(helper);
+ return helper.lock()->define(self);
+#endif
+ }
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ template <int N>
+ struct call_helper {
+
+ template <typename RT, typename DefinitionT, typename ScannerT>
+ static void
+ do_ (RT &result, DefinitionT &def, ScannerT const &scan)
+ {
+ result = def.template get_start_parser<N>()->parse(scan);
+ }
+ };
+#else
+ // The grammar_def stuff isn't supported for compilers, which do not
+ // support partial template specialization
+ template <int N> struct call_helper;
+#endif
+
+ template <>
+ struct call_helper<0> {
+
+ template <typename RT, typename DefinitionT, typename ScannerT>
+ static void
+ do_ (RT &result, DefinitionT &def, ScannerT const &scan)
+ {
+ result = def.start().parse(scan);
+ }
+ };
+
+ //////////////////////////////////
+ template<int N, typename DerivedT, typename ContextT, typename ScannerT>
+ inline typename parser_result<grammar<DerivedT, ContextT>, ScannerT>::type
+ grammar_parser_parse(
+ grammar<DerivedT, ContextT> const* self,
+ ScannerT const &scan)
+ {
+ typedef
+ typename parser_result<grammar<DerivedT, ContextT>, ScannerT>::type
+ result_t;
+ typedef typename DerivedT::template definition<ScannerT> definition_t;
+
+ result_t result;
+ definition_t &def = get_definition<DerivedT, ContextT, ScannerT>(self);
+
+ call_helper<N>::do_(result, def, scan);
+ return result;
+ }
+
+ //////////////////////////////////
+ template<typename GrammarT>
+ inline void
+ grammar_destruct(GrammarT* self)
+ {
+#if !defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE)
+ typedef impl::grammar_helper_base<GrammarT> helper_base_t;
+ typedef grammar_helper_list<GrammarT> helper_list_t;
+ typedef typename helper_list_t::vector_t::reverse_iterator iterator_t;
+
+ helper_list_t& helpers =
+# if !defined(__GNUC__) || (__GNUC__ > 2)
+ grammartract_helper_list::do_(self);
+# else
+ self->helpers;
+# endif
+
+# if (defined(BOOST_MSVC) && (BOOST_MSVC < 1300)) \
+ || defined(BOOST_INTEL_CXX_VERSION)
+ for (iterator_t i = helpers.rbegin(); i != helpers.rend(); ++i)
+ (*i)->undefine(self);
+# else
+ std::for_each(helpers.rbegin(), helpers.rend(),
+ std::bind2nd(std::mem_fun(&helper_base_t::undefine), self));
+# endif
+
+#else
+ (void)self;
+#endif
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // entry_grammar class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename DerivedT, int N, typename ContextT>
+ class entry_grammar
+ : public parser<entry_grammar<DerivedT, N, ContextT> >
+ {
+
+ public:
+ typedef entry_grammar<DerivedT, N, ContextT> self_t;
+ typedef self_t embed_t;
+ typedef typename ContextT::context_linker_t context_t;
+ typedef typename context_t::attr_t attr_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, attr_t>::type type;
+ };
+
+ entry_grammar(DerivedT const &p) : target_grammar(p) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse_main(ScannerT const& scan) const
+ { return impl::grammar_parser_parse<N>(&target_grammar, scan); }
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef parser_scanner_linker<ScannerT> scanner_t;
+ BOOST_SPIRIT_CONTEXT_PARSE(scan, target_grammar, scanner_t,
+ context_t, result_t)
+ }
+
+ private:
+ DerivedT const &target_grammar;
+ };
+
+ } // namespace impl
+
+///////////////////////////////////////
+#if !defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE)
+#define BOOST_SPIRIT_GRAMMAR_ID , public impl::object_with_id<impl::grammar_tag>
+#else
+#define BOOST_SPIRIT_GRAMMAR_ID
+#endif
+
+///////////////////////////////////////
+#if !defined(__GNUC__) || (__GNUC__ > 2)
+#define BOOST_SPIRIT_GRAMMAR_ACCESS private:
+#else
+#define BOOST_SPIRIT_GRAMMAR_ACCESS
+#endif
+
+///////////////////////////////////////
+#if !defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE)
+#define BOOST_SPIRIT_GRAMMAR_STATE \
+ BOOST_SPIRIT_GRAMMAR_ACCESS \
+ friend struct impl::grammartract_helper_list; \
+ mutable impl::grammar_helper_list<self_t> helpers;
+#else
+#define BOOST_SPIRIT_GRAMMAR_STATE
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp b/boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp
new file mode 100644
index 0000000000..822180a977
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp
@@ -0,0 +1,191 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined BOOST_SPIRIT_OBJECT_WITH_ID_IPP
+#define BOOST_SPIRIT_OBJECT_WITH_ID_IPP
+
+#include <vector>
+#include <boost/shared_ptr.hpp>
+
+#ifdef BOOST_SPIRIT_THREADSAFE
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/once.hpp>
+#endif
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl {
+
+ //////////////////////////////////
+ template <typename IdT = std::size_t>
+ struct object_with_id_base_supply
+ {
+ typedef IdT object_id;
+ typedef std::vector<object_id> id_vector;
+
+ object_with_id_base_supply() : max_id(object_id()) {}
+
+#ifdef BOOST_SPIRIT_THREADSAFE
+ boost::mutex mutex;
+#endif
+ object_id max_id;
+ id_vector free_ids;
+
+ object_id acquire();
+ void release(object_id);
+ };
+
+ //////////////////////////////////
+ template <typename TagT, typename IdT = std::size_t>
+ struct object_with_id_base
+ {
+ typedef TagT tag_t;
+ typedef IdT object_id;
+
+ protected:
+
+ object_id acquire_object_id();
+ void release_object_id(object_id);
+
+ private:
+#ifdef BOOST_SPIRIT_THREADSAFE
+ static boost::mutex &mutex_instance();
+ static void mutex_init();
+#endif
+
+ boost::shared_ptr<object_with_id_base_supply<IdT> > id_supply;
+ };
+
+ //////////////////////////////////
+ template<class TagT, typename IdT = std::size_t>
+ struct object_with_id : private object_with_id_base<TagT, IdT>
+ {
+ typedef object_with_id<TagT, IdT> self_t;
+ typedef object_with_id_base<TagT, IdT> base_t;
+ typedef IdT object_id;
+
+ object_with_id() : id(base_t::acquire_object_id()) {}
+ object_with_id(self_t const &other)
+ : base_t(other)
+ , id(base_t::acquire_object_id())
+ {} // don't copy id
+ self_t &operator = (self_t const &other)
+ { // don't assign id
+ base_t::operator=(other);
+ return *this;
+ }
+ ~object_with_id() { base_t::release_object_id(id); }
+ object_id get_object_id() const { return id; }
+
+ private:
+
+ object_id const id;
+ };
+
+ //////////////////////////////////
+ template <typename IdT>
+ inline IdT
+ object_with_id_base_supply<IdT>::acquire()
+ {
+#ifdef BOOST_SPIRIT_THREADSAFE
+ boost::mutex::scoped_lock lock(mutex);
+#endif
+ if (free_ids.size())
+ {
+ object_id id = *free_ids.rbegin();
+ free_ids.pop_back();
+ return id;
+ }
+ else
+ {
+ if (free_ids.capacity()<=max_id)
+ free_ids.reserve(max_id*3/2+1);
+ return ++max_id;
+ }
+ }
+
+ //////////////////////////////////
+ template <typename IdT>
+ inline void
+ object_with_id_base_supply<IdT>::release(IdT id)
+ {
+#ifdef BOOST_SPIRIT_THREADSAFE
+ boost::mutex::scoped_lock lock(mutex);
+#endif
+ if (max_id == id)
+ max_id--;
+ else
+ free_ids.push_back(id); // doesn't throw
+ }
+
+ //////////////////////////////////
+ template <typename TagT, typename IdT>
+ inline IdT
+ object_with_id_base<TagT, IdT>::acquire_object_id()
+ {
+ {
+#ifdef BOOST_SPIRIT_THREADSAFE
+ static boost::once_flag been_here = BOOST_ONCE_INIT;
+ boost::call_once(been_here, mutex_init);
+ boost::mutex &mutex = mutex_instance();
+ boost::mutex::scoped_lock lock(mutex);
+#endif
+ static boost::shared_ptr<object_with_id_base_supply<IdT> >
+ static_supply;
+
+ if (!static_supply.get())
+ static_supply.reset(new object_with_id_base_supply<IdT>());
+ id_supply = static_supply;
+ }
+
+ return id_supply->acquire();
+ }
+
+ //////////////////////////////////
+ template <typename TagT, typename IdT>
+ inline void
+ object_with_id_base<TagT, IdT>::release_object_id(IdT id)
+ {
+ id_supply->release(id);
+ }
+
+ //////////////////////////////////
+#ifdef BOOST_SPIRIT_THREADSAFE
+ template <typename TagT, typename IdT>
+ inline boost::mutex &
+ object_with_id_base<TagT, IdT>::mutex_instance()
+ {
+ static boost::mutex mutex;
+ return mutex;
+ }
+#endif
+
+ //////////////////////////////////
+#ifdef BOOST_SPIRIT_THREADSAFE
+ template <typename TagT, typename IdT>
+ inline void
+ object_with_id_base<TagT, IdT>::mutex_init()
+ {
+ mutex_instance();
+ }
+#endif
+
+ } // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/non_terminal/impl/rule.ipp b/boost/spirit/home/classic/core/non_terminal/impl/rule.ipp
new file mode 100644
index 0000000000..9f10306f7c
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/impl/rule.ipp
@@ -0,0 +1,420 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_RULE_IPP)
+#define BOOST_SPIRIT_RULE_IPP
+
+#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/repeat_from_to.hpp>
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/enum_params_with_defaults.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+#include <boost/preprocessor/inc.hpp>
+#include <boost/preprocessor/cat.hpp>
+#endif
+
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/scanner/scanner.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/parser_context.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/parser_id.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+
+ template <
+ BOOST_PP_ENUM_BINARY_PARAMS(
+ BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT,
+ typename ScannerT, = mpl::void_ BOOST_PP_INTERCEPT
+ )
+ >
+ struct scanner_list;
+
+#endif // BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace impl
+ {
+ template <typename BaseT, typename DefaultT
+ , typename T0, typename T1, typename T2>
+ struct get_param
+ {
+ typedef typename mpl::if_<
+ is_base_and_derived<BaseT, T0>
+ , T0
+ , typename mpl::if_<
+ is_base_and_derived<BaseT, T1>
+ , T1
+ , typename mpl::if_<
+ is_base_and_derived<BaseT, T2>
+ , T2
+ , DefaultT
+ >::type
+ >::type
+ >::type type;
+ };
+
+ template <typename T0, typename T1, typename T2>
+ struct get_context
+ {
+ typedef typename get_param<
+ parser_context_base, parser_context<>, T0, T1, T2>::type
+ type;
+ };
+
+ template <typename T0, typename T1, typename T2>
+ struct get_tag
+ {
+ typedef typename get_param<
+ parser_tag_base, parser_address_tag, T0, T1, T2>::type
+ type;
+ };
+
+ template <typename T0, typename T1, typename T2>
+ struct get_scanner
+ {
+ typedef typename get_param<
+ scanner_base, scanner<>, T0, T1, T2>::type
+ type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // rule_base class
+ //
+ // The rule_base class implements the basic plumbing for rules
+ // minus the storage mechanism. It is up to the derived class
+ // to actually store the definition somewhere. The rule_base
+ // class assumes that the derived class provides a get() function
+ // that will return a pointer to a parser. The get() function
+ // may return NULL. See rule below for details.
+ //
+ // <<< For framework use only. Not for public consumption. >>>
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <
+ typename DerivedT // derived class
+ , typename EmbedT // how derived class is embedded
+ , typename T0 = nil_t // see rule class
+ , typename T1 = nil_t // see rule class
+ , typename T2 = nil_t // see rule class
+ >
+ class rule_base; // forward declaration
+
+ class rule_base_access
+ {
+#if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \
+ || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+ public: // YUCK!
+#else
+ template <
+ typename DerivedT
+ , typename EmbedT
+ , typename T0
+ , typename T1
+ , typename T2
+ >
+ friend class rule_base;
+#endif
+ template <typename RuleT>
+ static typename RuleT::abstract_parser_t*
+ get(RuleT const& r)
+ {
+ return r.get();
+ }
+ };
+
+ template <
+ typename DerivedT // derived class
+ , typename EmbedT // how derived class is embedded
+ , typename T0 // see rule class
+ , typename T1 // see rule class
+ , typename T2 // see rule class
+ >
+ class rule_base
+ : public parser<DerivedT>
+ , public impl::get_context<T0, T1, T2>::type::base_t
+ , public context_aux<
+ typename impl::get_context<T0, T1, T2>::type, DerivedT>
+ , public impl::get_tag<T0, T1, T2>::type
+ {
+ public:
+
+ typedef typename impl::get_scanner<T0, T1, T2>::type scanner_t;
+ typedef typename impl::get_context<T0, T1, T2>::type context_t;
+ typedef typename impl::get_tag<T0, T1, T2>::type tag_t;
+
+ typedef EmbedT embed_t;
+ typedef typename context_t::context_linker_t linked_context_t;
+ typedef typename linked_context_t::attr_t attr_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, attr_t>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<DerivedT, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef parser_scanner_linker<ScannerT> linked_scanner_t;
+ typedef typename parser_result<DerivedT, ScannerT>::type result_t;
+ BOOST_SPIRIT_CONTEXT_PARSE(
+ scan, *this, linked_scanner_t, linked_context_t, result_t);
+ }
+
+ template <typename ScannerT>
+ typename parser_result<DerivedT, ScannerT>::type
+ parse_main(ScannerT const& scan) const
+ {
+ typename parser_result<DerivedT, ScannerT>::type hit;
+
+ // MWCW 8.3 needs this cast to be done through a pointer,
+ // not a reference. Otherwise, it will silently construct
+ // a temporary, causing an infinite runtime recursion.
+ DerivedT const* derived_this = static_cast<DerivedT const*>(this);
+
+ if (rule_base_access::get(*derived_this))
+ {
+ typename ScannerT::iterator_t s(scan.first);
+ hit = rule_base_access::get(*derived_this)
+ ->do_parse_virtual(scan);
+ scan.group_match(hit, this->id(), s, scan.first);
+ }
+ else
+ {
+ hit = scan.no_match();
+ }
+ return hit;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // abstract_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename ScannerT, typename AttrT>
+ struct abstract_parser
+ {
+ abstract_parser() {}
+ virtual ~abstract_parser() {}
+
+ virtual typename match_result<ScannerT, AttrT>::type
+ do_parse_virtual(ScannerT const& scan) const = 0;
+
+ virtual abstract_parser*
+ clone() const = 0;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // concrete_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+ template <typename ParserT, typename ScannerT, typename AttrT>
+ struct concrete_parser : abstract_parser<ScannerT, AttrT>
+ {
+ concrete_parser(ParserT const& p_) : p(p_) {}
+ virtual ~concrete_parser() {}
+
+ virtual typename match_result<ScannerT, AttrT>::type
+ do_parse_virtual(ScannerT const& scan) const
+ {
+ return p.parse(scan);
+ }
+
+ virtual abstract_parser<ScannerT, AttrT>*
+ clone() const
+ {
+ return new concrete_parser(p);
+ }
+
+ typename ParserT::embed_t p;
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // This generates partial specializations for the class
+ //
+ // abstract_parser
+ //
+ // with an increasing number of different ScannerT template parameters
+ // and corresponding do_parse_virtual function declarations for each
+ // of the different required scanner types:
+ //
+ // template <typename ScannerT0, ..., typename AttrT>
+ // struct abstract_parser<scanner_list<ScannerT0, ...>, AttrT>
+ // {
+ // abstract_parser() {}
+ // virtual ~abstract_parser() {}
+ //
+ // virtual typename match_result<ScannerT0, AttrT>::type
+ // do_parse_virtual(ScannerT0 const &scan) const = 0;
+ //
+ // virtual abstract_parser*
+ // clone() const = 0;
+ //
+ // ...
+ // };
+ //
+ ///////////////////////////////////////////////////////////////////////
+ #define BOOST_SPIRIT_RULE_ENUM_DOPARSE_A(z, N, _) \
+ virtual typename match_result< \
+ BOOST_PP_CAT(ScannerT, N), AttrT \
+ >::type \
+ do_parse_virtual( \
+ BOOST_PP_CAT(ScannerT, N) const& scan) const = 0; \
+
+ #define BOOST_SPIRIT_ENUM_ABSTRACT_PARSERS(z, N, _) \
+ template < \
+ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), typename ScannerT), \
+ typename AttrT \
+ > \
+ struct abstract_parser< \
+ scanner_list< \
+ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), ScannerT) \
+ >, \
+ AttrT \
+ > \
+ { \
+ abstract_parser() {} \
+ virtual ~abstract_parser() {} \
+ \
+ BOOST_PP_REPEAT_ ## z( \
+ BOOST_PP_INC(N), BOOST_SPIRIT_RULE_ENUM_DOPARSE_A, _) \
+ \
+ virtual abstract_parser* \
+ clone() const = 0; \
+ }; \
+
+ BOOST_PP_REPEAT_FROM_TO(1, BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT,
+ BOOST_SPIRIT_ENUM_ABSTRACT_PARSERS, _)
+
+ #undef BOOST_SPIRIT_RULE_ENUM_DOPARSE_A
+ #undef BOOST_SPIRIT_ENUM_ABSTRACT_PARSERS
+ ///////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // This generates partial specializations for the class
+ //
+ // concrete_parser
+ //
+ // with an increasing number of different ScannerT template parameters
+ // and corresponding do_parse_virtual function declarations for each
+ // of the different required scanner types:
+ //
+ // template <
+ // typename ParserT, typename ScannerT0, ..., typename AttrT
+ // >
+ // struct concrete_parser<
+ // ParserT, scanner_list<ScannerT0, ...>, AttrT
+ // >
+ // : public abstract_parser<scanner_list<ScannerT0, ...>, AttrT>
+ // {
+ // concrete_parser(ParserT const& p_) : p(p_) {}
+ // virtual ~concrete_parser() {}
+ //
+ // virtual typename match_result<ScannerT0, AttrT>::type
+ // do_parse_virtual(ScannerT0 const &scan) const
+ // { return p.parse(scan); }
+ //
+ // virtual abstract_parser<scanner_list<ScannerT0, ...>, AttrT>*
+ // clone() const
+ // {
+ // return new concrete_parser(p);
+ // }
+ //
+ // ...
+ //
+ // typename ParserT::embed_t p;
+ // };
+ //
+ ///////////////////////////////////////////////////////////////////////
+ #define BOOST_SPIRIT_RULE_ENUM_DOPARSE_C(z, N, _) \
+ virtual typename match_result< \
+ BOOST_PP_CAT(ScannerT, N), AttrT \
+ >::type \
+ do_parse_virtual( \
+ BOOST_PP_CAT(ScannerT, N) const& scan) const \
+ { return p.parse(scan); } \
+
+ #define BOOST_SPIRIT_ENUM_CONCRETE_PARSERS(z, N, _) \
+ template < \
+ typename ParserT, \
+ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), typename ScannerT), \
+ typename AttrT \
+ > \
+ struct concrete_parser< \
+ ParserT, \
+ scanner_list< \
+ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), ScannerT) \
+ >, \
+ AttrT \
+ > \
+ : abstract_parser< \
+ scanner_list< \
+ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), ScannerT) \
+ >, \
+ AttrT \
+ > \
+ { \
+ concrete_parser(ParserT const& p_) : p(p_) {} \
+ virtual ~concrete_parser() {} \
+ \
+ BOOST_PP_REPEAT_ ## z( \
+ BOOST_PP_INC(N), BOOST_SPIRIT_RULE_ENUM_DOPARSE_C, _) \
+ \
+ virtual abstract_parser< \
+ scanner_list< \
+ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), ScannerT) \
+ >, \
+ AttrT \
+ >* \
+ clone() const \
+ { \
+ return new concrete_parser(p); \
+ } \
+ \
+ typename ParserT::embed_t p; \
+ }; \
+
+ BOOST_PP_REPEAT_FROM_TO(1, BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT,
+ BOOST_SPIRIT_ENUM_CONCRETE_PARSERS, _)
+
+ #undef BOOST_SPIRIT_ENUM_CONCRETE_PARSERS
+ #undef BOOST_SPIRIT_RULE_ENUM_DOPARSE_C
+ ///////////////////////////////////////////////////////////////////////
+
+#endif // BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+
+ } // namespace impl
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/non_terminal/impl/static.hpp b/boost/spirit/home/classic/core/non_terminal/impl/static.hpp
new file mode 100644
index 0000000000..89c6d29c3c
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/impl/static.hpp
@@ -0,0 +1,120 @@
+/*=============================================================================
+ Copyright (c) 2006 Joao Abecasis
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_STATIC_HPP)
+#define BOOST_SPIRIT_STATIC_HPP
+
+#include <boost/noncopyable.hpp>
+#include <boost/call_traits.hpp>
+#include <boost/aligned_storage.hpp>
+
+#include <boost/type_traits/add_pointer.hpp>
+#include <boost/type_traits/alignment_of.hpp>
+
+#include <boost/thread/once.hpp>
+
+#include <memory> // for placement new
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ //
+ // Provides thread-safe initialization of a single static instance of T.
+ //
+ // This instance is guaranteed to be constructed on static storage in a
+ // thread-safe manner, on the first call to the constructor of static_.
+ //
+ // Requirements:
+ // T is default constructible
+ // (There's an alternate implementation that relaxes this
+ // requirement -- Joao Abecasis)
+ // T::T() MUST not throw!
+ // this is a requirement of boost::call_once.
+ //
+ template <class T, class Tag>
+ struct static_
+ : boost::noncopyable
+ {
+ private:
+
+ struct destructor
+ {
+ ~destructor()
+ {
+ static_::get_address()->~value_type();
+ }
+ };
+
+ struct default_ctor
+ {
+ static void construct()
+ {
+ ::new (static_::get_address()) value_type();
+ static destructor d;
+ }
+ };
+
+ public:
+
+ typedef T value_type;
+ typedef typename boost::call_traits<T>::reference reference;
+ typedef typename boost::call_traits<T>::const_reference const_reference;
+
+ static_(Tag = Tag())
+ {
+ boost::call_once(&default_ctor::construct, constructed_);
+ }
+
+ operator reference()
+ {
+ return this->get();
+ }
+
+ operator const_reference() const
+ {
+ return this->get();
+ }
+
+ reference get()
+ {
+ return *this->get_address();
+ }
+
+ const_reference get() const
+ {
+ return *this->get_address();
+ }
+
+ private:
+ typedef typename boost::add_pointer<value_type>::type pointer;
+
+ static pointer get_address()
+ {
+ return static_cast<pointer>(data_.address());
+ }
+
+ typedef boost::aligned_storage<sizeof(value_type),
+ boost::alignment_of<value_type>::value> storage_type;
+
+ static storage_type data_;
+ static once_flag constructed_;
+ };
+
+ template <class T, class Tag>
+ typename static_<T, Tag>::storage_type static_<T, Tag>::data_;
+
+ template <class T, class Tag>
+ once_flag static_<T, Tag>::constructed_ = BOOST_ONCE_INIT;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // include guard
diff --git a/boost/spirit/home/classic/core/non_terminal/impl/subrule.ipp b/boost/spirit/home/classic/core/non_terminal/impl/subrule.ipp
new file mode 100644
index 0000000000..4651cc31ec
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/impl/subrule.ipp
@@ -0,0 +1,211 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_SUBRULE_IPP)
+#define BOOST_SPIRIT_SUBRULE_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename FirstT, typename RestT>
+ struct subrule_list;
+
+ template <int ID, typename DefT, typename ContextT>
+ struct subrule_parser;
+
+ namespace impl {
+
+ #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+ template <int N, typename ListT>
+ struct get_subrule;
+
+ template <int N, typename ListT>
+ struct get_subrule_chooser
+ {
+ static ListT t();
+ static char test(nil_t);
+ static int test(...);
+
+ // Set value to
+ // 0: ListT is empty
+ // 1: ListT's first item has same ID
+ // 2: ListT's first item has a different ID
+
+ enum
+ {
+ id = ListT::first_t::id,
+ is_same_id = N == id,
+ is_nil_t = sizeof(char) == sizeof(test(t())),
+ value = is_nil_t ? 0 : (is_same_id ? 1 : 2)
+ };
+ };
+
+ template <int N>
+ struct subrule_chooser;
+
+ template <>
+ struct subrule_chooser<0>
+ {
+ // First case. ListT is empty
+
+ template <int N, typename ListT>
+ struct result
+ { typedef nil_t type; };
+ };
+
+ template <>
+ struct subrule_chooser<1>
+ {
+ // Second case. ListT is non-empty and the list's
+ // first item has the ID we are looking for.
+
+ template <int N, typename ListT>
+ struct result
+ { typedef typename ListT::first_t::def_t type; };
+ };
+
+ template <>
+ struct subrule_chooser<2>
+ {
+ // Third case. ListT is non-empty but the list's
+ // first item does not have the ID we are looking for.
+
+ template <int N, typename ListT>
+ struct result
+ { typedef typename get_subrule<N, ListT::rest_t>::type type; };
+ };
+
+ template <int N, typename ListT>
+ struct get_subrule
+ {
+ enum { n = get_subrule_chooser<N, ListT>::value };
+ typedef typename subrule_chooser<n>::template
+ result<N, ListT>::type type;
+ };
+
+ #else
+
+ template <int N, typename ListT>
+ struct get_subrule
+ {
+ // First case. ListT is non-empty but the list's
+ // first item does not have the ID we are looking for.
+
+ typedef typename get_subrule<N, typename ListT::rest_t>::type type;
+ };
+
+ template <int ID, typename DefT, typename ContextT, typename RestT>
+ struct get_subrule<
+ ID,
+ subrule_list<
+ subrule_parser<ID, DefT, ContextT>,
+ RestT> >
+ {
+ // Second case. ListT is non-empty and the list's
+ // first item has the ID we are looking for.
+
+ typedef DefT type;
+ };
+
+ template <int ID>
+ struct get_subrule<ID, nil_t>
+ {
+ // Third case. ListT is empty
+ typedef nil_t type;
+ };
+
+ #endif
+
+ template <typename T1, typename T2>
+ struct get_result_t {
+
+ // If the result type dictated by the context is nil_t (no closures
+ // present), then the whole subrule_parser return type is equal to
+ // the return type of the right hand side of this subrule_parser,
+ // otherwise it is equal to the dictated return value.
+
+ typedef typename mpl::if_<
+ boost::is_same<T1, nil_t>, T2, T1
+ >::type type;
+ };
+
+ template <int ID, typename ScannerT, typename ContextResultT>
+ struct get_subrule_result
+ {
+ typedef typename
+ impl::get_subrule<ID, typename ScannerT::list_t>::type
+ parser_t;
+
+ typedef typename parser_result<parser_t, ScannerT>::type
+ def_result_t;
+
+ typedef typename match_result<ScannerT, ContextResultT>::type
+ context_result_t;
+
+ typedef typename get_result_t<context_result_t, def_result_t>::type
+ type;
+ };
+
+ template <typename DefT, typename ScannerT, typename ContextResultT>
+ struct get_subrule_parser_result
+ {
+ typedef typename parser_result<DefT, ScannerT>::type
+ def_result_t;
+
+ typedef typename match_result<ScannerT, ContextResultT>::type
+ context_result_t;
+
+ typedef typename get_result_t<context_result_t, def_result_t>::type
+ type;
+ };
+
+ template <typename SubruleT, int ID>
+ struct same_subrule_id
+ {
+ BOOST_STATIC_CONSTANT(bool, value = (SubruleT::id == ID));
+ };
+
+ template <typename RT, typename ScannerT, int ID>
+ struct parse_subrule
+ {
+ template <typename ListT>
+ static void
+ do_parse(RT& r, ScannerT const& scan, ListT const& list, mpl::true_)
+ {
+ r = list.first.rhs.parse(scan);
+ }
+
+ template <typename ListT>
+ static void
+ do_parse(RT& r, ScannerT const& scan, ListT const& list, mpl::false_)
+ {
+ typedef typename ListT::rest_t::first_t subrule_t;
+ mpl::bool_<same_subrule_id<subrule_t, ID>::value> same_id;
+ do_parse(r, scan, list.rest, same_id);
+ }
+
+ static void
+ do_(RT& r, ScannerT const& scan)
+ {
+ typedef typename ScannerT::list_t::first_t subrule_t;
+ mpl::bool_<same_subrule_id<subrule_t, ID>::value> same_id;
+ do_parse(r, scan, scan.list, same_id);
+ }
+ };
+
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit::impl
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/non_terminal/parser_context.hpp b/boost/spirit/home/classic/core/non_terminal/parser_context.hpp
new file mode 100644
index 0000000000..2f7dd23e80
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/parser_context.hpp
@@ -0,0 +1,150 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_PARSER_CONTEXT_HPP)
+#define BOOST_SPIRIT_PARSER_CONTEXT_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost
+{
+ namespace spirit
+ {
+ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // default_parser_context_base class { default context base }
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct default_parser_context_base
+ {
+ template <typename DerivedT>
+ struct aux {};
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_context_base class { base class of all context classes }
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct parser_context_base {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_context class { default context }
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct nil_t;
+ template<typename ContextT> struct parser_context_linker;
+
+ template<typename AttrT = nil_t>
+ struct parser_context : parser_context_base
+ {
+ typedef AttrT attr_t;
+ typedef default_parser_context_base base_t;
+ typedef parser_context_linker<parser_context<AttrT> > context_linker_t;
+
+ template <typename ParserT>
+ parser_context(ParserT const&) {}
+
+ template <typename ParserT, typename ScannerT>
+ void
+ pre_parse(ParserT const&, ScannerT const&) {}
+
+ template <typename ResultT, typename ParserT, typename ScannerT>
+ ResultT&
+ post_parse(ResultT& hit, ParserT const&, ScannerT const&)
+ { return hit; }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // context_aux class
+ //
+ // context_aux<ContextT, DerivedT> is a class derived from the
+ // ContextT's nested base_t::base<DerivedT> template class. (see
+ // default_parser_context_base::aux for an example).
+ //
+ // Basically, this class provides ContextT dependent optional
+ // functionality to the derived class DerivedT through the CRTP
+ // idiom (Curiously recurring template pattern).
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ContextT, typename DerivedT>
+ struct context_aux : public ContextT::base_t::template aux<DerivedT> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_scanner_linker and parser_scanner_linker classes
+ // { helper templates for the rule extensibility }
+ //
+ // This classes can be 'overloaded' (defined elsewhere), to plug
+ // in additional functionality into the non-terminal parsing process.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #if !defined(BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED)
+ #define BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED
+
+ template<typename ScannerT>
+ struct parser_scanner_linker : public ScannerT
+ {
+ parser_scanner_linker(ScannerT const scan_) : ScannerT(scan_) {}
+ };
+
+ #endif // !defined(BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED)
+
+ //////////////////////////////////
+ #if !defined(BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED)
+ #define BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED
+
+ template<typename ContextT>
+ struct parser_context_linker : public ContextT
+ {
+ template <typename ParserT>
+ parser_context_linker(ParserT const& p)
+ : ContextT(p) {}
+
+ template <typename ParserT, typename ScannerT>
+ void pre_parse(ParserT const& p, ScannerT const& scan)
+ { ContextT::pre_parse(p, scan); }
+
+ template <typename ResultT, typename ParserT, typename ScannerT>
+ ResultT&
+ post_parse(ResultT& hit, ParserT const& p, ScannerT const& scan)
+ { return ContextT::post_parse(hit, p, scan); }
+ };
+
+ #endif // !defined(BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED)
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // BOOST_SPIRIT_CONTEXT_PARSE helper macro
+ //
+ // The original implementation uses a template class. However, we
+ // need to lessen the template instantiation depth to help inferior
+ // compilers that sometimes choke on deep template instantiations.
+ // The objective is to avoid code redundancy. A macro, in this case
+ // is an obvious solution. Sigh!
+ //
+ // WARNING: INTERNAL USE ONLY. NOT FOR PUBLIC CONSUMPTION.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #define BOOST_SPIRIT_CONTEXT_PARSE(scan, this_, scanner_t, context_t, result_t) \
+ scanner_t scan_wrap(scan); \
+ context_t context_wrap(this_); \
+ context_wrap.pre_parse(this_, scan_wrap); \
+ result_t hit = parse_main(scan); \
+ return context_wrap.post_parse(hit, this_, scan_wrap);
+
+ BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+ } // namespace spirit
+} // namespace boost
+
+#endif
diff --git a/boost/spirit/home/classic/core/non_terminal/parser_id.hpp b/boost/spirit/home/classic/core/non_terminal/parser_id.hpp
new file mode 100644
index 0000000000..bc465dceac
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/parser_id.hpp
@@ -0,0 +1,122 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2001 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_PARSER_ID_HPP)
+#define BOOST_SPIRIT_PARSER_ID_HPP
+
+#if defined(BOOST_SPIRIT_DEBUG)
+# include <ostream>
+#endif
+#include <boost/spirit/home/classic/namespace.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_id class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ class parser_id
+ {
+ public:
+ parser_id() : p(0) {}
+ explicit parser_id(void const* prule) : p(prule) {}
+ parser_id(std::size_t l_) : l(l_) {}
+
+ bool operator==(parser_id const& x) const { return p == x.p; }
+ bool operator!=(parser_id const& x) const { return !(*this == x); }
+ bool operator<(parser_id const& x) const { return p < x.p; }
+ std::size_t to_long() const { return l; }
+
+ private:
+
+ union
+ {
+ void const* p;
+ std::size_t l;
+ };
+ };
+
+ #if defined(BOOST_SPIRIT_DEBUG)
+ inline std::ostream&
+ operator<<(std::ostream& out, parser_id const& rid)
+ {
+ out << (unsigned int)rid.to_long();
+ return out;
+ }
+ #endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_tag_base class: base class of all parser tags
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct parser_tag_base {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_address_tag class: tags a parser with its address
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct parser_address_tag : parser_tag_base
+ {
+ parser_id id() const
+ { return parser_id(reinterpret_cast<std::size_t>(this)); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_tag class: tags a parser with an integer ID
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <int N>
+ struct parser_tag : parser_tag_base
+ {
+ static parser_id id()
+ { return parser_id(std::size_t(N)); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // dynamic_parser_tag class: tags a parser with a dynamically changeable
+ // integer ID
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ class dynamic_parser_tag : public parser_tag_base
+ {
+ public:
+
+ dynamic_parser_tag()
+ : tag(std::size_t(0)) {}
+
+ parser_id
+ id() const
+ {
+ return
+ tag.to_long()
+ ? tag
+ : parser_id(reinterpret_cast<std::size_t>(this));
+ }
+
+ void set_id(parser_id id_) { tag = id_; }
+
+ private:
+
+ parser_id tag;
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/non_terminal/rule.hpp b/boost/spirit/home/classic/core/non_terminal/rule.hpp
new file mode 100644
index 0000000000..e905689431
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/rule.hpp
@@ -0,0 +1,175 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_RULE_HPP)
+#define BOOST_SPIRIT_RULE_HPP
+
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Spirit predefined maximum number of simultaneously usable different
+// scanner types.
+//
+// This limit defines the maximum number of of possible different scanner
+// types for which a specific rule<> may be used. If this isn't defined, a
+// rule<> may be used with one scanner type only (multiple scanner support
+// is disabled).
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT)
+# define BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT 1
+#endif
+
+// Ensure a meaningful maximum number of simultaneously usable scanner types
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 0);
+
+#include <boost/scoped_ptr.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/impl/rule.ipp>
+
+#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+# include <boost/preprocessor/enum_params.hpp>
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scanner_list (a fake scanner)
+ //
+ // Typically, rules are tied to a specific scanner type and
+ // a particular rule cannot be used with anything else. Sometimes
+ // there's a need for rules that can accept more than one scanner
+ // type. The scanner_list<S0, ...SN> can be used as a template
+ // parameter to the rule class to specify up to the number of
+ // scanner types defined by the BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT
+ // constant. Example:
+ //
+ // rule<scanner_list<ScannerT0, ScannerT1> > r;
+ //
+ // *** This feature is available only to compilers that support
+ // partial template specialization. ***
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ BOOST_PP_ENUM_PARAMS(
+ BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT,
+ typename ScannerT
+ )
+ >
+ struct scanner_list : scanner_base {};
+
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // rule class
+ //
+ // The rule is a polymorphic parser that acts as a named place-
+ // holder capturing the behavior of an EBNF expression assigned to
+ // it.
+ //
+ // The rule is a template class parameterized by:
+ //
+ // 1) scanner (scanner_t, see scanner.hpp),
+ // 2) the rule's context (context_t, see parser_context.hpp)
+ // 3) an arbitrary tag (tag_t, see parser_id.hpp) that allows
+ // a rule to be tagged for identification.
+ //
+ // These template parameters may be specified in any order. The
+ // scanner will default to scanner<> when it is not specified.
+ // The context will default to parser_context when not specified.
+ // The tag will default to parser_address_tag when not specified.
+ //
+ // The definition of the rule (its right hand side, RHS) held by
+ // the rule through a scoped_ptr. When a rule is seen in the RHS
+ // of an assignment or copy construction EBNF expression, the rule
+ // is held by the LHS rule by reference.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T0 = nil_t
+ , typename T1 = nil_t
+ , typename T2 = nil_t
+ >
+ class rule
+ : public impl::rule_base<
+ rule<T0, T1, T2>
+ , rule<T0, T1, T2> const&
+ , T0, T1, T2>
+ {
+ public:
+
+ typedef rule<T0, T1, T2> self_t;
+ typedef impl::rule_base<
+ self_t
+ , self_t const&
+ , T0, T1, T2>
+ base_t;
+
+ typedef typename base_t::scanner_t scanner_t;
+ typedef typename base_t::attr_t attr_t;
+ typedef impl::abstract_parser<scanner_t, attr_t> abstract_parser_t;
+
+ rule() : ptr() {}
+ ~rule() {}
+
+ rule(rule const& r)
+ : ptr(new impl::concrete_parser<rule, scanner_t, attr_t>(r)) {}
+
+ template <typename ParserT>
+ rule(ParserT const& p)
+ : ptr(new impl::concrete_parser<ParserT, scanner_t, attr_t>(p)) {}
+
+ template <typename ParserT>
+ rule& operator=(ParserT const& p)
+ {
+ ptr.reset(new impl::concrete_parser<ParserT, scanner_t, attr_t>(p));
+ return *this;
+ }
+
+ rule& operator=(rule const& r)
+ {
+ ptr.reset(new impl::concrete_parser<rule, scanner_t, attr_t>(r));
+ return *this;
+ }
+
+ rule<T0, T1, T2>
+ copy() const
+ {
+ return rule<T0, T1, T2>(ptr.get() ? ptr->clone() : 0);
+ }
+
+ private:
+ friend class impl::rule_base_access;
+
+ abstract_parser_t*
+ get() const
+ {
+ return ptr.get();
+ }
+
+ rule(abstract_parser_t* ptr_)
+ : ptr(ptr_) {}
+
+ rule(abstract_parser_t const* ptr_)
+ : ptr(ptr_) {}
+
+ scoped_ptr<abstract_parser_t> ptr;
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/core/non_terminal/subrule.hpp b/boost/spirit/home/classic/core/non_terminal/subrule.hpp
new file mode 100644
index 0000000000..8b25d8d0e3
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/subrule.hpp
@@ -0,0 +1,300 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SUBRULE_HPP)
+#define BOOST_SPIRIT_SUBRULE_HPP
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/parser_context.hpp>
+
+#include <boost/spirit/home/classic/core/non_terminal/subrule_fwd.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/impl/subrule.ipp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // subrules_scanner class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ScannerT, typename ListT>
+ struct subrules_scanner : public ScannerT
+ {
+ typedef ScannerT scanner_t;
+ typedef ListT list_t;
+ typedef subrules_scanner<ScannerT, ListT> self_t;
+
+ subrules_scanner(ScannerT const& scan, ListT const& list_)
+ : ScannerT(scan), list(list_) {}
+
+ template <typename PoliciesT>
+ struct rebind_policies
+ {
+ typedef typename rebind_scanner_policies<ScannerT, PoliciesT>::type
+ rebind_scanner;
+ typedef subrules_scanner<rebind_scanner, ListT> type;
+ };
+
+ template <typename PoliciesT>
+ subrules_scanner<
+ typename rebind_scanner_policies<ScannerT, PoliciesT>::type,
+ ListT>
+ change_policies(PoliciesT const& policies) const
+ {
+ typedef subrules_scanner<
+ BOOST_DEDUCED_TYPENAME
+ rebind_scanner_policies<ScannerT, PoliciesT>::type,
+ ListT>
+ subrules_scanner_t;
+
+ return subrules_scanner_t(
+ ScannerT::change_policies(policies),
+ list);
+ }
+
+ template <typename IteratorT>
+ struct rebind_iterator
+ {
+ typedef typename rebind_scanner_iterator<ScannerT, IteratorT>::type
+ rebind_scanner;
+ typedef subrules_scanner<rebind_scanner, ListT> type;
+ };
+
+ template <typename IteratorT>
+ subrules_scanner<
+ typename rebind_scanner_iterator<ScannerT, IteratorT>::type,
+ ListT>
+ change_iterator(IteratorT const& first, IteratorT const &last) const
+ {
+ typedef subrules_scanner<
+ BOOST_DEDUCED_TYPENAME
+ rebind_scanner_iterator<ScannerT, IteratorT>::type,
+ ListT>
+ subrules_scanner_t;
+
+ return subrules_scanner_t(
+ ScannerT::change_iterator(first, last),
+ list);
+ }
+
+ ListT const& list;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // subrule_scanner type computer class
+ //
+ // This computer ensures that the scanner will not be recursively
+ // instantiated if it's not needed.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ScannerT, typename ListT>
+ struct subrules_scanner_finder
+ {
+ typedef subrules_scanner<ScannerT, ListT> type;
+ };
+
+ template <typename ScannerT, typename ListT>
+ struct subrules_scanner_finder<subrules_scanner<ScannerT, ListT>, ListT>
+ {
+ typedef subrules_scanner<ScannerT, ListT> type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // subrule_list class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename FirstT, typename RestT>
+ struct subrule_list : public parser<subrule_list<FirstT, RestT> >
+ {
+ typedef subrule_list<FirstT, RestT> self_t;
+ typedef FirstT first_t;
+ typedef RestT rest_t;
+
+ subrule_list(FirstT const& first_, RestT const& rest_)
+ : first(first_), rest(rest_) {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<FirstT, ScannerT>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename subrules_scanner_finder<ScannerT, self_t>::type
+ subrules_scanner_t;
+ subrules_scanner_t g_arg(scan, *this);
+ return first.start.parse(g_arg);
+ }
+
+ template <int ID, typename DefT, typename ContextT>
+ subrule_list<
+ FirstT,
+ subrule_list<
+ subrule_parser<ID, DefT, ContextT>,
+ RestT> >
+ operator,(subrule_parser<ID, DefT, ContextT> const& rhs_)
+ {
+ return subrule_list<
+ FirstT,
+ subrule_list<
+ subrule_parser<ID, DefT, ContextT>,
+ RestT> >(
+ first,
+ subrule_list<
+ subrule_parser<ID, DefT, ContextT>,
+ RestT>(rhs_, rest));
+ }
+
+ FirstT first;
+ RestT rest;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // subrule_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <int ID, typename DefT, typename ContextT>
+ struct subrule_parser
+ : public parser<subrule_parser<ID, DefT, ContextT> >
+ {
+ typedef subrule_parser<ID, DefT, ContextT> self_t;
+ typedef subrule<ID, ContextT> subrule_t;
+ typedef DefT def_t;
+
+ BOOST_STATIC_CONSTANT(int, id = ID);
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename
+ impl::get_subrule_parser_result<
+ DefT, ScannerT, typename subrule_t::attr_t>::type type;
+ };
+
+ subrule_parser(subrule_t const& start_, DefT const& rhs_)
+ : rhs(rhs_), start(start_) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ // This will only be called when parsing single subrules.
+ typedef subrule_list<self_t, nil_t> list_t;
+ typedef subrules_scanner<ScannerT, list_t> scanner_t;
+
+ list_t list(*this, nil_t());
+ scanner_t g_arg(scan, list);
+ return start.parse(g_arg);
+ }
+
+ template <int ID2, typename DefT2, typename ContextT2>
+ inline subrule_list<
+ self_t,
+ subrule_list<
+ subrule_parser<ID2, DefT2, ContextT2>,
+ nil_t> >
+ operator,(subrule_parser<ID2, DefT2, ContextT2> const& rhs) const
+ {
+ return subrule_list<
+ self_t,
+ subrule_list<
+ subrule_parser<ID2, DefT2, ContextT2>,
+ nil_t> >(
+ *this,
+ subrule_list<
+ subrule_parser<ID2, DefT2, ContextT2>, nil_t>(
+ rhs, nil_t()));
+ }
+
+ typename DefT::embed_t rhs;
+ subrule_t const& start;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // subrule class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <int ID, typename ContextT>
+ struct subrule
+ : public parser<subrule<ID, ContextT> >
+ , public ContextT::base_t
+ , public context_aux<ContextT, subrule<ID, ContextT> >
+ {
+ typedef subrule<ID, ContextT> self_t;
+ typedef subrule<ID, ContextT> const& embed_t;
+
+ typedef typename ContextT::context_linker_t context_t;
+ typedef typename context_t::attr_t attr_t;
+
+ BOOST_STATIC_CONSTANT(int, id = ID);
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename
+ impl::get_subrule_result<ID, ScannerT, attr_t>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse_main(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ result_t result_;
+ impl::parse_subrule<result_t, ScannerT, ID>::
+ do_(result_, scan);
+ return result_;
+ }
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef parser_scanner_linker<ScannerT> scanner_t;
+ BOOST_SPIRIT_CONTEXT_PARSE(
+ scan, *this, scanner_t, context_t, result_t);
+ }
+
+ template <typename DefT>
+ subrule_parser<ID, DefT, ContextT>
+ operator=(parser<DefT> const& rhs) const
+ {
+ return subrule_parser<ID, DefT, ContextT>(*this, rhs.derived());
+ }
+
+ private:
+
+ // assignment of subrules is not allowed. Use subrules
+ // with identical IDs if you want to have aliases.
+
+ subrule& operator=(subrule const&);
+
+ template <int ID2, typename ContextT2>
+ subrule& operator=(subrule<ID2, ContextT2> const&);
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/non_terminal/subrule_fwd.hpp b/boost/spirit/home/classic/core/non_terminal/subrule_fwd.hpp
new file mode 100644
index 0000000000..bb6ce87858
--- /dev/null
+++ b/boost/spirit/home/classic/core/non_terminal/subrule_fwd.hpp
@@ -0,0 +1,35 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SUBRULE_FWD_HPP)
+#define BOOST_SPIRIT_SUBRULE_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/parser_context.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <int ID, typename ContextT = parser_context<> >
+ struct subrule;
+
+ template <int ID, typename DefT, typename ContextT = parser_context<> >
+ struct subrule_parser;
+
+ template <typename ScannerT, typename ListT>
+ struct subrules_scanner;
+
+ template <typename FirstT, typename RestT>
+ struct subrule_list;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/parser.hpp b/boost/spirit/home/classic/core/parser.hpp
new file mode 100644
index 0000000000..8f6bc6a3ee
--- /dev/null
+++ b/boost/spirit/home/classic/core/parser.hpp
@@ -0,0 +1,223 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_PARSER_HPP)
+#define BOOST_SPIRIT_PARSER_HPP
+
+#include <boost/config.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/scanner/scanner.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename ParserT, typename ActionT>
+ class action; // forward declaration
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Parser categories
+ //
+ // Helper template classes to distinguish different types of
+ // parsers. The following categories are the most generic. More
+ // specific types may inherit from these. Each parser has a typedef
+ // parser_category_t that defines its category. By default, if one
+ // is not specified, it will inherit from the base parser class
+ // which typedefs its parser_category_t as plain_parser_category.
+ //
+ // - plain parser has nothing special
+ // - binary parser has subject a and b (e.g. alternative)
+ // - unary parser has single subject (e.g. kleene star)
+ // - action parser has an attached action parser
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct plain_parser_category {};
+ struct binary_parser_category : plain_parser_category {};
+ struct unary_parser_category : plain_parser_category {};
+ struct action_parser_category : unary_parser_category {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_result metafunction
+ //
+ // Given a scanner type ScannerT and a parser type ParserT, the
+ // parser_result metafunction provides the actual result of the
+ // parser.
+ //
+ // Usage:
+ //
+ // typename parser_result<ParserT, ScannerT>::type
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ParserT, typename ScannerT>
+ struct parser_result
+ {
+ typedef typename boost::remove_reference<ParserT>::type parser_type;
+ typedef typename parser_type::template result<ScannerT>::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser class
+ //
+ // This class is a protocol base class for all parsers. This is
+ // essentially an interface contract. The parser class does not
+ // really know how to parse anything but instead relies on the
+ // template parameter DerivedT (which obviously is assumed to be a
+ // subclass) to do the actual parsing.
+ //
+ // Concrete sub-classes inheriting from parser must have a
+ // corresponding member function parse(...) compatible with the
+ // conceptual Interface:
+ //
+ // template <typename ScannerT>
+ // RT parse(ScannerT const& scan) const;
+ //
+ // where RT is the desired return type of the parser and ScannerT
+ // scan is the scanner (see scanner.hpp).
+ //
+ // Concrete sub-classes inheriting from parser in most cases need to
+ // have a nested meta-function result that returns the result type
+ // of the parser's parse member function, given a scanner type. The
+ // meta-function has the form:
+ //
+ // template <typename ScannerT>
+ // struct result
+ // {
+ // typedef RT type;
+ // };
+ //
+ // where RT is the desired return type of the parser. This is
+ // usually, but not always, dependent on the template parameter
+ // ScannerT. If a parser does not supply a result metafunction, a
+ // default is provided by the base parser class.
+ //
+ // The parser's derived() member function returns a reference to the
+ // parser as its derived object.
+ //
+ // An operator[] is provided. The operator returns a semantic action
+ // handler (see actions.hpp).
+ //
+ // Each parser has a typedef embed_t. This typedef specifies how a
+ // parser is embedded in a composite (see composite.hpp). By
+ // default, if one is not specified, the parser will be embedded by
+ // value. That is, a copy of the parser is placed as a member
+ // variable of the composite. Most parsers are embedded by value. In
+ // certain situations however, this is not desirable or possible.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename DerivedT>
+ struct parser
+ {
+ typedef DerivedT embed_t;
+ typedef DerivedT derived_t;
+ typedef plain_parser_category parser_category_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ DerivedT& derived()
+ {
+ return *static_cast<DerivedT*>(this);
+ }
+
+ DerivedT const& derived() const
+ {
+ return *static_cast<DerivedT const*>(this);
+ }
+
+ template <typename ActionT>
+ action<DerivedT, ActionT>
+ operator[](ActionT const& actor) const
+ {
+ return action<DerivedT, ActionT>(derived(), actor);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parse_info
+ //
+ // Results returned by the free parse functions:
+ //
+ // stop: points to the final parse position (i.e parsing
+ // processed the input up to this point).
+ //
+ // hit: true if parsing is successful. This may be full:
+ // the parser consumed all the input, or partial:
+ // the parser consumed only a portion of the input.
+ //
+ // full: true when we have a full hit (i.e the parser
+ // consumed all the input.
+ //
+ // length: The number of characters consumed by the parser.
+ // This is valid only if we have a successful hit
+ // (either partial or full).
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename IteratorT = char const*>
+ struct parse_info
+ {
+ IteratorT stop;
+ bool hit;
+ bool full;
+ std::size_t length;
+
+ parse_info(
+ IteratorT const& stop_ = IteratorT(),
+ bool hit_ = false,
+ bool full_ = false,
+ std::size_t length_ = 0)
+ : stop(stop_)
+ , hit(hit_)
+ , full(full_)
+ , length(length_) {}
+
+ template <typename ParseInfoT>
+ parse_info(ParseInfoT const& pi)
+ : stop(pi.stop)
+ , hit(pi.hit)
+ , full(pi.full)
+ , length(pi.length) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Generic parse function
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename IteratorT, typename DerivedT>
+ parse_info<IteratorT>
+ parse(
+ IteratorT const& first,
+ IteratorT const& last,
+ parser<DerivedT> const& p);
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Parse function for null terminated strings
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT, typename DerivedT>
+ parse_info<CharT const*>
+ parse(
+ CharT const* str,
+ parser<DerivedT> const& p);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/core/impl/parser.ipp>
diff --git a/boost/spirit/home/classic/core/primitives/impl/numerics.ipp b/boost/spirit/home/classic/core/primitives/impl/numerics.ipp
new file mode 100644
index 0000000000..19586f1a10
--- /dev/null
+++ b/boost/spirit/home/classic/core/primitives/impl/numerics.ipp
@@ -0,0 +1,478 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_NUMERICS_IPP
+#define BOOST_SPIRIT_NUMERICS_IPP
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <limits>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ struct sign_parser; // forward declaration only
+
+ namespace impl
+ {
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // Extract the prefix sign (- or +)
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename ScannerT>
+ bool
+ extract_sign(ScannerT const& scan, std::size_t& count)
+ {
+ // Extract the sign
+ count = 0;
+ bool neg = *scan == '-';
+ if (neg || (*scan == '+'))
+ {
+ ++scan;
+ ++count;
+ return neg;
+ }
+
+ return false;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // Traits class for radix specific number conversion
+ //
+ // Convert a digit from character representation, ch, to binary
+ // representation, returned in val.
+ // Returns whether the conversion was successful.
+ //
+ // template<typename CharT> static bool digit(CharT ch, T& val);
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template<const int Radix>
+ struct radix_traits;
+
+ ////////////////////////////////// Binary
+ template<>
+ struct radix_traits<2>
+ {
+ template<typename CharT, typename T>
+ static bool digit(CharT ch, T& val)
+ {
+ val = ch - '0';
+ return ('0' == ch || '1' == ch);
+ }
+ };
+
+ ////////////////////////////////// Octal
+ template<>
+ struct radix_traits<8>
+ {
+ template<typename CharT, typename T>
+ static bool digit(CharT ch, T& val)
+ {
+ val = ch - '0';
+ return ('0' <= ch && ch <= '7');
+ }
+ };
+
+ ////////////////////////////////// Decimal
+ template<>
+ struct radix_traits<10>
+ {
+ template<typename CharT, typename T>
+ static bool digit(CharT ch, T& val)
+ {
+ val = ch - '0';
+ return impl::isdigit_(ch);
+ }
+ };
+
+ ////////////////////////////////// Hexadecimal
+ template<>
+ struct radix_traits<16>
+ {
+ template<typename CharT, typename T>
+ static bool digit(CharT ch, T& val)
+ {
+ if (radix_traits<10>::digit(ch, val))
+ return true;
+
+ CharT lc = impl::tolower_(ch);
+ if ('a' <= lc && lc <= 'f')
+ {
+ val = lc - 'a' + 10;
+ return true;
+ }
+ return false;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // Helper templates for encapsulation of radix specific
+ // conversion of an input string to an integral value.
+ //
+ // main entry point:
+ //
+ // extract_int<Radix, MinDigits, MaxDigits, Accumulate>
+ // ::f(first, last, n, count);
+ //
+ // The template parameter Radix represents the radix of the
+ // number contained in the parsed string. The template
+ // parameter MinDigits specifies the minimum digits to
+ // accept. The template parameter MaxDigits specifies the
+ // maximum digits to parse. A -1 value for MaxDigits will
+ // make it parse an arbitrarilly large number as long as the
+ // numeric type can hold it. Accumulate is either
+ // positive_accumulate<Radix> (default) for parsing positive
+ // numbers or negative_accumulate<Radix> otherwise.
+ // Checking is only performed when std::numeric_limits<T>::
+ // is_specialized is true. Otherwise, there's no way to
+ // do the check.
+ //
+ // scan.first and scan.last are iterators as usual (i.e.
+ // first is mutable and is moved forward when a match is
+ // found), n is a variable that holds the number (passed by
+ // reference). The number of parsed characters is added to
+ // count (also passed by reference)
+ //
+ // NOTE:
+ // Returns a non-match, if the number to parse
+ // overflows (or underflows) the used type.
+ //
+ // BEWARE:
+ // the parameters 'n' and 'count' should be properly
+ // initialized before calling this function.
+ //
+ ///////////////////////////////////////////////////////////////////////
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable:4127) //conditional expression is constant
+#endif
+
+ template <typename T, int Radix>
+ struct positive_accumulate
+ {
+ // Use this accumulator if number is positive
+ static bool add(T& n, T digit)
+ {
+ if (std::numeric_limits<T>::is_specialized)
+ {
+ static T const max = (std::numeric_limits<T>::max)();
+ static T const max_div_radix = max/Radix;
+
+ if (n > max_div_radix)
+ return false;
+ n *= Radix;
+
+ if (n > max - digit)
+ return false;
+ n += digit;
+
+ return true;
+ }
+ else
+ {
+ n *= Radix;
+ n += digit;
+ return true;
+ }
+ }
+ };
+
+ template <typename T, int Radix>
+ struct negative_accumulate
+ {
+ // Use this accumulator if number is negative
+ static bool add(T& n, T digit)
+ {
+ if (std::numeric_limits<T>::is_specialized)
+ {
+ typedef std::numeric_limits<T> num_limits;
+ static T const min =
+ (!num_limits::is_integer && num_limits::is_signed && num_limits::has_denorm) ?
+ -(num_limits::max)() : (num_limits::min)();
+ static T const min_div_radix = min/Radix;
+
+ if (n < min_div_radix)
+ return false;
+ n *= Radix;
+
+ if (n < min + digit)
+ return false;
+ n -= digit;
+
+ return true;
+ }
+ else
+ {
+ n *= Radix;
+ n -= digit;
+ return true;
+ }
+ }
+ };
+
+ template <int MaxDigits>
+ inline bool allow_more_digits(std::size_t i)
+ {
+ return i < MaxDigits;
+ }
+
+ template <>
+ inline bool allow_more_digits<-1>(std::size_t)
+ {
+ return true;
+ }
+
+ //////////////////////////////////
+ template <
+ int Radix, unsigned MinDigits, int MaxDigits,
+ typename Accumulate
+ >
+ struct extract_int
+ {
+ template <typename ScannerT, typename T>
+ static bool
+ f(ScannerT& scan, T& n, std::size_t& count)
+ {
+ std::size_t i = 0;
+ T digit;
+ while( allow_more_digits<MaxDigits>(i) && !scan.at_end() &&
+ radix_traits<Radix>::digit(*scan, digit) )
+ {
+ if (!Accumulate::add(n, digit))
+ return false; // Overflow
+ ++i, ++scan, ++count;
+ }
+ return i >= MinDigits;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // uint_parser_impl class
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <
+ typename T = unsigned,
+ int Radix = 10,
+ unsigned MinDigits = 1,
+ int MaxDigits = -1
+ >
+ struct uint_parser_impl
+ : parser<uint_parser_impl<T, Radix, MinDigits, MaxDigits> >
+ {
+ typedef uint_parser_impl<T, Radix, MinDigits, MaxDigits> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, T>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ if (!scan.at_end())
+ {
+ T n = 0;
+ std::size_t count = 0;
+ typename ScannerT::iterator_t save = scan.first;
+ if (extract_int<Radix, MinDigits, MaxDigits,
+ positive_accumulate<T, Radix> >::f(scan, n, count))
+ {
+ return scan.create_match(count, n, save, scan.first);
+ }
+ // return no-match if number overflows
+ }
+ return scan.no_match();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // int_parser_impl class
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <
+ typename T = unsigned,
+ int Radix = 10,
+ unsigned MinDigits = 1,
+ int MaxDigits = -1
+ >
+ struct int_parser_impl
+ : parser<int_parser_impl<T, Radix, MinDigits, MaxDigits> >
+ {
+ typedef int_parser_impl<T, Radix, MinDigits, MaxDigits> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, T>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef extract_int<Radix, MinDigits, MaxDigits,
+ negative_accumulate<T, Radix> > extract_int_neg_t;
+ typedef extract_int<Radix, MinDigits, MaxDigits,
+ positive_accumulate<T, Radix> > extract_int_pos_t;
+
+ if (!scan.at_end())
+ {
+ T n = 0;
+ std::size_t count = 0;
+ typename ScannerT::iterator_t save = scan.first;
+
+ bool hit = impl::extract_sign(scan, count);
+
+ if (hit)
+ hit = extract_int_neg_t::f(scan, n, count);
+ else
+ hit = extract_int_pos_t::f(scan, n, count);
+
+ if (hit)
+ return scan.create_match(count, n, save, scan.first);
+ else
+ scan.first = save;
+ // return no-match if number overflows or underflows
+ }
+ return scan.no_match();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // real_parser_impl class
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename RT, typename T, typename RealPoliciesT>
+ struct real_parser_impl
+ {
+ typedef real_parser_impl<RT, T, RealPoliciesT> self_t;
+
+ template <typename ScannerT>
+ RT parse_main(ScannerT const& scan) const
+ {
+ if (scan.at_end())
+ return scan.no_match();
+ typename ScannerT::iterator_t save = scan.first;
+
+ typedef typename parser_result<sign_parser, ScannerT>::type
+ sign_match_t;
+ typedef typename parser_result<chlit<>, ScannerT>::type
+ exp_match_t;
+
+ sign_match_t sign_match = RealPoliciesT::parse_sign(scan);
+ std::size_t count = sign_match ? sign_match.length() : 0;
+ bool neg = sign_match.has_valid_attribute() ?
+ sign_match.value() : false;
+
+ RT n_match = RealPoliciesT::parse_n(scan);
+ T n = n_match.has_valid_attribute() ?
+ n_match.value() : T(0);
+ bool got_a_number = n_match;
+ exp_match_t e_hit;
+
+ if (!got_a_number && !RealPoliciesT::allow_leading_dot)
+ return scan.no_match();
+ else
+ count += n_match.length();
+
+ if (neg)
+ n = -n;
+
+ if (RealPoliciesT::parse_dot(scan))
+ {
+ // We got the decimal point. Now we will try to parse
+ // the fraction if it is there. If not, it defaults
+ // to zero (0) only if we already got a number.
+
+ if (RT hit = RealPoliciesT::parse_frac_n(scan))
+ {
+#if !defined(BOOST_NO_STDC_NAMESPACE)
+ using namespace std; // allow for ADL to find pow()
+#endif
+ hit.value(hit.value()
+ * pow(T(10), T(-hit.length())));
+ if (neg)
+ n -= hit.value();
+ else
+ n += hit.value();
+ count += hit.length() + 1;
+
+ }
+
+ else if (!got_a_number ||
+ !RealPoliciesT::allow_trailing_dot)
+ return scan.no_match();
+
+ e_hit = RealPoliciesT::parse_exp(scan);
+ }
+ else
+ {
+ // We have reached a point where we
+ // still haven't seen a number at all.
+ // We return early with a no-match.
+ if (!got_a_number)
+ return scan.no_match();
+
+ // If we must expect a dot and we didn't see
+ // an exponent, return early with a no-match.
+ e_hit = RealPoliciesT::parse_exp(scan);
+ if (RealPoliciesT::expect_dot && !e_hit)
+ return scan.no_match();
+ }
+
+ if (e_hit)
+ {
+ // We got the exponent prefix. Now we will try to parse the
+ // actual exponent. It is an error if it is not there.
+ if (RT e_n_hit = RealPoliciesT::parse_exp_n(scan))
+ {
+#if !defined(BOOST_NO_STDC_NAMESPACE)
+ using namespace std; // allow for ADL to find pow()
+#endif
+ n *= pow(T(10), T(e_n_hit.value()));
+ count += e_n_hit.length() + e_hit.length();
+ }
+ else
+ {
+ // Oops, no exponent, return a no-match
+ return scan.no_match();
+ }
+ }
+
+ return scan.create_match(count, n, save, scan.first);
+ }
+
+ template <typename ScannerT>
+ static RT parse(ScannerT const& scan)
+ {
+ static self_t this_;
+ return impl::implicit_lexeme_parse<RT>(this_, scan, scan);
+ }
+ };
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+ } // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/core/primitives/impl/primitives.ipp b/boost/spirit/home/classic/core/primitives/impl/primitives.ipp
new file mode 100644
index 0000000000..152e5b11be
--- /dev/null
+++ b/boost/spirit/home/classic/core/primitives/impl/primitives.ipp
@@ -0,0 +1,476 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_PRIMITIVES_IPP)
+#define BOOST_SPIRIT_PRIMITIVES_IPP
+
+// This should eventually go to a config file.
+#if defined(__GNUC__) && (__GNUC__ < 3) && !defined(_STLPORT_VERSION)
+# ifndef BOOST_SPIRIT_NO_CHAR_TRAITS
+# define BOOST_SPIRIT_NO_CHAR_TRAITS
+# endif
+#endif
+
+#include <cctype>
+#if !defined(BOOST_NO_CWCTYPE)
+#include <cwctype>
+#endif
+
+#ifndef BOOST_SPIRIT_NO_CHAR_TRAITS
+# include <string> // char_traits
+#endif
+
+#if defined(BOOST_MSVC)
+# pragma warning (push)
+# pragma warning(disable:4800)
+#endif
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename DrivedT> struct char_parser;
+
+ namespace impl
+ {
+ template <typename IteratorT>
+ inline IteratorT
+ get_last(IteratorT first)
+ {
+ while (*first)
+ first++;
+ return first;
+ }
+
+ template<
+ typename RT,
+ typename IteratorT,
+ typename ScannerT>
+ inline RT
+ string_parser_parse(
+ IteratorT str_first,
+ IteratorT str_last,
+ ScannerT& scan)
+ {
+ typedef typename ScannerT::iterator_t iterator_t;
+ iterator_t saved = scan.first;
+ std::size_t slen = str_last - str_first;
+
+ while (str_first != str_last)
+ {
+ if (scan.at_end() || (*str_first != *scan))
+ return scan.no_match();
+ ++str_first;
+ ++scan;
+ }
+
+ return scan.create_match(slen, nil_t(), saved, scan.first);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Conversion from char_type to int_type
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_SPIRIT_NO_CHAR_TRAITS
+# define BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE std
+#else
+
+ template <typename CharT>
+ struct char_traits
+ {
+ typedef CharT int_type;
+ typedef CharT char_type;
+ };
+
+ template<>
+ struct char_traits<char>
+ {
+ typedef int int_type;
+ typedef char char_type;
+
+ static char_type
+ to_char_type(int_type c)
+ {
+ return static_cast<char_type>(c);
+ }
+
+ static int
+ to_int_type(char c)
+ {
+ return static_cast<unsigned char>(c);
+ }
+ };
+
+ template<>
+ struct char_traits<unsigned char>
+ {
+ typedef int int_type;
+ typedef unsigned char char_type;
+
+ static char_type
+ to_char_type(int_type c)
+ {
+ return static_cast<char_type>(c);
+ }
+
+ static int
+ to_int_type(unsigned char c)
+ {
+ return c;
+ }
+ };
+
+# define BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE impl
+# ifndef BOOST_NO_CWCTYPE
+
+ template<>
+ struct char_traits<wchar_t>
+ {
+ typedef wint_t int_type;
+ typedef wchar_t char_type;
+
+ static char_type
+ to_char_type(int_type c)
+ {
+ return static_cast<char_type>(c);
+ }
+
+ static wint_t
+ to_int_type(wchar_t c)
+ {
+ return c;
+ }
+ };
+
+# endif
+#endif // BOOST_SPIRIT_NO_CHAR_TRAITS
+
+ // Use char_traits for char and wchar_t only, as these are the only
+ // specializations provided in the standard. Other types are on their
+ // own.
+ //
+ // For UDT, one may override:
+ //
+ // isalnum
+ // isalpha
+ // iscntrl
+ // isdigit
+ // isgraph
+ // islower
+ // isprint
+ // ispunct
+ // isspace
+ // isupper
+ // isxdigit
+ // isblank
+ // isupper
+ // tolower
+ // toupper
+ //
+ // in a namespace suitable for Argument Dependent lookup or in
+ // namespace std (disallowed by the standard).
+
+ template <typename CharT>
+ struct char_type_char_traits_helper
+ {
+ typedef CharT char_type;
+ typedef typename BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE
+ ::char_traits<CharT>::int_type int_type;
+
+ static int_type to_int_type(CharT c)
+ {
+ return BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE
+ ::char_traits<CharT>::to_int_type(c);
+ }
+
+ static char_type to_char_type(int_type i)
+ {
+ return BOOST_SPIRIT_CHAR_TRAITS_NAMESPACE
+ ::char_traits<CharT>::to_char_type(i);
+ }
+ };
+
+ template <typename CharT>
+ struct char_traits_helper
+ {
+ typedef CharT char_type;
+ typedef CharT int_type;
+
+ static CharT & to_int_type(CharT & c)
+ {
+ return c;
+ }
+
+ static CharT & to_char_type(CharT & c)
+ {
+ return c;
+ }
+ };
+
+ template <>
+ struct char_traits_helper<char>
+ : char_type_char_traits_helper<char>
+ {
+ };
+
+#if !defined(BOOST_NO_CWCTYPE)
+
+ template <>
+ struct char_traits_helper<wchar_t>
+ : char_type_char_traits_helper<wchar_t>
+ {
+ };
+
+#endif
+
+ template <typename CharT>
+ inline typename char_traits_helper<CharT>::int_type
+ to_int_type(CharT c)
+ {
+ return char_traits_helper<CharT>::to_int_type(c);
+ }
+
+ template <typename CharT>
+ inline CharT
+ to_char_type(typename char_traits_helper<CharT>::int_type c)
+ {
+ return char_traits_helper<CharT>::to_char_type(c);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // Convenience functions
+ //
+ ///////////////////////////////////////////////////////////////////////
+
+ template <typename CharT>
+ inline bool
+ isalnum_(CharT c)
+ {
+ using namespace std;
+ return isalnum(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ isalpha_(CharT c)
+ {
+ using namespace std;
+ return isalpha(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ iscntrl_(CharT c)
+ {
+ using namespace std;
+ return iscntrl(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ isdigit_(CharT c)
+ {
+ using namespace std;
+ return isdigit(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ isgraph_(CharT c)
+ {
+ using namespace std;
+ return isgraph(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ islower_(CharT c)
+ {
+ using namespace std;
+ return islower(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ isprint_(CharT c)
+ {
+ using namespace std;
+ return isprint(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ ispunct_(CharT c)
+ {
+ using namespace std;
+ return ispunct(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ isspace_(CharT c)
+ {
+ using namespace std;
+ return isspace(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ isupper_(CharT c)
+ {
+ using namespace std;
+ return isupper(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ isxdigit_(CharT c)
+ {
+ using namespace std;
+ return isxdigit(to_int_type(c)) ? true : false;
+ }
+
+ template <typename CharT>
+ inline bool
+ isblank_(CharT c)
+ {
+ return (c == ' ' || c == '\t');
+ }
+
+ template <typename CharT>
+ inline CharT
+ tolower_(CharT c)
+ {
+ using namespace std;
+ return to_char_type<CharT>(tolower(to_int_type(c)));
+ }
+
+ template <typename CharT>
+ inline CharT
+ toupper_(CharT c)
+ {
+ using namespace std;
+ return to_char_type<CharT>(toupper(to_int_type(c)));
+ }
+
+#if !defined(BOOST_NO_CWCTYPE)
+
+ inline bool
+ isalnum_(wchar_t c)
+ {
+ using namespace std;
+ return iswalnum(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ isalpha_(wchar_t c)
+ {
+ using namespace std;
+ return iswalpha(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ iscntrl_(wchar_t c)
+ {
+ using namespace std;
+ return iswcntrl(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ isdigit_(wchar_t c)
+ {
+ using namespace std;
+ return iswdigit(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ isgraph_(wchar_t c)
+ {
+ using namespace std;
+ return iswgraph(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ islower_(wchar_t c)
+ {
+ using namespace std;
+ return iswlower(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ isprint_(wchar_t c)
+ {
+ using namespace std;
+ return iswprint(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ ispunct_(wchar_t c)
+ {
+ using namespace std;
+ return iswpunct(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ isspace_(wchar_t c)
+ {
+ using namespace std;
+ return iswspace(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ isupper_(wchar_t c)
+ {
+ using namespace std;
+ return iswupper(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ isxdigit_(wchar_t c)
+ {
+ using namespace std;
+ return iswxdigit(to_int_type(c)) ? true : false;
+ }
+
+ inline bool
+ isblank_(wchar_t c)
+ {
+ return (c == L' ' || c == L'\t');
+ }
+
+ inline wchar_t
+ tolower_(wchar_t c)
+ {
+ using namespace std;
+ return to_char_type<wchar_t>(towlower(to_int_type(c)));
+ }
+
+ inline wchar_t
+ toupper_(wchar_t c)
+ {
+ using namespace std;
+ return to_char_type<wchar_t>(towupper(to_int_type(c)));
+ }
+
+#endif // !defined(BOOST_NO_CWCTYPE)
+
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit::impl
+
+#ifdef BOOST_MSVC
+#pragma warning (pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/classic/core/primitives/numerics.hpp b/boost/spirit/home/classic/core/primitives/numerics.hpp
new file mode 100644
index 0000000000..20ea0911a1
--- /dev/null
+++ b/boost/spirit/home/classic/core/primitives/numerics.hpp
@@ -0,0 +1,289 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_NUMERICS_HPP
+#define BOOST_SPIRIT_NUMERICS_HPP
+
+#include <boost/config.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/directives.hpp>
+
+#include <boost/spirit/home/classic/core/primitives/numerics_fwd.hpp>
+#include <boost/spirit/home/classic/core/primitives/impl/numerics.ipp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // uint_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T,
+ int Radix,
+ unsigned MinDigits,
+ int MaxDigits
+ >
+ struct uint_parser : parser<uint_parser<T, Radix, MinDigits, MaxDigits> >
+ {
+ typedef uint_parser<T, Radix, MinDigits, MaxDigits> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, T>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef impl::uint_parser_impl<T, Radix, MinDigits, MaxDigits> impl_t;
+ typedef typename parser_result<impl_t, ScannerT>::type result_t;
+ return impl::contiguous_parser_parse<result_t>(impl_t(), scan, scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // int_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T,
+ int Radix,
+ unsigned MinDigits,
+ int MaxDigits
+ >
+ struct int_parser : parser<int_parser<T, Radix, MinDigits, MaxDigits> >
+ {
+ typedef int_parser<T, Radix, MinDigits, MaxDigits> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, T>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef impl::int_parser_impl<T, Radix, MinDigits, MaxDigits> impl_t;
+ typedef typename parser_result<impl_t, ScannerT>::type result_t;
+ return impl::contiguous_parser_parse<result_t>(impl_t(), scan, scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // uint_parser/int_parser instantiations
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ int_parser<int> const
+ int_p = int_parser<int>();
+
+ uint_parser<unsigned> const
+ uint_p = uint_parser<unsigned>();
+
+ uint_parser<unsigned, 2> const
+ bin_p = uint_parser<unsigned, 2>();
+
+ uint_parser<unsigned, 8> const
+ oct_p = uint_parser<unsigned, 8>();
+
+ uint_parser<unsigned, 16> const
+ hex_p = uint_parser<unsigned, 16>();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // sign_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ namespace impl
+ {
+ // Utility to extract the prefix sign ('-' | '+')
+ template <typename ScannerT>
+ bool extract_sign(ScannerT const& scan, std::size_t& count);
+ }
+
+ struct sign_parser : public parser<sign_parser>
+ {
+ typedef sign_parser self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, bool>::type type;
+ };
+
+ sign_parser() {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ if (!scan.at_end())
+ {
+ std::size_t length;
+ typename ScannerT::iterator_t save(scan.first);
+ bool neg = impl::extract_sign(scan, length);
+ if (length)
+ return scan.create_match(1, neg, save, scan.first);
+ }
+ return scan.no_match();
+ }
+ };
+
+ sign_parser const sign_p = sign_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // default real number policies
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct ureal_parser_policies
+ {
+ // trailing dot policy suggested suggested by Gustavo Guerra
+ BOOST_STATIC_CONSTANT(bool, allow_leading_dot = true);
+ BOOST_STATIC_CONSTANT(bool, allow_trailing_dot = true);
+ BOOST_STATIC_CONSTANT(bool, expect_dot = false);
+
+ typedef uint_parser<T, 10, 1, -1> uint_parser_t;
+ typedef int_parser<T, 10, 1, -1> int_parser_t;
+
+ template <typename ScannerT>
+ static typename match_result<ScannerT, nil_t>::type
+ parse_sign(ScannerT& scan)
+ {
+ return scan.no_match();
+ }
+
+ template <typename ScannerT>
+ static typename parser_result<uint_parser_t, ScannerT>::type
+ parse_n(ScannerT& scan)
+ {
+ return uint_parser_t().parse(scan);
+ }
+
+ template <typename ScannerT>
+ static typename parser_result<chlit<>, ScannerT>::type
+ parse_dot(ScannerT& scan)
+ {
+ return ch_p('.').parse(scan);
+ }
+
+ template <typename ScannerT>
+ static typename parser_result<uint_parser_t, ScannerT>::type
+ parse_frac_n(ScannerT& scan)
+ {
+ return uint_parser_t().parse(scan);
+ }
+
+ template <typename ScannerT>
+ static typename parser_result<chlit<>, ScannerT>::type
+ parse_exp(ScannerT& scan)
+ {
+ return as_lower_d['e'].parse(scan);
+ }
+
+ template <typename ScannerT>
+ static typename parser_result<int_parser_t, ScannerT>::type
+ parse_exp_n(ScannerT& scan)
+ {
+ return int_parser_t().parse(scan);
+ }
+ };
+
+ template <typename T>
+ struct real_parser_policies : public ureal_parser_policies<T>
+ {
+ template <typename ScannerT>
+ static typename parser_result<sign_parser, ScannerT>::type
+ parse_sign(ScannerT& scan)
+ {
+ return sign_p.parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // real_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T,
+ typename RealPoliciesT
+ >
+ struct real_parser
+ : public parser<real_parser<T, RealPoliciesT> >
+ {
+ typedef real_parser<T, RealPoliciesT> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, T>::type type;
+ };
+
+ real_parser() {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::real_parser_impl<result_t, T, RealPoliciesT>::parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // real_parser instantiations
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ real_parser<double, ureal_parser_policies<double> > const
+ ureal_p = real_parser<double, ureal_parser_policies<double> >();
+
+ real_parser<double, real_parser_policies<double> > const
+ real_p = real_parser<double, real_parser_policies<double> >();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // strict reals (do not allow plain integers (no decimal point))
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct strict_ureal_parser_policies : public ureal_parser_policies<T>
+ {
+ BOOST_STATIC_CONSTANT(bool, expect_dot = true);
+ };
+
+ template <typename T>
+ struct strict_real_parser_policies : public real_parser_policies<T>
+ {
+ BOOST_STATIC_CONSTANT(bool, expect_dot = true);
+ };
+
+ real_parser<double, strict_ureal_parser_policies<double> > const
+ strict_ureal_p
+ = real_parser<double, strict_ureal_parser_policies<double> >();
+
+ real_parser<double, strict_real_parser_policies<double> > const
+ strict_real_p
+ = real_parser<double, strict_real_parser_policies<double> >();
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/core/primitives/numerics_fwd.hpp b/boost/spirit/home/classic/core/primitives/numerics_fwd.hpp
new file mode 100644
index 0000000000..b0f20d9aaa
--- /dev/null
+++ b/boost/spirit/home/classic/core/primitives/numerics_fwd.hpp
@@ -0,0 +1,88 @@
+/*=============================================================================
+ Copyright (C) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_NUMERICS_FWD_HPP)
+# define BOOST_SPIRIT_NUMERICS_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // uint_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T = unsigned,
+ int Radix = 10,
+ unsigned MinDigits = 1,
+ int MaxDigits = -1
+ >
+ struct uint_parser;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // int_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T = unsigned,
+ int Radix = 10,
+ unsigned MinDigits = 1,
+ int MaxDigits = -1
+ >
+ struct int_parser;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // sign_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct sign_parser;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // default real number policies
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct ureal_parser_policies;
+
+ template <typename T>
+ struct real_parser_policies;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // real_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T = double,
+ typename RealPoliciesT = ureal_parser_policies<T>
+ >
+ struct real_parser;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // strict reals (do not allow plain integers (no decimal point))
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct strict_ureal_parser_policies;
+
+ template <typename T>
+ struct strict_real_parser_policies;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/primitives/primitives.hpp b/boost/spirit/home/classic/core/primitives/primitives.hpp
new file mode 100644
index 0000000000..d89585b102
--- /dev/null
+++ b/boost/spirit/home/classic/core/primitives/primitives.hpp
@@ -0,0 +1,654 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_PRIMITIVES_HPP)
+#define BOOST_SPIRIT_PRIMITIVES_HPP
+
+#include <boost/ref.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/assert.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/impl/directives.ipp>
+#include <boost/spirit/home/classic/core/primitives/impl/primitives.ipp>
+
+#ifdef BOOST_MSVC
+#pragma warning (push)
+#pragma warning(disable : 4512)
+#endif
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // char_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename DerivedT>
+ struct char_parser : public parser<DerivedT>
+ {
+ typedef DerivedT self_t;
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<
+ ScannerT,
+ typename ScannerT::value_t
+ >::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::value_t value_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+
+ if (!scan.at_end())
+ {
+ value_t ch = *scan;
+ if (this->derived().test(ch))
+ {
+ iterator_t save(scan.first);
+ ++scan.first;
+ return scan.create_match(1, ch, save, scan.first);
+ }
+ }
+ return scan.no_match();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // negation of char_parsers
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename PositiveT>
+ struct negated_char_parser
+ : public char_parser<negated_char_parser<PositiveT> >
+ {
+ typedef negated_char_parser<PositiveT> self_t;
+ typedef PositiveT positive_t;
+
+ negated_char_parser(positive_t const& p)
+ : positive(p.derived()) {}
+
+ template <typename T>
+ bool test(T ch) const
+ {
+ return !positive.test(ch);
+ }
+
+ positive_t const positive;
+ };
+
+ template <typename ParserT>
+ inline negated_char_parser<ParserT>
+ operator~(char_parser<ParserT> const& p)
+ {
+ return negated_char_parser<ParserT>(p.derived());
+ }
+
+ template <typename ParserT>
+ inline ParserT
+ operator~(negated_char_parser<ParserT> const& n)
+ {
+ return n.positive;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // chlit class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT = char>
+ struct chlit : public char_parser<chlit<CharT> >
+ {
+ chlit(CharT ch_)
+ : ch(ch_) {}
+
+ template <typename T>
+ bool test(T ch_) const
+ {
+ return ch_ == ch;
+ }
+
+ CharT ch;
+ };
+
+ template <typename CharT>
+ inline chlit<CharT>
+ ch_p(CharT ch)
+ {
+ return chlit<CharT>(ch);
+ }
+
+ // This should take care of ch_p("a") "bugs"
+ template <typename CharT, std::size_t N>
+ inline chlit<CharT>
+ ch_p(CharT const (& str)[N])
+ {
+ // ch_p's argument should be a single character or a null-terminated
+ // string with a single character
+ BOOST_STATIC_ASSERT(N < 3);
+ return chlit<CharT>(str[0]);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // range class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT = char>
+ struct range : public char_parser<range<CharT> >
+ {
+ range(CharT first_, CharT last_)
+ : first(first_), last(last_)
+ {
+ BOOST_SPIRIT_ASSERT(!(last < first));
+ }
+
+ template <typename T>
+ bool test(T ch) const
+ {
+ return !(CharT(ch) < first) && !(last < CharT(ch));
+ }
+
+ CharT first;
+ CharT last;
+ };
+
+ template <typename CharT>
+ inline range<CharT>
+ range_p(CharT first, CharT last)
+ {
+ return range<CharT>(first, last);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // chseq class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename IteratorT = char const*>
+ class chseq : public parser<chseq<IteratorT> >
+ {
+ public:
+
+ typedef chseq<IteratorT> self_t;
+
+ chseq(IteratorT first_, IteratorT last_)
+ : first(first_), last(last_) {}
+
+ chseq(IteratorT first_)
+ : first(first_), last(impl::get_last(first_)) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename boost::unwrap_reference<IteratorT>::type striter_t;
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::string_parser_parse<result_t>(
+ striter_t(first),
+ striter_t(last),
+ scan);
+ }
+
+ private:
+
+ IteratorT first;
+ IteratorT last;
+ };
+
+ template <typename CharT>
+ inline chseq<CharT const*>
+ chseq_p(CharT const* str)
+ {
+ return chseq<CharT const*>(str);
+ }
+
+ template <typename IteratorT>
+ inline chseq<IteratorT>
+ chseq_p(IteratorT first, IteratorT last)
+ {
+ return chseq<IteratorT>(first, last);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // strlit class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename IteratorT = char const*>
+ class strlit : public parser<strlit<IteratorT> >
+ {
+ public:
+
+ typedef strlit<IteratorT> self_t;
+
+ strlit(IteratorT first, IteratorT last)
+ : seq(first, last) {}
+
+ strlit(IteratorT first)
+ : seq(first) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::contiguous_parser_parse<result_t>
+ (seq, scan, scan);
+ }
+
+ private:
+
+ chseq<IteratorT> seq;
+ };
+
+ template <typename CharT>
+ inline strlit<CharT const*>
+ str_p(CharT const* str)
+ {
+ return strlit<CharT const*>(str);
+ }
+
+ template <typename CharT>
+ inline strlit<CharT *>
+ str_p(CharT * str)
+ {
+ return strlit<CharT *>(str);
+ }
+
+ template <typename IteratorT>
+ inline strlit<IteratorT>
+ str_p(IteratorT first, IteratorT last)
+ {
+ return strlit<IteratorT>(first, last);
+ }
+
+ // This should take care of str_p('a') "bugs"
+ template <typename CharT>
+ inline chlit<CharT>
+ str_p(CharT ch)
+ {
+ return chlit<CharT>(ch);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // nothing_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct nothing_parser : public parser<nothing_parser>
+ {
+ typedef nothing_parser self_t;
+
+ nothing_parser() {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ return scan.no_match();
+ }
+ };
+
+ nothing_parser const nothing_p = nothing_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // anychar_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct anychar_parser : public char_parser<anychar_parser>
+ {
+ typedef anychar_parser self_t;
+
+ anychar_parser() {}
+
+ template <typename CharT>
+ bool test(CharT) const
+ {
+ return true;
+ }
+ };
+
+ anychar_parser const anychar_p = anychar_parser();
+
+ inline nothing_parser
+ operator~(anychar_parser)
+ {
+ return nothing_p;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // alnum_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct alnum_parser : public char_parser<alnum_parser>
+ {
+ typedef alnum_parser self_t;
+
+ alnum_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isalnum_(ch);
+ }
+ };
+
+ alnum_parser const alnum_p = alnum_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // alpha_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct alpha_parser : public char_parser<alpha_parser>
+ {
+ typedef alpha_parser self_t;
+
+ alpha_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isalpha_(ch);
+ }
+ };
+
+ alpha_parser const alpha_p = alpha_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // cntrl_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct cntrl_parser : public char_parser<cntrl_parser>
+ {
+ typedef cntrl_parser self_t;
+
+ cntrl_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::iscntrl_(ch);
+ }
+ };
+
+ cntrl_parser const cntrl_p = cntrl_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // digit_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct digit_parser : public char_parser<digit_parser>
+ {
+ typedef digit_parser self_t;
+
+ digit_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isdigit_(ch);
+ }
+ };
+
+ digit_parser const digit_p = digit_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // graph_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct graph_parser : public char_parser<graph_parser>
+ {
+ typedef graph_parser self_t;
+
+ graph_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isgraph_(ch);
+ }
+ };
+
+ graph_parser const graph_p = graph_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // lower_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct lower_parser : public char_parser<lower_parser>
+ {
+ typedef lower_parser self_t;
+
+ lower_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::islower_(ch);
+ }
+ };
+
+ lower_parser const lower_p = lower_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // print_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct print_parser : public char_parser<print_parser>
+ {
+ typedef print_parser self_t;
+
+ print_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isprint_(ch);
+ }
+ };
+
+ print_parser const print_p = print_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // punct_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct punct_parser : public char_parser<punct_parser>
+ {
+ typedef punct_parser self_t;
+
+ punct_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::ispunct_(ch);
+ }
+ };
+
+ punct_parser const punct_p = punct_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // blank_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct blank_parser : public char_parser<blank_parser>
+ {
+ typedef blank_parser self_t;
+
+ blank_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isblank_(ch);
+ }
+ };
+
+ blank_parser const blank_p = blank_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // space_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct space_parser : public char_parser<space_parser>
+ {
+ typedef space_parser self_t;
+
+ space_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isspace_(ch);
+ }
+ };
+
+ space_parser const space_p = space_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // upper_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct upper_parser : public char_parser<upper_parser>
+ {
+ typedef upper_parser self_t;
+
+ upper_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isupper_(ch);
+ }
+ };
+
+ upper_parser const upper_p = upper_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // xdigit_parser class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct xdigit_parser : public char_parser<xdigit_parser>
+ {
+ typedef xdigit_parser self_t;
+
+ xdigit_parser() {}
+
+ template <typename CharT>
+ bool test(CharT ch) const
+ {
+ return impl::isxdigit_(ch);
+ }
+ };
+
+ xdigit_parser const xdigit_p = xdigit_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // eol_parser class (contributed by Martin Wille)
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct eol_parser : public parser<eol_parser>
+ {
+ typedef eol_parser self_t;
+
+ eol_parser() {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typename ScannerT::iterator_t save = scan.first;
+ std::size_t len = 0;
+
+ if (!scan.at_end() && *scan == '\r') // CR
+ {
+ ++scan.first;
+ ++len;
+ }
+
+ // Don't call skipper here
+ if (scan.first != scan.last && *scan == '\n') // LF
+ {
+ ++scan.first;
+ ++len;
+ }
+
+ if (len)
+ return scan.create_match(len, nil_t(), save, scan.first);
+ return scan.no_match();
+ }
+ };
+
+ eol_parser const eol_p = eol_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // end_parser class (suggested by Markus Schoepflin)
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct end_parser : public parser<end_parser>
+ {
+ typedef end_parser self_t;
+
+ end_parser() {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ if (scan.at_end())
+ return scan.empty_match();
+ return scan.no_match();
+ }
+ };
+
+ end_parser const end_p = end_parser();
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // the pizza_p parser :-)
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ inline strlit<char const*> const
+ pizza_p(char const* your_favorite_pizza)
+ {
+ return your_favorite_pizza;
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#ifdef BOOST_MSVC
+#pragma warning (pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/classic/core/safe_bool.hpp b/boost/spirit/home/classic/core/safe_bool.hpp
new file mode 100644
index 0000000000..73b6e7b64b
--- /dev/null
+++ b/boost/spirit/home/classic/core/safe_bool.hpp
@@ -0,0 +1,64 @@
+/*=============================================================================
+ Copyright (c) 2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SAFE_BOOL_HPP)
+#define BOOST_SPIRIT_SAFE_BOOL_HPP
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl
+ {
+ template <typename T>
+ struct no_base {};
+
+ template <typename T>
+ struct safe_bool_impl
+ {
+#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
+ void stub(T*) {};
+ typedef void (safe_bool_impl::*type)(T*);
+#else
+ typedef T* TP; // workaround to make parsing easier
+ TP stub;
+ typedef TP safe_bool_impl::*type;
+#endif
+ };
+ }
+
+ template <typename DerivedT, typename BaseT = impl::no_base<DerivedT> >
+ struct safe_bool : BaseT
+ {
+ private:
+ typedef impl::safe_bool_impl<DerivedT> impl_t;
+ typedef typename impl_t::type bool_type;
+
+ public:
+ operator bool_type() const
+ {
+ return static_cast<const DerivedT*>(this)->operator_bool() ?
+ &impl_t::stub : 0;
+ }
+
+ operator bool_type()
+ {
+ return static_cast<DerivedT*>(this)->operator_bool() ?
+ &impl_t::stub : 0;
+ }
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/scanner/impl/skipper.ipp b/boost/spirit/home/classic/core/scanner/impl/skipper.ipp
new file mode 100644
index 0000000000..fab74bde3a
--- /dev/null
+++ b/boost/spirit/home/classic/core/scanner/impl/skipper.ipp
@@ -0,0 +1,181 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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)
+============================================================================*/
+#if !defined(BOOST_SPIRIT_SKIPPER_IPP)
+#define BOOST_SPIRIT_SKIPPER_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ struct space_parser;
+ template <typename BaseT>
+ struct no_skipper_iteration_policy;
+
+ namespace impl
+ {
+ template <typename ST, typename ScannerT, typename BaseT>
+ inline void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ skipper_iteration_policy<BaseT> const&)
+ {
+ typedef scanner_policies<
+ no_skipper_iteration_policy<
+ BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
+ BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
+ BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
+ > policies_t;
+
+ scanner<BOOST_DEDUCED_TYPENAME ScannerT::iterator_t, policies_t>
+ scan2(scan.first, scan.last, policies_t(scan));
+ typedef typename ScannerT::iterator_t iterator_t;
+
+ for (;;)
+ {
+ iterator_t save = scan.first;
+ if (!s.parse(scan2))
+ {
+ scan.first = save;
+ break;
+ }
+ }
+ }
+
+ template <typename ST, typename ScannerT, typename BaseT>
+ inline void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ no_skipper_iteration_policy<BaseT> const&)
+ {
+ for (;;)
+ {
+ typedef typename ScannerT::iterator_t iterator_t;
+ iterator_t save = scan.first;
+ if (!s.parse(scan))
+ {
+ scan.first = save;
+ break;
+ }
+ }
+ }
+
+ template <typename ST, typename ScannerT>
+ inline void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ iteration_policy const&)
+ {
+ for (;;)
+ {
+ typedef typename ScannerT::iterator_t iterator_t;
+ iterator_t save = scan.first;
+ if (!s.parse(scan))
+ {
+ scan.first = save;
+ break;
+ }
+ }
+ }
+
+ template <typename SkipT>
+ struct phrase_parser
+ {
+ template <typename IteratorT, typename ParserT>
+ static parse_info<IteratorT>
+ parse(
+ IteratorT const& first_,
+ IteratorT const& last,
+ ParserT const& p,
+ SkipT const& skip)
+ {
+ typedef skip_parser_iteration_policy<SkipT> iter_policy_t;
+ typedef scanner_policies<iter_policy_t> scanner_policies_t;
+ typedef scanner<IteratorT, scanner_policies_t> scanner_t;
+
+ iter_policy_t iter_policy(skip);
+ scanner_policies_t policies(iter_policy);
+ IteratorT first = first_;
+ scanner_t scan(first, last, policies);
+ match<nil_t> hit = p.parse(scan);
+ return parse_info<IteratorT>(
+ first, hit, hit && (first == last),
+ hit.length());
+ }
+ };
+
+ template <>
+ struct phrase_parser<space_parser>
+ {
+ template <typename IteratorT, typename ParserT>
+ static parse_info<IteratorT>
+ parse(
+ IteratorT const& first_,
+ IteratorT const& last,
+ ParserT const& p,
+ space_parser const&)
+ {
+ typedef skipper_iteration_policy<> iter_policy_t;
+ typedef scanner_policies<iter_policy_t> scanner_policies_t;
+ typedef scanner<IteratorT, scanner_policies_t> scanner_t;
+
+ IteratorT first = first_;
+ scanner_t scan(first, last);
+ match<nil_t> hit = p.parse(scan);
+ return parse_info<IteratorT>(
+ first, hit, hit && (first == last),
+ hit.length());
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Free parse functions using the skippers
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename IteratorT, typename ParserT, typename SkipT>
+ inline parse_info<IteratorT>
+ parse(
+ IteratorT const& first,
+ IteratorT const& last,
+ parser<ParserT> const& p,
+ parser<SkipT> const& skip)
+ {
+ return impl::phrase_parser<SkipT>::
+ parse(first, last, p.derived(), skip.derived());
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Parse function for null terminated strings using the skippers
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT, typename ParserT, typename SkipT>
+ inline parse_info<CharT const*>
+ parse(
+ CharT const* str,
+ parser<ParserT> const& p,
+ parser<SkipT> const& skip)
+ {
+ CharT const* last = str;
+ while (*last)
+ last++;
+ return parse(str, last, p, skip);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/scanner/scanner.hpp b/boost/spirit/home/classic/core/scanner/scanner.hpp
new file mode 100644
index 0000000000..38548770eb
--- /dev/null
+++ b/boost/spirit/home/classic/core/scanner/scanner.hpp
@@ -0,0 +1,329 @@
+/*=============================================================================
+ Copyright (c) 1998-2002 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SCANNER_HPP)
+#define BOOST_SPIRIT_SCANNER_HPP
+
+#include <iterator>
+#include <boost/config.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/match.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/parser_id.hpp>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+
+#include <boost/spirit/home/classic/core/scanner/scanner_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // iteration_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct iteration_policy
+ {
+ template <typename ScannerT>
+ void
+ advance(ScannerT const& scan) const
+ {
+ ++scan.first;
+ }
+
+ template <typename ScannerT>
+ bool at_end(ScannerT const& scan) const
+ {
+ return scan.first == scan.last;
+ }
+
+ template <typename T>
+ T filter(T ch) const
+ {
+ return ch;
+ }
+
+ template <typename ScannerT>
+ typename ScannerT::ref_t
+ get(ScannerT const& scan) const
+ {
+ return *scan.first;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // match_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct match_policy
+ {
+ template <typename T>
+ struct result { typedef match<T> type; };
+
+ const match<nil_t>
+ no_match() const
+ {
+ return match<nil_t>();
+ }
+
+ const match<nil_t>
+ empty_match() const
+ {
+ return match<nil_t>(0, nil_t());
+ }
+
+ template <typename AttrT, typename IteratorT>
+ match<AttrT>
+ create_match(
+ std::size_t length,
+ AttrT const& val,
+ IteratorT const& /*first*/,
+ IteratorT const& /*last*/) const
+ {
+ return match<AttrT>(length, val);
+ }
+
+ template <typename MatchT, typename IteratorT>
+ void group_match(
+ MatchT& /*m*/,
+ parser_id const& /*id*/,
+ IteratorT const& /*first*/,
+ IteratorT const& /*last*/) const {}
+
+ template <typename Match1T, typename Match2T>
+ void concat_match(Match1T& l, Match2T const& r) const
+ {
+ l.concat(r);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // match_result class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename MatchPolicyT, typename T>
+ struct match_result
+ {
+ typedef typename MatchPolicyT::template result<T>::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // action_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename AttrT>
+ struct attributed_action_policy
+ {
+ template <typename ActorT, typename IteratorT>
+ static void
+ call(
+ ActorT const& actor,
+ AttrT& val,
+ IteratorT const&,
+ IteratorT const&)
+ {
+ actor(val);
+ }
+ };
+
+ //////////////////////////////////
+ template <>
+ struct attributed_action_policy<nil_t>
+ {
+ template <typename ActorT, typename IteratorT>
+ static void
+ call(
+ ActorT const& actor,
+ nil_t,
+ IteratorT const& first,
+ IteratorT const& last)
+ {
+ actor(first, last);
+ }
+ };
+
+ //////////////////////////////////
+ struct action_policy
+ {
+ template <typename ActorT, typename AttrT, typename IteratorT>
+ void
+ do_action(
+ ActorT const& actor,
+ AttrT& val,
+ IteratorT const& first,
+ IteratorT const& last) const
+ {
+ attributed_action_policy<AttrT>::call(actor, val, first, last);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scanner_policies class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename IterationPolicyT,
+ typename MatchPolicyT,
+ typename ActionPolicyT>
+ struct scanner_policies :
+ public IterationPolicyT,
+ public MatchPolicyT,
+ public ActionPolicyT
+ {
+ typedef IterationPolicyT iteration_policy_t;
+ typedef MatchPolicyT match_policy_t;
+ typedef ActionPolicyT action_policy_t;
+
+ scanner_policies(
+ IterationPolicyT const& i_policy = IterationPolicyT(),
+ MatchPolicyT const& m_policy = MatchPolicyT(),
+ ActionPolicyT const& a_policy = ActionPolicyT())
+ : IterationPolicyT(i_policy)
+ , MatchPolicyT(m_policy)
+ , ActionPolicyT(a_policy) {}
+
+ template <typename ScannerPoliciesT>
+ scanner_policies(ScannerPoliciesT const& policies)
+ : IterationPolicyT(policies)
+ , MatchPolicyT(policies)
+ , ActionPolicyT(policies) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scanner_policies_base class: the base class of all scanners
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct scanner_base {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scanner class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename IteratorT,
+ typename PoliciesT>
+ class scanner : public PoliciesT, public scanner_base
+ {
+ public:
+
+ typedef IteratorT iterator_t;
+ typedef PoliciesT policies_t;
+
+ typedef typename boost::detail::
+ iterator_traits<IteratorT>::value_type value_t;
+ typedef typename boost::detail::
+ iterator_traits<IteratorT>::reference ref_t;
+ typedef typename boost::
+ call_traits<IteratorT>::param_type iter_param_t;
+
+ scanner(
+ IteratorT& first_,
+ iter_param_t last_,
+ PoliciesT const& policies = PoliciesT())
+ : PoliciesT(policies), first(first_), last(last_)
+ {
+ at_end();
+ }
+
+ scanner(scanner const& other)
+ : PoliciesT(other), first(other.first), last(other.last) {}
+
+ scanner(scanner const& other, IteratorT& first_)
+ : PoliciesT(other), first(first_), last(other.last) {}
+
+ template <typename PoliciesT1>
+ scanner(scanner<IteratorT, PoliciesT1> const& other)
+ : PoliciesT(other), first(other.first), last(other.last) {}
+
+ bool
+ at_end() const
+ {
+ typedef typename PoliciesT::iteration_policy_t iteration_policy_type;
+ return iteration_policy_type::at_end(*this);
+ }
+
+ value_t
+ operator*() const
+ {
+ typedef typename PoliciesT::iteration_policy_t iteration_policy_type;
+ return iteration_policy_type::filter(iteration_policy_type::get(*this));
+ }
+
+ scanner const&
+ operator++() const
+ {
+ typedef typename PoliciesT::iteration_policy_t iteration_policy_type;
+ iteration_policy_type::advance(*this);
+ return *this;
+ }
+
+ template <typename PoliciesT2>
+ struct rebind_policies
+ {
+ typedef scanner<IteratorT, PoliciesT2> type;
+ };
+
+ template <typename PoliciesT2>
+ scanner<IteratorT, PoliciesT2>
+ change_policies(PoliciesT2 const& policies) const
+ {
+ return scanner<IteratorT, PoliciesT2>(first, last, policies);
+ }
+
+ template <typename IteratorT2>
+ struct rebind_iterator
+ {
+ typedef scanner<IteratorT2, PoliciesT> type;
+ };
+
+ template <typename IteratorT2>
+ scanner<IteratorT2, PoliciesT>
+ change_iterator(IteratorT2 const& first_, IteratorT2 const &last_) const
+ {
+ return scanner<IteratorT2, PoliciesT>(first_, last_, *this);
+ }
+
+ IteratorT& first;
+ IteratorT const last;
+
+ private:
+
+ scanner&
+ operator=(scanner const& other);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // rebind_scanner_policies class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ScannerT, typename PoliciesT>
+ struct rebind_scanner_policies
+ {
+ typedef typename ScannerT::template
+ rebind_policies<PoliciesT>::type type;
+ };
+
+ //////////////////////////////////
+ template <typename ScannerT, typename IteratorT>
+ struct rebind_scanner_iterator
+ {
+ typedef typename ScannerT::template
+ rebind_iterator<IteratorT>::type type;
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}}
+
+#endif
diff --git a/boost/spirit/home/classic/core/scanner/scanner_fwd.hpp b/boost/spirit/home/classic/core/scanner/scanner_fwd.hpp
new file mode 100644
index 0000000000..efd78cfa54
--- /dev/null
+++ b/boost/spirit/home/classic/core/scanner/scanner_fwd.hpp
@@ -0,0 +1,52 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SCANNER_FWD_HPP)
+#define BOOST_SPIRIT_SCANNER_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // policy classes
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct iteration_policy;
+ struct action_policy;
+ struct match_policy;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scanner_policies class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename IterationPolicyT = iteration_policy,
+ typename MatchPolicyT = match_policy,
+ typename ActionPolicyT = action_policy>
+ struct scanner_policies;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scanner class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename IteratorT = char const*,
+ typename PoliciesT = scanner_policies<> >
+ class scanner;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/scanner/skipper.hpp b/boost/spirit/home/classic/core/scanner/skipper.hpp
new file mode 100644
index 0000000000..4e655aeafe
--- /dev/null
+++ b/boost/spirit/home/classic/core/scanner/skipper.hpp
@@ -0,0 +1,197 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SKIPPER_HPP)
+#define BOOST_SPIRIT_SKIPPER_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <cctype>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/scanner/scanner.hpp>
+#include <boost/spirit/home/classic/core/primitives/impl/primitives.ipp>
+
+#include <boost/spirit/home/classic/core/scanner/skipper_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // skipper_iteration_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename BaseT>
+ struct skipper_iteration_policy : public BaseT
+ {
+ typedef BaseT base_t;
+
+ skipper_iteration_policy()
+ : BaseT() {}
+
+ template <typename PolicyT>
+ skipper_iteration_policy(PolicyT const& other)
+ : BaseT(other) {}
+
+ template <typename ScannerT>
+ void
+ advance(ScannerT const& scan) const
+ {
+ BaseT::advance(scan);
+ scan.skip(scan);
+ }
+
+ template <typename ScannerT>
+ bool
+ at_end(ScannerT const& scan) const
+ {
+ scan.skip(scan);
+ return BaseT::at_end(scan);
+ }
+
+ template <typename ScannerT>
+ void
+ skip(ScannerT const& scan) const
+ {
+ while (!BaseT::at_end(scan) && impl::isspace_(BaseT::get(scan)))
+ BaseT::advance(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // no_skipper_iteration_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename BaseT>
+ struct no_skipper_iteration_policy : public BaseT
+ {
+ typedef BaseT base_t;
+
+ no_skipper_iteration_policy()
+ : BaseT() {}
+
+ template <typename PolicyT>
+ no_skipper_iteration_policy(PolicyT const& other)
+ : BaseT(other) {}
+
+ template <typename ScannerT>
+ void
+ skip(ScannerT const& /*scan*/) const {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // skip_parser_iteration_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ namespace impl
+ {
+ template <typename ST, typename ScannerT, typename BaseT>
+ void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ skipper_iteration_policy<BaseT> const&);
+
+ template <typename ST, typename ScannerT, typename BaseT>
+ void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ no_skipper_iteration_policy<BaseT> const&);
+
+ template <typename ST, typename ScannerT>
+ void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ iteration_policy const&);
+ }
+
+ template <typename ParserT, typename BaseT>
+ class skip_parser_iteration_policy : public skipper_iteration_policy<BaseT>
+ {
+ public:
+
+ typedef skipper_iteration_policy<BaseT> base_t;
+
+ skip_parser_iteration_policy(
+ ParserT const& skip_parser,
+ base_t const& base = base_t())
+ : base_t(base), subject(skip_parser) {}
+
+ template <typename PolicyT>
+ skip_parser_iteration_policy(PolicyT const& other)
+ : base_t(other), subject(other.skipper()) {}
+
+ template <typename ScannerT>
+ void
+ skip(ScannerT const& scan) const
+ {
+ impl::skipper_skip(subject, scan, scan);
+ }
+
+ ParserT const&
+ skipper() const
+ {
+ return subject;
+ }
+
+ private:
+
+ ParserT const& subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //
+ // Free parse functions using the skippers
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ template <typename IteratorT, typename ParserT, typename SkipT>
+ parse_info<IteratorT>
+ parse(
+ IteratorT const& first,
+ IteratorT const& last,
+ parser<ParserT> const& p,
+ parser<SkipT> const& skip);
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //
+ // Parse function for null terminated strings using the skippers
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ template <typename CharT, typename ParserT, typename SkipT>
+ parse_info<CharT const*>
+ parse(
+ CharT const* str,
+ parser<ParserT> const& p,
+ parser<SkipT> const& skip);
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //
+ // phrase_scanner_t and wide_phrase_scanner_t
+ //
+ // The most common scanners. Use these typedefs when you need
+ // a scanner that skips white spaces.
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ typedef skipper_iteration_policy<> iter_policy_t;
+ typedef scanner_policies<iter_policy_t> scanner_policies_t;
+ typedef scanner<char const*, scanner_policies_t> phrase_scanner_t;
+ typedef scanner<wchar_t const*, scanner_policies_t> wide_phrase_scanner_t;
+
+ ///////////////////////////////////////////////////////////////////////////////
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#include <boost/spirit/home/classic/core/scanner/impl/skipper.ipp>
+#endif
+
diff --git a/boost/spirit/home/classic/core/scanner/skipper_fwd.hpp b/boost/spirit/home/classic/core/scanner/skipper_fwd.hpp
new file mode 100644
index 0000000000..228e618bac
--- /dev/null
+++ b/boost/spirit/home/classic/core/scanner/skipper_fwd.hpp
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SKIPPER_FWD_HPP)
+#define BOOST_SPIRIT_SKIPPER_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/scanner/scanner_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename BaseT = iteration_policy>
+ struct skipper_iteration_policy;
+
+ template <typename BaseT = iteration_policy>
+ struct no_skipper_iteration_policy;
+
+ template <typename ParserT, typename BaseT = iteration_policy>
+ class skip_parser_iteration_policy;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/core/typeof.hpp b/boost/spirit/home/classic/core/typeof.hpp
new file mode 100644
index 0000000000..ca82428415
--- /dev/null
+++ b/boost/spirit/home/classic/core/typeof.hpp
@@ -0,0 +1,343 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CORE_TYPEOF_HPP)
+#define BOOST_SPIRIT_CORE_TYPEOF_HPP
+
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+#include <boost/spirit/home/classic/core/primitives/numerics_fwd.hpp>
+#include <boost/spirit/home/classic/core/scanner/scanner_fwd.hpp>
+#include <boost/spirit/home/classic/core/scanner/skipper_fwd.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/subrule_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ // parser.hpp
+ template <typename IteratorT> struct parse_info;
+ struct plain_parser_category;
+ struct binary_parser_category;
+ struct unary_parser_category;
+ struct action_parser_category;
+
+ // match.hpp
+ template<typename T> class match;
+
+ // primitives/primitives.hpp
+ template<class ParserT> struct negated_char_parser;
+ template<typename CharT> struct chlit;
+ template<typename CharT> struct range;
+ template<typename IteratorT> class chseq;
+ template<typename IteratorT> class strlit;
+ struct nothing_parser;
+ struct anychar_parser;
+ struct alnum_parser;
+ struct alpha_parser;
+ struct cntrl_parser;
+ struct digit_parser;
+ struct xdigit_parser;
+ struct graph_parser;
+ struct upper_parser;
+ struct lower_parser;
+ struct print_parser;
+ struct punct_parser;
+ struct blank_parser;
+ struct space_parser;
+ struct eol_parser;
+ struct end_parser;
+
+ // non_terminal/parser_context.hpp
+ template<typename T> struct parser_context;
+
+ // non_terminal/parser_id.hpp
+ class parser_id;
+ template<int N> struct parser_tag;
+ class dynamic_parser_tag;
+ struct parser_address_tag;
+
+ // non_terminal/rule.hpp
+ template<typename T0, typename T1, typename T2> class rule;
+
+ // non_terminal/grammar.hpp
+ template<class DerivedT, typename ContextT> struct grammar;
+
+ // composite.hpp
+ template<class ParserT, typename ActionT> class action;
+ template<class A, class B> struct alternative;
+ template<class A, class B> struct difference;
+ template<class A, class B> struct exclusive_or;
+ template<class A, class B> struct intersection;
+ template<class a, class b> struct sequence;
+ template<class A, class B> struct sequential_or;
+ template<class S> struct kleene_star;
+ template<class S> struct positive;
+ template<class S> struct optional;
+ // composite/directives.hpp
+ template<class ParserT> struct contiguous;
+ template<class ParserT> struct inhibit_case;
+ template<class BaseT> struct inhibit_case_iteration_policy;
+ template<class A, class B> struct longest_alternative;
+ template<class A, class B> struct shortest_alternative;
+ template<class ParserT, typename BoundsT> struct min_bounded;
+ template<class ParserT, typename BoundsT> struct max_bounded;
+ template<class ParserT, typename BoundsT> struct bounded;
+ // composite/no_actions.hpp
+ template<class Parser> struct no_actions_parser;
+ template<class Base> struct no_actions_action_policy;
+ // composite/epsilon.hpp
+ struct epsilon_parser;
+ template<typename CondT, bool positive> struct condition_parser;
+ template<typename SubjectT> struct empty_match_parser;
+ template<typename SubjectT> struct negated_empty_match_parser;
+
+ // deprecated assign/push_back actor -- they live somewhere else, now
+ struct assign_action;
+ struct push_back_action;
+ template<typename T, typename ActionT> class ref_value_actor;
+ template<typename T, typename ValueT, typename ActionT>
+ class ref_const_ref_actor;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+
+// parser.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::parse_info,1)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::plain_parser_category)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::binary_parser_category)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::unary_parser_category)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::action_parser_category)
+
+
+// nil.hpp (included directly)
+
+#if !defined(BOOST_SPIRIT_NIL_T_TYPEOF_REGISTERED)
+// registration guard to decouple the iterators from the core
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::nil_t)
+# define BOOST_SPIRIT_NIL_T_TYPEOF_REGISTERED
+#endif
+
+// match.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::match, 1)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::match<BOOST_SPIRIT_CLASSIC_NS::nil_t>)
+
+
+// primitives/primitives.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::negated_char_parser, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::chlit, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::range, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::chseq, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::strlit, 1)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::nothing_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::anychar_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::alnum_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::alpha_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::cntrl_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::digit_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::xdigit_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::graph_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::upper_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::lower_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::print_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::punct_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::blank_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::space_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::eol_parser)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::end_parser)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::chlit<char>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::chlit<wchar_t>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::range<char>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::range<wchar_t>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::chseq<char const *>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::chseq<wchar_t const *>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::strlit<char const *>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::strlit<wchar_t const *>)
+
+
+// primitives/numerics.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::int_parser, (class)(int)(unsigned)(int))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::uint_parser, (class)(int)(unsigned)(int))
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::sign_parser)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::real_parser, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::real_parser_policies, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ureal_parser_policies, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::strict_real_parser_policies, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::strict_ureal_parser_policies, 1)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::int_parser, (class)(int))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::uint_parser, (class)(int))
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::int_parser<boost::int32_t>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::uint_parser<boost::uint32_t>)
+#if !defined(BOOST_NO_INT64_T)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::int_parser<boost::int64_t>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::uint_parser<boost::uint64_t>)
+#endif
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::real_parser_policies<float>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::real_parser_policies<double>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::ureal_parser_policies<float>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::ureal_parser_policies<double>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::strict_real_parser_policies<float>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::strict_real_parser_policies<double>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::strict_ureal_parser_policies<float>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::strict_ureal_parser_policies<double>)
+
+
+// scanner/scanner.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::scanner,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::scanner_policies,3)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::iteration_policy)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::action_policy)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::match_policy)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::scanner,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::scanner_policies,2)
+
+
+// scanner/skipper.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::skipper_iteration_policy,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::no_skipper_iteration_policy,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::skip_parser_iteration_policy,2)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::skipper_iteration_policy<>)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::skip_parser_iteration_policy,1)
+
+
+// non_terminal/parser_context.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::parser_context,1)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::parser_context<BOOST_SPIRIT_CLASSIC_NS::nil_t>)
+
+
+// non_terminal/parser_id.hpp
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::parser_id)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::parser_tag, (int))
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::dynamic_parser_tag)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::parser_address_tag)
+
+
+// non_terminal/subrule.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::subrule,(int)(class))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::subrule_parser,(int)(class)(class))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::subrule_list,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::subrules_scanner,2)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::subrule,(int))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::subrule_parser,(int)(class))
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::subrule<0>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::subrule<1>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::subrule<2>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::subrule<3>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::subrule<4>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::subrule<5>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::subrule<6>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::subrule<7>)
+
+
+// non_terminal/rule.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::rule,3)
+#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::scanner_list,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::scanner_list,BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT)
+#endif
+
+
+// non_terminal/grammar.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::grammar,2)
+
+
+// composite.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::action, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::alternative, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::difference, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::exclusive_or, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::intersection, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::sequence, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::sequential_or, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::kleene_star, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::positive, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::optional, 1)
+
+
+// composite/directives.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::contiguous, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::inhibit_case, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::inhibit_case_iteration_policy,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::longest_alternative, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::shortest_alternative, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::min_bounded, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::max_bounded, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::bounded, 2)
+
+
+// composite/no_actions.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::no_actions_parser, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::no_actions_action_policy, 1)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::no_actions_action_policy<BOOST_SPIRIT_CLASSIC_NS::action_policy>)
+
+
+// composite/epsilon.hpp
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::epsilon_parser)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::condition_parser, (class)(bool))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::empty_match_parser, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::negated_empty_match_parser, 1)
+
+
+#if !defined(BOOST_SPIRIT_ACTOR_TYPEOF_HPP)
+// deprecated assign/push_back actor -- they live somewhere else, now
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ref_value_actor,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ref_const_ref_actor,3)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::assign_action)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::push_back_action)
+#endif
+
+
+#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1400)) && BOOST_MSVC >= 1400
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ nil_t & operator* (nil_t);
+ nil_t & operator+ (nil_t);
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+} } // namespace ::BOOST_SPIRIT_CLASSIC_NS
+#endif
+
+
+#endif
+
diff --git a/boost/spirit/home/classic/debug.hpp b/boost/spirit/home/classic/debug.hpp
new file mode 100644
index 0000000000..9737b35bee
--- /dev/null
+++ b/boost/spirit/home/classic/debug.hpp
@@ -0,0 +1,154 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEBUG_MAIN_HPP)
+#define BOOST_SPIRIT_DEBUG_MAIN_HPP
+
+///////////////////////////////////////////////////////////////////////////
+#if defined(BOOST_SPIRIT_DEBUG)
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Spirit.Debug includes and defines
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ #include <iostream>
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The BOOST_SPIRIT_DEBUG_OUT defines the stream object, which should be used
+ // for debug diagnostics. This defaults to std::cout.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #if !defined(BOOST_SPIRIT_DEBUG_OUT)
+ #define BOOST_SPIRIT_DEBUG_OUT std::cout
+ #endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The BOOST_SPIRIT_DEBUG_PRINT_SOME constant defines the number of characters
+ // from the stream to be printed for diagnosis. This defaults to the first
+ // 20 characters.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #if !defined(BOOST_SPIRIT_DEBUG_PRINT_SOME)
+ #define BOOST_SPIRIT_DEBUG_PRINT_SOME 20
+ #endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Additional BOOST_SPIRIT_DEBUG_FLAGS control the level of diagnostics printed
+ // Basic constants are defined in debug/minimal.hpp.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #define BOOST_SPIRIT_DEBUG_FLAGS_NODES 0x0001 // node diagnostics
+ #define BOOST_SPIRIT_DEBUG_FLAGS_ESCAPE_CHAR 0x0002 // escape_char_parse diagnostics
+ #define BOOST_SPIRIT_DEBUG_FLAGS_TREES 0x0004 // parse tree/ast diagnostics
+ #define BOOST_SPIRIT_DEBUG_FLAGS_CLOSURES 0x0008 // closure diagnostics
+ #define BOOST_SPIRIT_DEBUG_FLAGS_SLEX 0x8000 // slex diagnostics
+
+ #define BOOST_SPIRIT_DEBUG_FLAGS_MAX 0xFFFF // print maximal diagnostics
+
+ #if !defined(BOOST_SPIRIT_DEBUG_FLAGS)
+ #define BOOST_SPIRIT_DEBUG_FLAGS BOOST_SPIRIT_DEBUG_FLAGS_MAX
+ #endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // By default all nodes are traced (even those, not registered with
+ // BOOST_SPIRIT_DEBUG_RULE et.al. - see below). The following constant may be
+ // used to redefine this default.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #if !defined(BOOST_SPIRIT_DEBUG_TRACENODE)
+ #define BOOST_SPIRIT_DEBUG_TRACENODE (true)
+ #endif // !defined(BOOST_SPIRIT_DEBUG_TRACENODE)
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Helper macros for giving rules and subrules a name accessible through
+ // parser_name() functions (see parser_names.hpp).
+ //
+ // Additionally, the macros BOOST_SPIRIT_DEBUG_RULE, SPIRIT_DEBUG_NODE and
+ // BOOST_SPIRIT_DEBUG_GRAMMAR enable/disable the tracing of the
+ // correspondingnode accordingly to the PP constant
+ // BOOST_SPIRIT_DEBUG_TRACENODE.
+ //
+ // The macros BOOST_SPIRIT_DEBUG_TRACE_RULE, BOOST_SPIRIT_DEBUG_TRACE_NODE
+ // and BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR allow to specify a flag to define,
+ // whether the corresponding node is to be traced or not.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #if !defined(BOOST_SPIRIT_DEBUG_RULE)
+ #define BOOST_SPIRIT_DEBUG_RULE(r) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, #r, BOOST_SPIRIT_DEBUG_TRACENODE)
+ #endif // !defined(BOOST_SPIRIT_DEBUG_RULE)
+
+ #if !defined(BOOST_SPIRIT_DEBUG_NODE)
+ #define BOOST_SPIRIT_DEBUG_NODE(r) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, #r, BOOST_SPIRIT_DEBUG_TRACENODE)
+ #endif // !defined(BOOST_SPIRIT_DEBUG_NODE)
+
+ #if !defined(BOOST_SPIRIT_DEBUG_GRAMMAR)
+ #define BOOST_SPIRIT_DEBUG_GRAMMAR(r) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, #r, BOOST_SPIRIT_DEBUG_TRACENODE)
+ #endif // !defined(BOOST_SPIRIT_DEBUG_GRAMMAR)
+
+ #if !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE)
+ #define BOOST_SPIRIT_DEBUG_TRACE_RULE(r, t) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, #r, (t))
+ #endif // !defined(BOOST_SPIRIT_TRACE_RULE)
+
+ #if !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE)
+ #define BOOST_SPIRIT_DEBUG_TRACE_NODE(r, t) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, #r, (t))
+ #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE)
+
+ #if !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR)
+ #define BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR(r, t) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, #r, (t))
+ #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR)
+
+ #if !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME)
+ #define BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME(r, n, t) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, (n), (t))
+ #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME)
+
+ #if !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME)
+ #define BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME(r, n, t) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, (n), (t))
+ #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME)
+
+ #if !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME)
+ #define BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME(r, n, t) \
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::get_node_registry(). \
+ register_node(&r, (n), (t))
+ #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME)
+
+ //////////////////////////////////
+ #include <boost/spirit/home/classic/debug/debug_node.hpp>
+
+#else
+ //////////////////////////////////
+ #include <boost/spirit/home/classic/debug/minimal.hpp>
+
+#endif // BOOST_SPIRIT_DEBUG
+
+#endif
+
diff --git a/boost/spirit/home/classic/debug/debug_node.hpp b/boost/spirit/home/classic/debug/debug_node.hpp
new file mode 100644
index 0000000000..adc1f91f22
--- /dev/null
+++ b/boost/spirit/home/classic/debug/debug_node.hpp
@@ -0,0 +1,319 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ Copyright (c) 2003 Gustavo Guerra
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEBUG_NODE_HPP)
+#define BOOST_SPIRIT_DEBUG_NODE_HPP
+
+#if !defined(BOOST_SPIRIT_DEBUG_MAIN_HPP)
+#error "You must include boost/spirit/debug.hpp, not boost/spirit/debug/debug_node.hpp"
+#endif
+
+#if defined(BOOST_SPIRIT_DEBUG)
+
+#include <string>
+
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp> // for iscntrl_
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Debug helper classes for rules, which ensure maximum non-intrusiveness of
+// the Spirit debug support
+//
+///////////////////////////////////////////////////////////////////////////////
+
+namespace impl {
+
+ struct token_printer_aux_for_chars
+ {
+ template<typename CharT>
+ static void print(std::ostream& o, CharT c)
+ {
+ if (c == static_cast<CharT>('\a'))
+ o << "\\a";
+
+ else if (c == static_cast<CharT>('\b'))
+ o << "\\b";
+
+ else if (c == static_cast<CharT>('\f'))
+ o << "\\f";
+
+ else if (c == static_cast<CharT>('\n'))
+ o << "\\n";
+
+ else if (c == static_cast<CharT>('\r'))
+ o << "\\r";
+
+ else if (c == static_cast<CharT>('\t'))
+ o << "\\t";
+
+ else if (c == static_cast<CharT>('\v'))
+ o << "\\v";
+
+ else if (iscntrl_(c))
+ o << "\\" << static_cast<int>(c);
+
+ else
+ o << static_cast<char>(c);
+ }
+ };
+
+ // for token types where the comparison with char constants wouldn't work
+ struct token_printer_aux_for_other_types
+ {
+ template<typename CharT>
+ static void print(std::ostream& o, CharT c)
+ {
+ o << c;
+ }
+ };
+
+ template <typename CharT>
+ struct token_printer_aux
+ : mpl::if_<
+ mpl::and_<
+ is_convertible<CharT, char>,
+ is_convertible<char, CharT> >,
+ token_printer_aux_for_chars,
+ token_printer_aux_for_other_types
+ >::type
+ {
+ };
+
+ template<typename CharT>
+ inline void token_printer(std::ostream& o, CharT c)
+ {
+ #if !defined(BOOST_SPIRIT_DEBUG_TOKEN_PRINTER)
+
+ token_printer_aux<CharT>::print(o, c);
+
+ #else
+
+ BOOST_SPIRIT_DEBUG_TOKEN_PRINTER(o, c);
+
+ #endif
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Dump infos about the parsing state of a rule
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#if BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES
+ template <typename IteratorT>
+ inline void
+ print_node_info(bool hit, int level, bool close, std::string const& name,
+ IteratorT first, IteratorT last)
+ {
+ if (!name.empty())
+ {
+ for (int i = 0; i < level; ++i)
+ BOOST_SPIRIT_DEBUG_OUT << " ";
+ if (close)
+ {
+ if (hit)
+ BOOST_SPIRIT_DEBUG_OUT << "/";
+ else
+ BOOST_SPIRIT_DEBUG_OUT << "#";
+ }
+ BOOST_SPIRIT_DEBUG_OUT << name << ":\t\"";
+ IteratorT iter = first;
+ IteratorT ilast = last;
+ for (int j = 0; j < BOOST_SPIRIT_DEBUG_PRINT_SOME; ++j)
+ {
+ if (iter == ilast)
+ break;
+
+ token_printer(BOOST_SPIRIT_DEBUG_OUT, *iter);
+ ++iter;
+ }
+ BOOST_SPIRIT_DEBUG_OUT << "\"\n";
+ }
+ }
+#endif // BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES
+
+#if BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_CLOSURES
+ template <typename ResultT>
+ inline ResultT &
+ print_closure_info(ResultT &hit, int level, std::string const& name)
+ {
+ if (!name.empty())
+ {
+ for (int i = 0; i < level-1; ++i)
+ BOOST_SPIRIT_DEBUG_OUT << " ";
+
+ // for now, print out the return value only
+ BOOST_SPIRIT_DEBUG_OUT << "^" << name << ":\t";
+ if (hit.has_valid_attribute())
+ BOOST_SPIRIT_DEBUG_OUT << hit.value();
+ else
+ BOOST_SPIRIT_DEBUG_OUT << "undefined attribute";
+ BOOST_SPIRIT_DEBUG_OUT << "\n";
+ }
+ return hit;
+ }
+#endif // BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_CLOSURES
+
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Implementation note: The parser_context_linker, parser_scanner_linker and
+// closure_context_linker classes are wrapped by a PP constant to allow
+// redefinition of this classes outside of Spirit
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED)
+#define BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_context_linker is a debug wrapper for the ContextT template
+ // parameter of the rule<>, subrule<> and the grammar<> classes
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename ContextT>
+ struct parser_context_linker : public ContextT
+ {
+ typedef ContextT base_t;
+
+ template <typename ParserT>
+ parser_context_linker(ParserT const& p)
+ : ContextT(p) {}
+
+ template <typename ParserT, typename ScannerT>
+ void pre_parse(ParserT const& p, ScannerT &scan)
+ {
+ this->base_t::pre_parse(p, scan);
+
+#if BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES
+ if (trace_parser(p.derived())) {
+ impl::print_node_info(
+ false,
+ scan.get_level(),
+ false,
+ parser_name(p.derived()),
+ scan.first,
+ scan.last);
+ }
+ scan.get_level()++;
+#endif // BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES
+ }
+
+ template <typename ResultT, typename ParserT, typename ScannerT>
+ ResultT& post_parse(ResultT& hit, ParserT const& p, ScannerT &scan)
+ {
+#if BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES
+ --scan.get_level();
+ if (trace_parser(p.derived())) {
+ impl::print_node_info(
+ hit,
+ scan.get_level(),
+ true,
+ parser_name(p.derived()),
+ scan.first,
+ scan.last);
+ }
+#endif // BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES
+
+ return this->base_t::post_parse(hit, p, scan);
+ }
+ };
+
+#endif // !defined(BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED)
+
+#if !defined(BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED)
+#define BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED
+
+///////////////////////////////////////////////////////////////////////////////
+// This class is to avoid linker problems and to ensure a real singleton
+// 'level' variable
+ struct debug_support
+ {
+ int& get_level()
+ {
+ static int level = 0;
+ return level;
+ }
+ };
+
+ template<typename ScannerT>
+ struct parser_scanner_linker : public ScannerT
+ {
+ parser_scanner_linker(ScannerT const &scan_) : ScannerT(scan_)
+ {}
+
+ int &get_level()
+ { return debug.get_level(); }
+
+ private: debug_support debug;
+ };
+
+#endif // !defined(BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED)
+
+#if !defined(BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED)
+#define BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // closure_context_linker is a debug wrapper for the closure template
+ // parameter of the rule<>, subrule<> and grammar classes
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ template<typename ContextT>
+ struct closure_context_linker : public parser_context_linker<ContextT>
+ {
+ typedef parser_context_linker<ContextT> base_t;
+
+ template <typename ParserT>
+ closure_context_linker(ParserT const& p)
+ : parser_context_linker<ContextT>(p) {}
+
+ template <typename ParserT, typename ScannerT>
+ void pre_parse(ParserT const& p, ScannerT &scan)
+ { this->base_t::pre_parse(p, scan); }
+
+ template <typename ResultT, typename ParserT, typename ScannerT>
+ ResultT&
+ post_parse(ResultT& hit, ParserT const& p, ScannerT &scan)
+ {
+#if BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_CLOSURES
+ if (hit && trace_parser(p.derived())) {
+ // for now, print out the return value only
+ return impl::print_closure_info(
+ this->base_t::post_parse(hit, p, scan),
+ scan.get_level(),
+ parser_name(p.derived())
+ );
+ }
+#endif // BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_CLOSURES
+
+ return this->base_t::post_parse(hit, p, scan);
+ }
+ };
+
+#endif // !defined(BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED)
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // defined(BOOST_SPIRIT_DEBUG)
+
+#endif // !defined(BOOST_SPIRIT_DEBUG_NODE_HPP)
+
diff --git a/boost/spirit/home/classic/debug/impl/parser_names.ipp b/boost/spirit/home/classic/debug/impl/parser_names.ipp
new file mode 100644
index 0000000000..5d75be2436
--- /dev/null
+++ b/boost/spirit/home/classic/debug/impl/parser_names.ipp
@@ -0,0 +1,555 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_PARSER_NAMES_IPP)
+#define BOOST_SPIRIT_PARSER_NAMES_IPP
+
+#if defined(BOOST_SPIRIT_DEBUG)
+
+#include <string>
+#include <iostream>
+#include <map>
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STRINGSTREAM
+#include <strstream>
+#define BOOST_SPIRIT_SSTREAM std::strstream
+std::string BOOST_SPIRIT_GETSTRING(std::strstream& ss)
+{
+ ss << ends;
+ std::string rval = ss.str();
+ ss.freeze(false);
+ return rval;
+}
+#else
+#include <sstream>
+#define BOOST_SPIRIT_GETSTRING(ss) ss.str()
+#define BOOST_SPIRIT_SSTREAM std::stringstream
+#endif
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+// from actions.hpp
+ template <typename ParserT, typename ActionT>
+ inline std::string
+ parser_name(action<ParserT, ActionT> const& p)
+ {
+ return std::string("action")
+ + std::string("[")
+ + parser_name(p.subject())
+ + std::string("]");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// from directives.hpp
+ template <typename ParserT>
+ inline std::string
+ parser_name(contiguous<ParserT> const& p)
+ {
+ return std::string("contiguous")
+ + std::string("[")
+ + parser_name(p.subject())
+ + std::string("]");
+ }
+
+ template <typename ParserT>
+ inline std::string
+ parser_name(inhibit_case<ParserT> const& p)
+ {
+ return std::string("inhibit_case")
+ + std::string("[")
+ + parser_name(p.subject())
+ + std::string("]");
+ }
+
+ template <typename A, typename B>
+ inline std::string
+ parser_name(longest_alternative<A, B> const& p)
+ {
+ return std::string("longest_alternative")
+ + std::string("[")
+ + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
+ + std::string("]");
+ }
+
+ template <typename A, typename B>
+ inline std::string
+ parser_name(shortest_alternative<A, B> const& p)
+ {
+ return std::string("shortest_alternative")
+ + std::string("[")
+ + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
+ + std::string("]");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// from numerics.hpp
+ template <typename T, int Radix, unsigned MinDigits, int MaxDigits>
+ inline std::string
+ parser_name(uint_parser<T, Radix, MinDigits, MaxDigits> const& p)
+ {
+ BOOST_SPIRIT_SSTREAM stream;
+ stream << Radix << ", " << MinDigits << ", " << MaxDigits;
+ return std::string("uint_parser<")
+ + BOOST_SPIRIT_GETSTRING(stream)
+ + std::string(">");
+ }
+
+ template <typename T, int Radix, unsigned MinDigits, int MaxDigits>
+ inline std::string
+ parser_name(int_parser<T, Radix, MinDigits, MaxDigits> const& p)
+ {
+ BOOST_SPIRIT_SSTREAM stream;
+ stream << Radix << ", " << MinDigits << ", " << MaxDigits;
+ return std::string("int_parser<")
+ + BOOST_SPIRIT_GETSTRING(stream)
+ + std::string(">");
+ }
+
+ template <typename T, typename RealPoliciesT>
+ inline std::string
+ parser_name(real_parser<T, RealPoliciesT> const& p)
+ {
+ return std::string("real_parser");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// from operators.hpp
+ template <typename A, typename B>
+ inline std::string
+ parser_name(sequence<A, B> const& p)
+ {
+ return std::string("sequence")
+ + std::string("[")
+ + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
+ + std::string("]");
+ }
+
+ template <typename A, typename B>
+ inline std::string
+ parser_name(sequential_or<A, B> const& p)
+ {
+ return std::string("sequential_or")
+ + std::string("[")
+ + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
+ + std::string("]");
+ }
+
+ template <typename A, typename B>
+ inline std::string
+ parser_name(alternative<A, B> const& p)
+ {
+ return std::string("alternative")
+ + std::string("[")
+ + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
+ + std::string("]");
+ }
+
+ template <typename A, typename B>
+ inline std::string
+ parser_name(intersection<A, B> const& p)
+ {
+ return std::string("intersection")
+ + std::string("[")
+ + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
+ + std::string("]");
+ }
+
+ template <typename A, typename B>
+ inline std::string
+ parser_name(difference<A, B> const& p)
+ {
+ return std::string("difference")
+ + std::string("[")
+ + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
+ + std::string("]");
+ }
+
+ template <typename A, typename B>
+ inline std::string
+ parser_name(exclusive_or<A, B> const& p)
+ {
+ return std::string("exclusive_or")
+ + std::string("[")
+ + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
+ + std::string("]");
+ }
+
+ template <typename S>
+ inline std::string
+ parser_name(optional<S> const& p)
+ {
+ return std::string("optional")
+ + std::string("[")
+ + parser_name(p.subject())
+ + std::string("]");
+ }
+
+ template <typename S>
+ inline std::string
+ parser_name(kleene_star<S> const& p)
+ {
+ return std::string("kleene_star")
+ + std::string("[")
+ + parser_name(p.subject())
+ + std::string("]");
+ }
+
+ template <typename S>
+ inline std::string
+ parser_name(positive<S> const& p)
+ {
+ return std::string("positive")
+ + std::string("[")
+ + parser_name(p.subject())
+ + std::string("]");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// from parser.hpp
+ template <typename DerivedT>
+ inline std::string
+ parser_name(parser<DerivedT> const& p)
+ {
+ return std::string("parser");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// from primitives.hpp
+ template <typename DerivedT>
+ inline std::string
+ parser_name(char_parser<DerivedT> const &p)
+ {
+ return std::string("char_parser");
+ }
+
+ template <typename CharT>
+ inline std::string
+ parser_name(chlit<CharT> const &p)
+ {
+ return std::string("chlit(\'")
+ + std::string(1, p.ch)
+ + std::string("\')");
+ }
+
+ template <typename CharT>
+ inline std::string
+ parser_name(range<CharT> const &p)
+ {
+ return std::string("range(")
+ + std::string(1, p.first) + std::string(", ") + std::string(1, p.last)
+ + std::string(")");
+ }
+
+ template <typename IteratorT>
+ inline std::string
+ parser_name(chseq<IteratorT> const &p)
+ {
+ return std::string("chseq(\"")
+ + std::string(p.first, p.last)
+ + std::string("\")");
+ }
+
+ template <typename IteratorT>
+ inline std::string
+ parser_name(strlit<IteratorT> const &p)
+ {
+ return std::string("strlit(\"")
+ + std::string(p.seq.first, p.seq.last)
+ + std::string("\")");
+ }
+
+ inline std::string
+ parser_name(nothing_parser const&)
+ {
+ return std::string("nothing");
+ }
+
+ inline std::string
+ parser_name(epsilon_parser const&)
+ {
+ return std::string("epsilon");
+ }
+
+ inline std::string
+ parser_name(anychar_parser const&)
+ {
+ return std::string("anychar");
+ }
+
+ inline std::string
+ parser_name(alnum_parser const&)
+ {
+ return std::string("alnum");
+ }
+
+ inline std::string
+ parser_name(alpha_parser const&)
+ {
+ return std::string("alpha");
+ }
+
+ inline std::string
+ parser_name(cntrl_parser const&)
+ {
+ return std::string("cntrl");
+ }
+
+ inline std::string
+ parser_name(digit_parser const&)
+ {
+ return std::string("digit");
+ }
+
+ inline std::string
+ parser_name(graph_parser const&)
+ {
+ return std::string("graph");
+ }
+
+ inline std::string
+ parser_name(lower_parser const&)
+ {
+ return std::string("lower");
+ }
+
+ inline std::string
+ parser_name(print_parser const&)
+ {
+ return std::string("print");
+ }
+
+ inline std::string
+ parser_name(punct_parser const&)
+ {
+ return std::string("punct");
+ }
+
+ inline std::string
+ parser_name(blank_parser const&)
+ {
+ return std::string("blank");
+ }
+
+ inline std::string
+ parser_name(space_parser const&)
+ {
+ return std::string("space");
+ }
+
+ inline std::string
+ parser_name(upper_parser const&)
+ {
+ return std::string("upper");
+ }
+
+ inline std::string
+ parser_name(xdigit_parser const&)
+ {
+ return std::string("xdigit");
+ }
+
+ inline std::string
+ parser_name(eol_parser const&)
+ {
+ return std::string("eol");
+ }
+
+ inline std::string
+ parser_name(end_parser const&)
+ {
+ return std::string("end");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// from rule.hpp
+ namespace impl {
+ struct node_registry
+ {
+ typedef std::pair<std::string, bool> rule_info;
+ typedef std::map<void const *, rule_info> rule_infos;
+
+ std::string find_node(void const *r)
+ {
+ rule_infos::const_iterator cit = infos.find(r);
+ if (cit != infos.end())
+ return (*cit).second.first;
+ return std::string("<unknown>");
+ }
+
+ bool trace_node(void const *r)
+ {
+ rule_infos::const_iterator cit = infos.find(r);
+ if (cit != infos.end())
+ return (*cit).second.second;
+ return BOOST_SPIRIT_DEBUG_TRACENODE;
+ }
+
+ bool register_node(void const *r, char const *name_to_register,
+ bool trace_node)
+ {
+ if (infos.find(r) != infos.end())
+ return false;
+
+ return infos.insert(rule_infos::value_type(r,
+ rule_info(std::string(name_to_register), trace_node))
+ ).second;
+ }
+
+ bool unregister_node(void const *r)
+ {
+ if (infos.find(r) == infos.end())
+ return false;
+ return (1 == infos.erase(r));
+ }
+
+ private:
+ rule_infos infos;
+ };
+
+ inline node_registry &
+ get_node_registry()
+ {
+ static node_registry node_infos;
+ return node_infos;
+ }
+ } // namespace impl
+
+ template<
+ typename DerivedT, typename EmbedT,
+ typename T0, typename T1, typename T2
+ >
+ inline std::string
+ parser_name(impl::rule_base<DerivedT, EmbedT, T0, T1, T2> const& p)
+ {
+ return std::string("rule_base")
+ + std::string("(")
+ + impl::get_node_registry().find_node(&p)
+ + std::string(")");
+ }
+
+ template<typename T0, typename T1, typename T2>
+ inline std::string
+ parser_name(rule<T0, T1, T2> const& p)
+ {
+ return std::string("rule")
+ + std::string("(")
+ + impl::get_node_registry().find_node(&p)
+ + std::string(")");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// from subrule.hpp
+ template <typename FirstT, typename RestT>
+ inline std::string
+ parser_name(subrule_list<FirstT, RestT> const &p)
+ {
+ return std::string("subrule_list")
+ + std::string("(")
+ + impl::get_node_registry().find_node(&p)
+ + std::string(")");
+ }
+
+ template <int ID, typename DefT, typename ContextT>
+ inline std::string
+ parser_name(subrule_parser<ID, DefT, ContextT> const &p)
+ {
+ return std::string("subrule_parser")
+ + std::string("(")
+ + impl::get_node_registry().find_node(&p)
+ + std::string(")");
+ }
+
+ template <int ID, typename ContextT>
+ inline std::string
+ parser_name(subrule<ID, ContextT> const &p)
+ {
+ BOOST_SPIRIT_SSTREAM stream;
+ stream << ID;
+ return std::string("subrule<")
+ + BOOST_SPIRIT_GETSTRING(stream)
+ + std::string(">(")
+ + impl::get_node_registry().find_node(&p)
+ + std::string(")");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// from grammar.hpp
+ template <typename DerivedT, typename ContextT>
+ inline std::string
+ parser_name(grammar<DerivedT, ContextT> const& p)
+ {
+ return std::string("grammar")
+ + std::string("(")
+ + impl::get_node_registry().find_node(&p)
+ + std::string(")");
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+// decide, if a node is to be traced or not
+ template<
+ typename DerivedT, typename EmbedT,
+ typename T0, typename T1, typename T2
+ >
+ inline bool
+ trace_parser(impl::rule_base<DerivedT, EmbedT, T0, T1, T2>
+ const& p)
+ {
+ return impl::get_node_registry().trace_node(&p);
+ }
+
+ template<typename T0, typename T1, typename T2>
+ inline bool
+ trace_parser(rule<T0, T1, T2> const& p)
+ {
+ return impl::get_node_registry().trace_node(&p);
+ }
+
+ template <typename DerivedT, typename ContextT>
+ inline bool
+ trace_parser(grammar<DerivedT, ContextT> const& p)
+ {
+ return impl::get_node_registry().trace_node(&p);
+ }
+
+ template <typename DerivedT, int N, typename ContextT>
+ inline bool
+ trace_parser(impl::entry_grammar<DerivedT, N, ContextT> const& p)
+ {
+ return impl::get_node_registry().trace_node(&p);
+ }
+
+ template <int ID, typename ContextT>
+ bool
+ trace_parser(subrule<ID, ContextT> const& p)
+ {
+ return impl::get_node_registry().trace_node(&p);
+ }
+
+ template <typename ParserT, typename ActorTupleT>
+ bool
+ trace_parser(init_closure_parser<ParserT, ActorTupleT> const& p)
+ {
+ return impl::get_node_registry().trace_node(&p);
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#undef BOOST_SPIRIT_SSTREAM
+#undef BOOST_SPIRIT_GETSTRING
+
+#endif // defined(BOOST_SPIRIT_DEBUG)
+
+#endif // !defined(BOOST_SPIRIT_PARSER_NAMES_IPP)
diff --git a/boost/spirit/home/classic/debug/minimal.hpp b/boost/spirit/home/classic/debug/minimal.hpp
new file mode 100644
index 0000000000..0cb42644aa
--- /dev/null
+++ b/boost/spirit/home/classic/debug/minimal.hpp
@@ -0,0 +1,81 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_MINIMAL_DEBUG_HPP)
+#define BOOST_SPIRIT_MINIMAL_DEBUG_HPP
+
+#if !defined(BOOST_SPIRIT_DEBUG_MAIN_HPP)
+#error "You must include boost/spirit/debug.hpp, not boost/spirit/debug/minimal.hpp"
+#endif
+///////////////////////////////////////////////////////////////////////////////
+//
+// Minimum debugging tools support
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_DEBUG_OUT)
+#define BOOST_SPIRIT_DEBUG_OUT std::cout
+#endif
+
+///////////////////////////////////////////////////////////////////////////
+//
+// BOOST_SPIRIT_DEBUG_FLAGS controls the level of diagnostics printed
+//
+///////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_DEBUG_FLAGS_NONE)
+#define BOOST_SPIRIT_DEBUG_FLAGS_NONE 0x0000 // no diagnostics at all
+#endif
+
+#if !defined(BOOST_SPIRIT_DEBUG_FLAGS_MAX)
+#define BOOST_SPIRIT_DEBUG_FLAGS_MAX 0xFFFF // print maximal diagnostics
+#endif
+
+#if !defined(BOOST_SPIRIT_DEBUG_FLAGS)
+#define BOOST_SPIRIT_DEBUG_FLAGS BOOST_SPIRIT_DEBUG_FLAGS_MAX
+#endif
+
+#if !defined(BOOST_SPIRIT_DEBUG_PRINT_SOME)
+#define BOOST_SPIRIT_DEBUG_PRINT_SOME 20
+#endif
+
+#if !defined(BOOST_SPIRIT_DEBUG_RULE)
+#define BOOST_SPIRIT_DEBUG_RULE(r)
+#endif // !defined(BOOST_SPIRIT_DEBUG_RULE)
+
+#if !defined(BOOST_SPIRIT_DEBUG_NODE)
+#define BOOST_SPIRIT_DEBUG_NODE(r)
+#endif // !defined(BOOST_SPIRIT_DEBUG_NODE)
+
+#if !defined(BOOST_SPIRIT_DEBUG_GRAMMAR)
+#define BOOST_SPIRIT_DEBUG_GRAMMAR(r)
+#endif // !defined(BOOST_SPIRIT_DEBUG_GRAMMAR)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE)
+#define BOOST_SPIRIT_DEBUG_TRACE_RULE(r, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE)
+#define BOOST_SPIRIT_DEBUG_TRACE_NODE(r, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR)
+#define BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR(r, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME)
+#define BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME(r, n, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME)
+#define BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME(r, n, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME)
+#define BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME(r, n, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME)
+
+#endif // !defined(BOOST_SPIRIT_MINIMAL_DEBUG_HPP)
diff --git a/boost/spirit/home/classic/debug/parser_names.hpp b/boost/spirit/home/classic/debug/parser_names.hpp
new file mode 100644
index 0000000000..edd17cc004
--- /dev/null
+++ b/boost/spirit/home/classic/debug/parser_names.hpp
@@ -0,0 +1,254 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_PARSER_NAMES_HPP)
+#define BOOST_SPIRIT_PARSER_NAMES_HPP
+
+#if defined(BOOST_SPIRIT_DEBUG)
+
+//////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Declaration of helper functions, which return the name of a concrete
+// parser instance. The functions are specialized on the parser types. The
+// functions declared in this file are for the predefined parser types from
+// the Spirit core library only, so additional functions might be provided as
+// needed.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// from actions.hpp
+ template <typename ParserT, typename ActionT>
+ std::string
+ parser_name(action<ParserT, ActionT> const& p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from directives.hpp
+ template <typename ParserT>
+ std::string
+ parser_name(contiguous<ParserT> const& p);
+
+ template <typename ParserT>
+ std::string
+ parser_name(inhibit_case<ParserT> const& p);
+
+ template <typename A, typename B>
+ std::string
+ parser_name(longest_alternative<A, B> const& p);
+
+ template <typename A, typename B>
+ std::string
+ parser_name(shortest_alternative<A, B> const& p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from grammar.hpp
+ template <typename DerivedT, typename ContextT>
+ std::string
+ parser_name(grammar<DerivedT, ContextT> const& p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from numerics.hpp
+ template <typename T, int Radix, unsigned MinDigits, int MaxDigits>
+ std::string
+ parser_name(uint_parser<T, Radix, MinDigits, MaxDigits> const& p);
+
+ template <typename T, int Radix, unsigned MinDigits, int MaxDigits>
+ std::string
+ parser_name(int_parser<T, Radix, MinDigits, MaxDigits> const& p);
+
+ template <typename T, typename RealPoliciesT>
+ std::string
+ parser_name(real_parser<T, RealPoliciesT> const& p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from operators.hpp
+ template <typename A, typename B>
+ std::string
+ parser_name(sequence<A, B> const& p);
+
+ template <typename A, typename B>
+ std::string
+ parser_name(sequential_or<A, B> const& p);
+
+ template <typename A, typename B>
+ std::string
+ parser_name(alternative<A, B> const& p);
+
+ template <typename A, typename B>
+ std::string
+ parser_name(intersection<A, B> const& p);
+
+ template <typename A, typename B>
+ std::string
+ parser_name(difference<A, B> const& p);
+
+ template <typename A, typename B>
+ std::string
+ parser_name(exclusive_or<A, B> const& p);
+
+ template <typename S>
+ std::string
+ parser_name(optional<S> const& p);
+
+ template <typename S>
+ std::string
+ parser_name(kleene_star<S> const& p);
+
+ template <typename S>
+ std::string
+ parser_name(positive<S> const& p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from parser.hpp
+ template <typename DerivedT>
+ std::string
+ parser_name(parser<DerivedT> const& p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from primitives.hpp
+ template <typename DerivedT>
+ std::string
+ parser_name(char_parser<DerivedT> const &p);
+
+ template <typename CharT>
+ std::string
+ parser_name(chlit<CharT> const &p);
+
+ template <typename CharT>
+ std::string
+ parser_name(range<CharT> const &p);
+
+ template <typename IteratorT>
+ std::string
+ parser_name(chseq<IteratorT> const &p);
+
+ template <typename IteratorT>
+ std::string
+ parser_name(strlit<IteratorT> const &p);
+
+ std::string
+ parser_name(nothing_parser const &p);
+
+ std::string
+ parser_name(epsilon_parser const &p);
+
+ std::string
+ parser_name(anychar_parser const &p);
+
+ std::string
+ parser_name(alnum_parser const &p);
+
+ std::string
+ parser_name(alpha_parser const &p);
+
+ std::string
+ parser_name(cntrl_parser const &p);
+
+ std::string
+ parser_name(digit_parser const &p);
+
+ std::string
+ parser_name(graph_parser const &p);
+
+ std::string
+ parser_name(lower_parser const &p);
+
+ std::string
+ parser_name(print_parser const &p);
+
+ std::string
+ parser_name(punct_parser const &p);
+
+ std::string
+ parser_name(blank_parser const &p);
+
+ std::string
+ parser_name(space_parser const &p);
+
+ std::string
+ parser_name(upper_parser const &p);
+
+ std::string
+ parser_name(xdigit_parser const &p);
+
+ std::string
+ parser_name(eol_parser const &p);
+
+ std::string
+ parser_name(end_parser const &p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from rule.hpp
+ template<typename T0, typename T1, typename T2>
+ std::string
+ parser_name(rule<T0, T1, T2> const& p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from subrule.hpp
+ template <typename FirstT, typename RestT>
+ std::string
+ parser_name(subrule_list<FirstT, RestT> const &p);
+
+ template <int ID, typename DefT, typename ContextT>
+ std::string
+ parser_name(subrule_parser<ID, DefT, ContextT> const &p);
+
+ template <int ID, typename ContextT>
+ std::string
+ parser_name(subrule<ID, ContextT> const &p);
+
+///////////////////////////////////////////////////////////////////////////////
+// from chset.hpp
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Decide, if a node is to be traced or not
+//
+///////////////////////////////////////////////////////////////////////////////
+ template<
+ typename DerivedT, typename EmbedT,
+ typename T0, typename T1, typename T2
+ >
+ bool
+ trace_parser(impl::rule_base<DerivedT, EmbedT, T0, T1, T2>
+ const& p);
+
+ template <typename DerivedT, typename ContextT>
+ bool
+ trace_parser(grammar<DerivedT, ContextT> const& p);
+
+ template <int ID, typename ContextT>
+ bool
+ trace_parser(subrule<ID, ContextT> const& p);
+
+ template <typename ParserT, typename ActorTupleT>
+ struct init_closure_parser;
+
+ template <typename ParserT, typename ActorTupleT>
+ bool
+ trace_parser(init_closure_parser<ParserT, ActorTupleT> const& p);
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+//////////////////////////////////
+#include <boost/spirit/home/classic/debug/impl/parser_names.ipp>
+
+#endif // defined(BOOST_SPIRIT_DEBUG)
+
+#endif // !defined(BOOST_SPIRIT_PARSER_NAMES_HPP)
diff --git a/boost/spirit/home/classic/debug/typeof.hpp b/boost/spirit/home/classic/debug/typeof.hpp
new file mode 100644
index 0000000000..c764d318b0
--- /dev/null
+++ b/boost/spirit/home/classic/debug/typeof.hpp
@@ -0,0 +1,37 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEBUG_TYPEOF_HPP)
+#define BOOST_SPIRIT_DEBUG_TYPEOF_HPP
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/typeof.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ // debug_node.hpp
+ template<typename ContextT> struct parser_context_linker;
+ template<typename ScannerT> struct scanner_context_linker;
+ template<typename ContextT> struct closure_context_linker;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+// debug_node.hpp
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::parser_context_linker,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::scanner_context_linker,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::closure_context_linker,1)
+
+#endif
+
diff --git a/boost/spirit/home/classic/dynamic.hpp b/boost/spirit/home/classic/dynamic.hpp
new file mode 100644
index 0000000000..41ed74f788
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic.hpp
@@ -0,0 +1,30 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+ Copyright (c) 2002-2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DYNAMIC_HPP
+#define BOOST_SPIRIT_DYNAMIC_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Master header for Spirit.Dynamic
+//
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/dynamic/if.hpp>
+#include <boost/spirit/home/classic/dynamic/for.hpp>
+#include <boost/spirit/home/classic/dynamic/while.hpp>
+#include <boost/spirit/home/classic/dynamic/lazy.hpp>
+#include <boost/spirit/home/classic/dynamic/stored_rule.hpp>
+#include <boost/spirit/home/classic/dynamic/rule_alias.hpp>
+#include <boost/spirit/home/classic/dynamic/select.hpp>
+#include <boost/spirit/home/classic/dynamic/switch.hpp>
+
+////////////////////////////////////////////////////////////////////////////////
+#endif // BOOST_SPIRIT_DYNAMIC_HPP
diff --git a/boost/spirit/home/classic/dynamic/for.hpp b/boost/spirit/home/classic/dynamic/for.hpp
new file mode 100644
index 0000000000..45edd6a968
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/for.hpp
@@ -0,0 +1,187 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_FOR_HPP
+#define BOOST_SPIRIT_FOR_HPP
+////////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/dynamic/impl/conditions.ipp>
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl
+ {
+
+ template <typename FuncT>
+ struct for_functor
+ {
+ typedef typename boost::call_traits<FuncT>::param_type param_t;
+
+ for_functor(param_t f) : func(f) {}
+ for_functor() {}
+ FuncT func;
+ };
+
+ template <typename InitF>
+ struct for_init_functor : for_functor<InitF>
+ {
+ typedef for_functor<InitF> base_t;
+ typedef typename base_t::param_t param_t;
+
+ for_init_functor(param_t f) : base_t(f) {}
+ for_init_functor() : base_t() {}
+ void init() const { /*return*/ this->func(); }
+ };
+
+ template <typename StepF>
+ struct for_step_functor : for_functor<StepF>
+ {
+ typedef for_functor<StepF> base_t;
+ typedef typename base_t::param_t param_t;
+
+ for_step_functor(param_t f) : base_t(f) {}
+ for_step_functor() : base_t() {}
+ void step() const { /*return*/ this->func(); }
+ };
+
+ //////////////////////////////////
+ // for_parser
+ template
+ <
+ typename InitF, typename CondT, typename StepF,
+ typename ParsableT
+ >
+ struct for_parser
+ : private for_init_functor<InitF>
+ , private for_step_functor<StepF>
+ , private condition_evaluator<typename as_parser<CondT>::type>
+ , public unary
+ <
+ typename as_parser<ParsableT>::type,
+ parser< for_parser<InitF, CondT, StepF, ParsableT> >
+ >
+ {
+ typedef for_parser<InitF, CondT, StepF, ParsableT> self_t;
+ typedef as_parser<CondT> cond_as_parser_t;
+ typedef typename cond_as_parser_t::type condition_t;
+ typedef condition_evaluator<condition_t> eval_t;
+ typedef as_parser<ParsableT> as_parser_t;
+ typedef typename as_parser_t::type parser_t;
+ typedef unary< parser_t, parser< self_t > > base_t;
+
+
+ //////////////////////////////
+ // constructor, saves init, condition and step functors
+ // for later use the parse member function
+ for_parser
+ (
+ InitF const &i, CondT const &c, StepF const &s,
+ ParsableT const &p
+ )
+ : for_init_functor<InitF>(i)
+ , for_step_functor<StepF>(s)
+ , eval_t(cond_as_parser_t::convert(c))
+ , base_t(as_parser_t::convert(p))
+ { }
+
+ for_parser()
+ : for_init_functor<InitF>()
+ , for_step_functor<StepF>()
+ , eval_t()
+ , base_t()
+ {}
+
+ //////////////////////////////
+ // parse member function
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const &scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type
+ result_t;
+ typedef typename parser_result<parser_t, ScannerT>::type
+ body_result_t;
+
+ typename ScannerT::iterator_t save(scan.first);
+
+ std::size_t length = 0;
+ int eval_length = 0;
+
+ this->init();
+ while ((eval_length = this->evaluate(scan))>=0)
+ {
+ length += eval_length;
+ body_result_t tmp(this->subject().parse(scan));
+ if (tmp)
+ {
+ length+=tmp.length();
+ }
+ else
+ {
+ return scan.no_match();
+ }
+ this->step();
+ }
+
+ BOOST_SPIRIT_CLASSIC_NS::nil_t attr;
+ return scan.create_match
+ (length, attr, save, scan.first);
+ }
+ };
+
+ //////////////////////////////////
+ // for_parser_gen generates takes the body parser in brackets
+ // and returns the for_parser
+ template <typename InitF, typename CondT, typename StepF>
+ struct for_parser_gen
+ {
+ for_parser_gen(InitF const &i, CondT const &c, StepF const &s)
+ : init(i)
+ , condition(c)
+ , step(s)
+ {}
+
+ template <typename ParsableT>
+ for_parser<InitF, CondT, StepF, ParsableT>
+ operator[](ParsableT const &p) const
+ {
+ return for_parser<InitF, CondT, StepF, ParsableT>
+ (init, condition, step, p);
+ }
+
+ InitF const &init;
+ CondT const &condition;
+ StepF const &step;
+ };
+ } // namespace impl
+
+ //////////////////////////////
+ // for_p, returns for-parser generator
+ // Usage: spirit::for_p(init-ftor, condition, step-ftor)[body]
+ template
+ <
+ typename InitF, typename ConditionT, typename StepF
+ >
+ impl::for_parser_gen<InitF, ConditionT, StepF>
+ for_p(InitF const &init_f, ConditionT const &condition, StepF const &step_f)
+ {
+ return impl::for_parser_gen<InitF, ConditionT, StepF>
+ (init_f, condition, step_f);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_FOR_HPP
diff --git a/boost/spirit/home/classic/dynamic/if.hpp b/boost/spirit/home/classic/dynamic/if.hpp
new file mode 100644
index 0000000000..b7fbb77120
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/if.hpp
@@ -0,0 +1,229 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+ Copyright (c) 2002-2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_IF_HPP
+#define BOOST_SPIRIT_IF_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/dynamic/impl/conditions.ipp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl {
+
+ //////////////////////////////////
+ // if-else-parser, holds two alternative parsers and a conditional functor
+ // that selects between them.
+ template <typename ParsableTrueT, typename ParsableFalseT, typename CondT>
+ struct if_else_parser
+ : public condition_evaluator<typename as_parser<CondT>::type>
+ , public binary
+ <
+ typename as_parser<ParsableTrueT>::type,
+ typename as_parser<ParsableFalseT>::type,
+ parser< if_else_parser<ParsableTrueT, ParsableFalseT, CondT> >
+ >
+ {
+ typedef if_else_parser<ParsableTrueT, ParsableFalseT, CondT> self_t;
+
+ typedef as_parser<ParsableTrueT> as_parser_true_t;
+ typedef as_parser<ParsableFalseT> as_parser_false_t;
+ typedef typename as_parser_true_t::type parser_true_t;
+ typedef typename as_parser_false_t::type parser_false_t;
+ typedef as_parser<CondT> cond_as_parser_t;
+ typedef typename cond_as_parser_t::type condition_t;
+
+ typedef binary<parser_true_t, parser_false_t, parser<self_t> > base_t;
+ typedef condition_evaluator<condition_t> eval_t;
+
+ if_else_parser
+ (
+ ParsableTrueT const& p_true,
+ ParsableFalseT const& p_false,
+ CondT const& cond_
+ )
+ : eval_t(cond_as_parser_t::convert(cond_))
+ , base_t
+ (
+ as_parser_true_t::convert(p_true),
+ as_parser_false_t::convert(p_false)
+ )
+ { }
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result
+ <parser_true_t, ScannerT>::type then_result_t;
+ typedef typename parser_result
+ <parser_false_t, ScannerT>::type else_result_t;
+
+ typename ScannerT::iterator_t const save(scan.first);
+
+ std::ptrdiff_t length = this->evaluate(scan);
+ if (length >= 0)
+ {
+ then_result_t then_result(this->left().parse(scan));
+ if (then_result)
+ {
+ length += then_result.length();
+ return scan.create_match(std::size_t(length), nil_t(), save, scan.first);
+ }
+ }
+ else
+ {
+ else_result_t else_result(this->right().parse(scan));
+ if (else_result)
+ {
+ length = else_result.length();
+ return scan.create_match(std::size_t(length), nil_t(), save, scan.first);
+ }
+ }
+ return scan.no_match();
+ }
+ };
+
+ //////////////////////////////////
+ // if-else-parser generator, takes the false-parser in brackets
+ // and returns the if-else-parser.
+ template <typename ParsableTrueT, typename CondT>
+ struct if_else_parser_gen
+ {
+ if_else_parser_gen(ParsableTrueT const& p_true_, CondT const& cond_)
+ : p_true(p_true_)
+ , cond(cond_) {}
+
+ template <typename ParsableFalseT>
+ if_else_parser
+ <
+ ParsableTrueT,
+ ParsableFalseT,
+ CondT
+ >
+ operator[](ParsableFalseT const& p_false) const
+ {
+ return if_else_parser<ParsableTrueT, ParsableFalseT, CondT>
+ (
+ p_true,
+ p_false,
+ cond
+ );
+ }
+
+ ParsableTrueT const &p_true;
+ CondT const &cond;
+ };
+
+ //////////////////////////////////
+ // if-parser, conditionally runs a parser is a functor condition is true.
+ // If the condition is fales, it fails the parse.
+ // It can optionally become an if-else-parser through the member else_p.
+ template <typename ParsableT, typename CondT>
+ struct if_parser
+ : public condition_evaluator<typename as_parser<CondT>::type>
+ , public unary
+ <
+ typename as_parser<ParsableT>::type,
+ parser<if_parser<ParsableT, CondT> > >
+ {
+ typedef if_parser<ParsableT, CondT> self_t;
+ typedef as_parser<ParsableT> as_parser_t;
+ typedef typename as_parser_t::type parser_t;
+
+ typedef as_parser<CondT> cond_as_parser_t;
+ typedef typename cond_as_parser_t::type condition_t;
+ typedef condition_evaluator<condition_t> eval_t;
+ typedef unary<parser_t, parser<self_t> > base_t;
+
+ if_parser(ParsableT const& p, CondT const& cond_)
+ : eval_t(cond_as_parser_t::convert(cond_))
+ , base_t(as_parser_t::convert(p))
+ , else_p(p, cond_)
+ {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<parser_t, ScannerT>::type t_result_t;
+ typename ScannerT::iterator_t const save(scan.first);
+
+ std::ptrdiff_t length = this->evaluate(scan);
+ if (length >= 0)
+ {
+ t_result_t then_result(this->subject().parse(scan));
+ if (then_result)
+ {
+ length += then_result.length();
+ return scan.create_match(std::size_t(length), nil_t(), save, scan.first);
+ }
+ return scan.no_match();
+ }
+ return scan.empty_match();
+ }
+
+ if_else_parser_gen<ParsableT, CondT> else_p;
+ };
+
+ //////////////////////////////////
+ // if-parser generator, takes the true-parser in brackets and returns the
+ // if-parser.
+ template <typename CondT>
+ struct if_parser_gen
+ {
+ if_parser_gen(CondT const& cond_) : cond(cond_) {}
+
+ template <typename ParsableT>
+ if_parser
+ <
+ ParsableT,
+ CondT
+ >
+ operator[](ParsableT const& subject) const
+ {
+ return if_parser<ParsableT, CondT>(subject, cond);
+ }
+
+ CondT const &cond;
+ };
+
+} // namespace impl
+
+//////////////////////////////////
+// if_p function, returns "if" parser generator
+
+template <typename CondT>
+impl::if_parser_gen<CondT>
+if_p(CondT const& cond)
+{
+ return impl::if_parser_gen<CondT>(cond);
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_IF_HPP
diff --git a/boost/spirit/home/classic/dynamic/impl/conditions.ipp b/boost/spirit/home/classic/dynamic/impl/conditions.ipp
new file mode 100644
index 0000000000..713958463c
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/impl/conditions.ipp
@@ -0,0 +1,104 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_CONDITIONS_IPP
+#define BOOST_SPIRIT_CONDITIONS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/meta/parser_traits.hpp>
+#include <boost/spirit/home/classic/core/composite/epsilon.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// condition evaluation
+//
+///////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////
+ // condition_parser_selector, decides which parser to use for a condition
+ // If the template argument is a parser then that parser is used.
+ // If the template argument is a functor then a condition parser using
+ // the functor is chosen
+
+ template <typename T> struct embed_t_accessor
+ {
+ typedef typename T::embed_t type;
+ };
+
+#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
+ template <> struct embed_t_accessor<int>
+ {
+ typedef int type;
+ };
+#endif
+
+ template <typename ConditionT>
+ struct condition_parser_selector
+ {
+ typedef
+ typename mpl::if_<
+ is_parser<ConditionT>,
+ ConditionT,
+ condition_parser<ConditionT>
+ >::type
+ type;
+
+ typedef typename embed_t_accessor<type>::type embed_t;
+ };
+
+ //////////////////////////////////
+ // condition_evaluator, uses a parser to check wether a condition is met
+ // takes a parser or a functor that can be evaluated in boolean context
+ // as template parameter.
+
+ // JDG 4-15-03 refactored
+ template <typename ConditionT>
+ struct condition_evaluator
+ {
+ typedef condition_parser_selector<ConditionT> selector_t;
+ typedef typename selector_t::type selected_t;
+ typedef typename selector_t::embed_t cond_embed_t;
+
+ typedef typename boost::call_traits<cond_embed_t>::param_type
+ param_t;
+
+ condition_evaluator(param_t s) : cond(s) {}
+
+ /////////////////////////////
+ // evaluate, checks wether condition is met
+ // returns length of a match or a negative number for no-match
+ template <typename ScannerT>
+ std::ptrdiff_t
+ evaluate(ScannerT const &scan) const
+ {
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename parser_result<selected_t, ScannerT>::type cres_t;
+ iterator_t save(scan.first);
+ cres_t result = cond.parse(scan);
+ if (!result) // reset the position if evaluation
+ scan.first = save; // fails.
+ return result.length();
+ }
+
+ cond_embed_t cond;
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+ } // namespace impl
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/dynamic/impl/select.ipp b/boost/spirit/home/classic/dynamic/impl/select.ipp
new file mode 100644
index 0000000000..531421079d
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/impl/select.ipp
@@ -0,0 +1,120 @@
+/*=============================================================================
+ Copyright (c) 2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_SELECT_IPP
+#define BOOST_SPIRIT_SELECT_IPP
+
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename ParserT>
+struct as_embedded_parser : public as_parser<ParserT>
+{
+ typedef typename as_parser<ParserT>::type::derived_t::embed_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+// no implementation here to catch unknown BehaviourT template arguments
+template <typename ResultT, typename BehaviourT>
+struct select_match_gen;
+
+// implementation for the select_default_no_fail behaviour
+template <typename ResultT>
+struct select_match_gen<ResultT, select_default_no_fail> {
+
+ template <typename ScannerT>
+ static ResultT
+ do_ (ScannerT const &scan)
+ {
+ return scan.create_match(0, -1, scan.first, scan.first);
+ }
+};
+
+// implementation for the select_default_fail behaviour
+template <typename ResultT>
+struct select_match_gen<ResultT, select_default_fail> {
+
+ template <typename ScannerT>
+ static ResultT
+ do_ (ScannerT const &scan)
+ {
+ return scan.no_match();
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <int N, typename ResultT, typename TupleT, typename BehaviourT>
+struct parse_tuple_element {
+
+ BOOST_STATIC_CONSTANT(int, index = (TupleT::length - N));
+
+ template <typename ScannerT>
+ static ResultT
+ do_(TupleT const &t, ScannerT const &scan)
+ {
+ typedef typename ::phoenix::tuple_element<index, TupleT>::type parser_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename parser_result<parser_t, ScannerT>::type result_t;
+
+ iterator_t save(scan.first);
+ result_t result(t[::phoenix::tuple_index<index>()].parse(scan));
+
+ if (result) {
+ return scan.create_match(result.length(), TupleT::length - N,
+ save, scan.first);
+ }
+ scan.first = save; // reset the input stream
+ return parse_tuple_element<N-1, ResultT, TupleT, BehaviourT>::
+ do_(t, scan);
+ }
+};
+
+template <typename ResultT, typename TupleT, typename BehaviourT>
+struct parse_tuple_element<1, ResultT, TupleT, BehaviourT> {
+
+ BOOST_STATIC_CONSTANT(int, index = (TupleT::length - 1));
+
+ template <typename ScannerT>
+ static ResultT
+ do_(TupleT const &t, ScannerT const &scan)
+ {
+ typedef typename ::phoenix::tuple_element<index, TupleT>::type parser_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename parser_result<parser_t, ScannerT>::type result_t;
+
+ iterator_t save(scan.first);
+ result_t result(t[::phoenix::tuple_index<index>()].parse(scan));
+
+ if (result) {
+ return scan.create_match(result.length(), TupleT::length - 1,
+ save, scan.first);
+ }
+ scan.first = save; // reset the input stream
+ return select_match_gen<ResultT, BehaviourT>::do_(scan);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace impl
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_SELECT_IPP
diff --git a/boost/spirit/home/classic/dynamic/impl/switch.ipp b/boost/spirit/home/classic/dynamic/impl/switch.ipp
new file mode 100644
index 0000000000..ffaa3ebb8b
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/impl/switch.ipp
@@ -0,0 +1,574 @@
+/*=============================================================================
+ Copyright (c) 2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_SWITCH_IPP
+#define BOOST_SPIRIT_SWITCH_IPP
+
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/inc.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/repeat_from_to.hpp>
+
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+// forward declaration
+template <int N, typename ParserT, bool IsDefault> struct case_parser;
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+// parse helper functions
+template <typename ParserT, typename ScannerT>
+inline typename parser_result<ParserT, ScannerT>::type
+delegate_parse(ParserT const &p, ScannerT const &scan,
+ typename ScannerT::iterator_t const save)
+{
+ typedef typename parser_result<ParserT, ScannerT>::type result_t;
+
+ result_t result (p.subject().parse(scan));
+ if (!result)
+ scan.first = save;
+ return result;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// General default case handling (no default_p case branch given).
+// First try to match the current parser node (if the condition value is
+// matched) and, if that fails, return a no_match
+template <int N, bool IsDefault, bool HasDefault>
+struct default_delegate_parse {
+
+ template <
+ typename ParserT, typename DefaultT,
+ typename ValueT, typename ScannerT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse (ValueT const &value, ParserT const &p, DefaultT const &,
+ ScannerT const &scan, typename ScannerT::iterator_t const save)
+ {
+ if (value == N)
+ return delegate_parse(p, scan, save);
+ return scan.no_match();
+ }
+};
+
+// The current case parser node is the default parser.
+// Ignore the given case value and try to match the given default parser.
+template <int N, bool HasDefault>
+struct default_delegate_parse<N, true, HasDefault> {
+
+ template <
+ typename ParserT, typename DefaultT,
+ typename ValueT, typename ScannerT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse (ValueT const& /*value*/, ParserT const &, DefaultT const &d,
+ ScannerT const &scan, typename ScannerT::iterator_t const save)
+ {
+ // Since there is a default_p case branch defined, the corresponding
+ // parser shouldn't be the nothing_parser
+ BOOST_STATIC_ASSERT((!boost::is_same<DefaultT, nothing_parser>::value));
+ return delegate_parse(d, scan, save);
+ }
+};
+
+// The current case parser node is not the default parser, but there is a
+// default_p branch given inside the switch_p parser.
+// First try to match the current parser node (if the condition value is
+// matched) and, if that fails, match the given default_p parser.
+template <int N>
+struct default_delegate_parse<N, false, true> {
+
+ template <
+ typename ParserT, typename DefaultT,
+ typename ValueT, typename ScannerT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse (ValueT const &value, ParserT const &p, DefaultT const &d,
+ ScannerT const &scan, typename ScannerT::iterator_t const save)
+ {
+ // Since there is a default_p case branch defined, the corresponding
+ // parser shouldn't be the nothing_parser
+ BOOST_STATIC_ASSERT((!boost::is_same<DefaultT, nothing_parser>::value));
+ if (value == N)
+ return delegate_parse(p, scan, save);
+
+ return delegate_parse(d, scan, save);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// Look through the case parser chain to test, if there is a default case
+// branch defined (returned by 'value').
+template <typename CaseT, bool IsSimple = CaseT::is_simple>
+struct default_case;
+
+////////////////////////////////////////
+template <typename ResultT, bool IsDefault>
+struct get_default_parser {
+
+ template <typename ParserT>
+ static ResultT
+ get(parser<ParserT> const &p)
+ {
+ return default_case<typename ParserT::derived_t::left_t>::
+ get(p.derived().left());
+ }
+};
+
+template <typename ResultT>
+struct get_default_parser<ResultT, true> {
+
+ template <typename ParserT>
+ static ResultT
+ get(parser<ParserT> const &p) { return p.derived().right(); }
+};
+
+////////////////////////////////////////
+template <typename CaseT, bool IsSimple>
+struct default_case {
+
+ // The 'value' constant is true, if the current case_parser or one of its
+ // left siblings is a default_p generated case_parser.
+ BOOST_STATIC_CONSTANT(bool, value =
+ (CaseT::is_default || default_case<typename CaseT::left_t>::value));
+
+ // The 'is_epsilon' constant is true, if the current case_parser or one of
+ // its left siblings is a default_p generated parser with an attached
+ // epsilon_p (this is generated by the plain default_p).
+ BOOST_STATIC_CONSTANT(bool, is_epsilon = (
+ (CaseT::is_default && CaseT::is_epsilon) ||
+ default_case<typename CaseT::left_t>::is_epsilon
+ ));
+
+ // The computed 'type' represents the type of the default case branch
+ // parser (if there is one) or nothing_parser (if there isn't any default
+ // case branch).
+ typedef typename boost::mpl::if_c<
+ CaseT::is_default, typename CaseT::right_embed_t,
+ typename default_case<typename CaseT::left_t>::type
+ >::type type;
+
+ // The get function returns the parser attached to the default case branch
+ // (if there is one) or an instance of a nothing_parser (if there isn't
+ // any default case branch).
+ template <typename ParserT>
+ static type
+ get(parser<ParserT> const &p)
+ { return get_default_parser<type, CaseT::is_default>::get(p); }
+};
+
+////////////////////////////////////////
+template <typename ResultT, bool IsDefault>
+struct get_default_parser_simple {
+
+ template <typename ParserT>
+ static ResultT
+ get(parser<ParserT> const &p) { return p.derived(); }
+};
+
+template <typename ResultT>
+struct get_default_parser_simple<ResultT, false> {
+
+ template <typename ParserT>
+ static nothing_parser
+ get(parser<ParserT> const &) { return nothing_p; }
+};
+
+////////////////////////////////////////
+// Specialization of the default_case template for the last (leftmost) element
+// of the case parser chain.
+template <typename CaseT>
+struct default_case<CaseT, true> {
+
+ // The 'value' and 'is_epsilon' constant, the 'type' type and the function
+ // 'get' are described above.
+
+ BOOST_STATIC_CONSTANT(bool, value = CaseT::is_default);
+ BOOST_STATIC_CONSTANT(bool, is_epsilon = (
+ CaseT::is_default && CaseT::is_epsilon
+ ));
+
+ typedef typename boost::mpl::if_c<
+ CaseT::is_default, CaseT, nothing_parser
+ >::type type;
+
+ template <typename ParserT>
+ static type
+ get(parser<ParserT> const &p)
+ { return get_default_parser_simple<type, value>::get(p); }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// The case_chain template calculates recursivly the depth of the left
+// subchain of the given case branch node.
+template <typename CaseT, bool IsSimple = CaseT::is_simple>
+struct case_chain {
+
+ BOOST_STATIC_CONSTANT(int, depth = (
+ case_chain<typename CaseT::left_t>::depth + 1
+ ));
+};
+
+template <typename CaseT>
+struct case_chain<CaseT, true> {
+
+ BOOST_STATIC_CONSTANT(int, depth = 0);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// The chain_parser template is used to extract the type and the instance of
+// a left or a right parser, burried arbitrary deep inside the case parser
+// chain.
+template <int Depth, typename CaseT>
+struct chain_parser {
+
+ typedef typename CaseT::left_t our_left_t;
+
+ typedef typename chain_parser<Depth-1, our_left_t>::left_t left_t;
+ typedef typename chain_parser<Depth-1, our_left_t>::right_t right_t;
+
+ static left_t
+ left(CaseT const &p)
+ { return chain_parser<Depth-1, our_left_t>::left(p.left()); }
+
+ static right_t
+ right(CaseT const &p)
+ { return chain_parser<Depth-1, our_left_t>::right(p.left()); }
+};
+
+template <typename CaseT>
+struct chain_parser<1, CaseT> {
+
+ typedef typename CaseT::left_t left_t;
+ typedef typename CaseT::right_t right_t;
+
+ static left_t left(CaseT const &p) { return p.left(); }
+ static right_t right(CaseT const &p) { return p.right(); }
+};
+
+template <typename CaseT>
+struct chain_parser<0, CaseT>; // shouldn't be instantiated
+
+///////////////////////////////////////////////////////////////////////////////
+// Type computing meta function for calculating the type of the return value
+// of the used conditional switch expression
+template <typename TargetT, typename ScannerT>
+struct condition_result {
+
+ typedef typename TargetT::template result<ScannerT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename LeftT, typename RightT, bool IsDefault>
+struct compound_case_parser
+: public binary<LeftT, RightT,
+ parser<compound_case_parser<LeftT, RightT, IsDefault> > >
+{
+ typedef compound_case_parser<LeftT, RightT, IsDefault> self_t;
+ typedef binary_parser_category parser_category_t;
+ typedef binary<LeftT, RightT, parser<self_t> > base_t;
+
+ BOOST_STATIC_CONSTANT(int, value = RightT::value);
+ BOOST_STATIC_CONSTANT(bool, is_default = IsDefault);
+ BOOST_STATIC_CONSTANT(bool, is_simple = false);
+ BOOST_STATIC_CONSTANT(bool, is_epsilon = (
+ is_default &&
+ boost::is_same<typename RightT::subject_t, epsilon_parser>::value
+ ));
+
+ compound_case_parser(parser<LeftT> const &lhs, parser<RightT> const &rhs)
+ : base_t(lhs.derived(), rhs.derived())
+ {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ template <typename ScannerT, typename CondT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan, CondT const &cond) const;
+
+ template <int N1, typename ParserT1, bool IsDefault1>
+ compound_case_parser<
+ self_t, case_parser<N1, ParserT1, IsDefault1>, IsDefault1
+ >
+ operator, (case_parser<N1, ParserT1, IsDefault1> const &p) const
+ {
+ // If the following compile time assertion fires, you've probably used
+ // more than one default_p case inside the switch_p parser construct.
+ BOOST_STATIC_ASSERT(!default_case<self_t>::value || !IsDefault1);
+
+ // If this compile time assertion fires, you've probably want to use
+ // more case_p/default_p case branches, than possible.
+ BOOST_STATIC_ASSERT(
+ case_chain<self_t>::depth < BOOST_SPIRIT_SWITCH_CASE_LIMIT
+ );
+
+ typedef case_parser<N1, ParserT1, IsDefault1> right_t;
+ return compound_case_parser<self_t, right_t, IsDefault1>(*this, p);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// The parse_switch::do_ functions dispatch to the correct parser, which is
+// selected through the given conditional switch value.
+template <int Value, int Depth, bool IsDefault>
+struct parse_switch;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The following generates a couple of parse_switch template specializations
+// with an increasing number of handled case branches (for 1..N).
+//
+// template <int Value, bool IsDefault>
+// struct parse_switch<Value, N, IsDefault> {
+//
+// template <typename ParserT, typename ScannerT>
+// static typename parser_result<ParserT, ScannerT>::type
+// do_(ParserT const &p, ScannerT const &scan, long cond_value,
+// typename ScannerT::iterator_t const &save)
+// {
+// typedef ParserT left_t0;
+// typedef typename left_t0::left left_t1;
+// ...
+//
+// switch (cond_value) {
+// case left_tN::value:
+// return delegate_parse(chain_parser<
+// case_chain<ParserT>::depth, ParserT
+// >::left(p), scan, save);
+// ...
+// case left_t1::value:
+// return delegate_parse(chain_parser<
+// 1, left_t1
+// >::right(p.left()), scan, save);
+//
+// case left_t0::value:
+// default:
+// typedef default_case<ParserT> default_t;
+// typedef default_delegate_parse<
+// Value, IsDefault, default_t::value>
+// default_parse_t;
+//
+// return default_parse_t::parse(cond_value, p.right(),
+// default_t::get(p), scan, save);
+// }
+// }
+// };
+//
+///////////////////////////////////////////////////////////////////////////////
+#define BOOST_SPIRIT_PARSE_SWITCH_TYPEDEFS(z, N, _) \
+ typedef typename BOOST_PP_CAT(left_t, N)::left_t \
+ BOOST_PP_CAT(left_t, BOOST_PP_INC(N)); \
+ /**/
+
+#define BOOST_SPIRIT_PARSE_SWITCH_CASES(z, N, _) \
+ case (long)(BOOST_PP_CAT(left_t, N)::value): \
+ return delegate_parse(chain_parser<N, left_t1>::right(p.left()), \
+ scan, save); \
+ /**/
+
+#define BOOST_SPIRIT_PARSE_SWITCHES(z, N, _) \
+ template <int Value, bool IsDefault> \
+ struct parse_switch<Value, BOOST_PP_INC(N), IsDefault> { \
+ \
+ template <typename ParserT, typename ScannerT> \
+ static typename parser_result<ParserT, ScannerT>::type \
+ do_(ParserT const &p, ScannerT const &scan, long cond_value, \
+ typename ScannerT::iterator_t const &save) \
+ { \
+ typedef ParserT left_t0; \
+ BOOST_PP_REPEAT_FROM_TO_ ## z(0, BOOST_PP_INC(N), \
+ BOOST_SPIRIT_PARSE_SWITCH_TYPEDEFS, _) \
+ \
+ switch (cond_value) { \
+ case (long)(BOOST_PP_CAT(left_t, BOOST_PP_INC(N))::value): \
+ return delegate_parse( \
+ chain_parser< \
+ case_chain<ParserT>::depth, ParserT \
+ >::left(p), scan, save); \
+ \
+ BOOST_PP_REPEAT_FROM_TO_ ## z(1, BOOST_PP_INC(N), \
+ BOOST_SPIRIT_PARSE_SWITCH_CASES, _) \
+ \
+ case (long)(left_t0::value): \
+ default: \
+ typedef default_case<ParserT> default_t; \
+ typedef \
+ default_delegate_parse<Value, IsDefault, default_t::value> \
+ default_parse_t; \
+ \
+ return default_parse_t::parse(cond_value, p.right(), \
+ default_t::get(p), scan, save); \
+ } \
+ } \
+ }; \
+ /**/
+
+BOOST_PP_REPEAT(BOOST_PP_DEC(BOOST_SPIRIT_SWITCH_CASE_LIMIT),
+ BOOST_SPIRIT_PARSE_SWITCHES, _)
+
+#undef BOOST_SPIRIT_PARSE_SWITCH_TYPEDEFS
+#undef BOOST_SPIRIT_PARSE_SWITCH_CASES
+#undef BOOST_SPIRIT_PARSE_SWITCHES
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename LeftT, typename RightT, bool IsDefault>
+template <typename ScannerT, typename CondT>
+inline typename parser_result<
+ compound_case_parser<LeftT, RightT, IsDefault>, ScannerT
+>::type
+compound_case_parser<LeftT, RightT, IsDefault>::
+ parse(ScannerT const& scan, CondT const &cond) const
+{
+ scan.at_end(); // allow skipper to take effect
+ return parse_switch<value, case_chain<self_t>::depth, is_default>::
+ do_(*this, scan, cond(scan), scan.first);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// The switch condition is to be evaluated from a parser result value.
+template <typename ParserT>
+struct cond_functor {
+
+ typedef cond_functor<ParserT> self_t;
+
+ cond_functor(ParserT const &p_)
+ : p(p_)
+ {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type::attr_t type;
+ };
+
+ template <typename ScannerT>
+ typename condition_result<self_t, ScannerT>::type
+ operator()(ScannerT const &scan) const
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type result_t;
+ typedef typename result_t::attr_t attr_t;
+
+ result_t result(p.parse(scan));
+ return !result ? attr_t() : result.value();
+ }
+
+ typename ParserT::embed_t p;
+};
+
+template <typename ParserT>
+struct make_cond_functor {
+
+ typedef as_parser<ParserT> as_parser_t;
+
+ static cond_functor<typename as_parser_t::type>
+ do_(ParserT const &cond)
+ {
+ return cond_functor<typename as_parser_t::type>(
+ as_parser_t::convert(cond));
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// The switch condition is to be evaluated from a phoenix actor
+template <typename ActorT>
+struct cond_actor {
+
+ typedef cond_actor<ActorT> self_t;
+
+ cond_actor(ActorT const &actor_)
+ : actor(actor_)
+ {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename ::phoenix::actor_result<ActorT, ::phoenix::tuple<> >::type
+ type;
+ };
+
+ template <typename ScannerT>
+ typename condition_result<self_t, ScannerT>::type
+ operator()(ScannerT const& /*scan*/) const
+ {
+ return actor();
+ }
+
+ ActorT const &actor;
+};
+
+template <typename ActorT>
+struct make_cond_functor< ::phoenix::actor<ActorT> > {
+
+ static cond_actor< ::phoenix::actor<ActorT> >
+ do_(::phoenix::actor<ActorT> const &actor)
+ {
+ return cond_actor< ::phoenix::actor<ActorT> >(actor);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// The switch condition is to be taken directly from the input stream
+struct get_next_token_cond {
+
+ typedef get_next_token_cond self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename ScannerT::value_t type;
+ };
+
+ template <typename ScannerT>
+ typename condition_result<self_t, ScannerT>::type
+ operator()(ScannerT const &scan) const
+ {
+ typename ScannerT::value_t val(*scan);
+ ++scan.first;
+ return val;
+ }
+};
+
+template <>
+struct make_cond_functor<get_next_token_cond> {
+
+ static get_next_token_cond
+ do_(get_next_token_cond const &cond)
+ {
+ return cond;
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace impl
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_SWITCH_IPP
diff --git a/boost/spirit/home/classic/dynamic/lazy.hpp b/boost/spirit/home/classic/dynamic/lazy.hpp
new file mode 100644
index 0000000000..5bc9df3af9
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/lazy.hpp
@@ -0,0 +1,66 @@
+/*=============================================================================
+ Copyright (c) 2003 Joel de Guzman
+ Copyright (c) 2003 Vaclav Vesely
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_LAZY_HPP
+#define BOOST_SPIRIT_LAZY_HPP
+
+////////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // lazy_parser, holds phoenix actor which returns a spirit parser.
+ //
+ ////////////////////////////////////////////////////////////////////////////
+
+ template<class ActorT>
+ struct lazy_parser : parser<lazy_parser<ActorT> >
+ {
+ typedef lazy_parser<ActorT> self_t;
+ typedef typename ::phoenix::actor_result<
+ ActorT, ::phoenix::tuple<> >::plain_type actor_result_t;
+
+ template<typename ScannerT>
+ struct result
+ {
+ typedef typename
+ parser_result<actor_result_t, ScannerT>::type
+ type;
+ };
+
+ lazy_parser(ActorT const& actor_)
+ : actor(actor_) {}
+
+ template<typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ { return actor().parse(scan); }
+
+ ActorT actor;
+ };
+
+ //////////////////////////////
+ // lazy_p, returns lazy_parser
+ // Usage: lazy_p(actor)
+ template<class ActorT>
+ lazy_parser<ActorT> lazy_p(ActorT const& actor)
+ { return lazy_parser<ActorT>(actor); }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_LAZY_HPP
diff --git a/boost/spirit/home/classic/dynamic/rule_alias.hpp b/boost/spirit/home/classic/dynamic/rule_alias.hpp
new file mode 100644
index 0000000000..de291c916d
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/rule_alias.hpp
@@ -0,0 +1,76 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_RULE_ALIAS_HPP)
+#define BOOST_SPIRIT_RULE_ALIAS_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // rule_alias class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ParserT>
+ class rule_alias :
+ public parser<rule_alias<ParserT> >
+ {
+ public:
+
+ typedef rule_alias<ParserT> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ rule_alias()
+ : ptr(0) {}
+
+ rule_alias(ParserT const& p)
+ : ptr(&p) {}
+
+ rule_alias&
+ operator=(ParserT const& p)
+ {
+ ptr = &p;
+ return *this;
+ }
+
+ template <typename ScannerT>
+ typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ if (ptr)
+ return ptr->parse(scan);
+ else
+ return scan.no_match();
+ }
+
+ ParserT const&
+ get() const
+ {
+ BOOST_ASSERT(ptr != 0);
+ return *ptr;
+ }
+
+ private:
+
+ ParserT const* ptr; // hold it by pointer
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/dynamic/select.hpp b/boost/spirit/home/classic/dynamic/select.hpp
new file mode 100644
index 0000000000..865b27c5e9
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/select.hpp
@@ -0,0 +1,245 @@
+/*=============================================================================
+ Copyright (c) 2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SELECT_HPP
+#define BOOST_SPIRIT_SELECT_HPP
+
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/enum.hpp>
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/enum_params_with_defaults.hpp>
+#include <boost/preprocessor/inc.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Spirit predefined maximum number of possible embedded select_p parsers.
+// It should NOT be greater than PHOENIX_LIMIT!
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_SELECT_LIMIT)
+#define BOOST_SPIRIT_SELECT_LIMIT PHOENIX_LIMIT
+#endif // !defined(BOOST_SPIRIT_SELECT_LIMIT)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// ensure BOOST_SPIRIT_SELECT_LIMIT <= PHOENIX_LIMIT and
+// BOOST_SPIRIT_SELECT_LIMIT > 0
+// BOOST_SPIRIT_SELECT_LIMIT <= 15
+//
+// [Pushed this down a little to make CW happy with BOOST_STATIC_ASSERT]
+// [Otherwise, it complains: 'boost_static_assert_test_42' redefined]
+//
+///////////////////////////////////////////////////////////////////////////////
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_SELECT_LIMIT <= PHOENIX_LIMIT);
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_SELECT_LIMIT > 0);
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_SELECT_LIMIT <= 15);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Calculate the required amount of tuple members rounded up to the nearest
+// integer dividable by 3
+//
+///////////////////////////////////////////////////////////////////////////////
+#if BOOST_SPIRIT_SELECT_LIMIT > 12
+#define BOOST_SPIRIT_SELECT_LIMIT_A 15
+#elif BOOST_SPIRIT_SELECT_LIMIT > 9
+#define BOOST_SPIRIT_SELECT_LIMIT_A 12
+#elif BOOST_SPIRIT_SELECT_LIMIT > 6
+#define BOOST_SPIRIT_SELECT_LIMIT_A 9
+#elif BOOST_SPIRIT_SELECT_LIMIT > 3
+#define BOOST_SPIRIT_SELECT_LIMIT_A 6
+#else
+#define BOOST_SPIRIT_SELECT_LIMIT_A 3
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The select_default_no_fail and select_default_fail structs are used to
+// distinguish two different behaviours for the select_parser in case that not
+// any of the given sub-parsers match.
+//
+// If the select_parser is used with the select_default_no_fail behaviour,
+// then in case of no matching sub-parser the whole select_parser returns an
+// empty match and the value -1.
+//
+// If the select_parser is used with the select_default_fail behaviour, then
+// in case of no matching sub-parser the whole select_parser fails to match at
+// all.
+//
+///////////////////////////////////////////////////////////////////////////////
+struct select_default_no_fail {};
+struct select_default_fail {};
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/dynamic/impl/select.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename TupleT, typename BehaviourT, typename T>
+struct select_parser
+: public parser<select_parser<TupleT, BehaviourT, T> >
+{
+ typedef select_parser<TupleT, BehaviourT, T> self_t;
+
+ select_parser(TupleT const &t_)
+ : t(t_)
+ {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, T>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+
+ if (!scan.at_end()) {
+ return impl::parse_tuple_element<
+ TupleT::length, result_t, TupleT, BehaviourT>::do_(t, scan);
+ }
+ return impl::select_match_gen<result_t, BehaviourT>::do_(scan);
+ }
+
+ TupleT const t;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename BehaviourT, typename T = int>
+struct select_parser_gen {
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // This generates different select_parser_gen::operator()() functions with
+ // an increasing number of parser parameters:
+ //
+ // template <typename ParserT0, ...>
+ // select_parser<
+ // ::phoenix::tuple<
+ // typename impl::as_embedded_parser<ParserT0>::type,
+ // ...
+ // >,
+ // BehaviourT,
+ // T
+ // >
+ // operator()(ParserT0 const &p0, ...) const
+ // {
+ // typedef impl::as_embedded_parser<ParserT0> parser_t0;
+ // ...
+ //
+ // typedef ::phoenix::tuple<
+ // parser_t0::type,
+ // ...
+ // > tuple_t;
+ // typedef select_parser<tuple_t, BehaviourT, T> result_t;
+ //
+ // return result_t(tuple_t(
+ // parser_t0::convert(p0),
+ // ...
+ // ));
+ // }
+ //
+ // The number of generated functions depends on the maximum tuple member
+ // limit defined by the PHOENIX_LIMIT pp constant.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #define BOOST_SPIRIT_SELECT_EMBEDDED(z, N, _) \
+ typename impl::as_embedded_parser<BOOST_PP_CAT(ParserT, N)>::type \
+ /**/
+ #define BOOST_SPIRIT_SELECT_EMBEDDED_TYPEDEF(z, N, _) \
+ typedef impl::as_embedded_parser<BOOST_PP_CAT(ParserT, N)> \
+ BOOST_PP_CAT(parser_t, N); \
+ /**/
+ #define BOOST_SPIRIT_SELECT_CONVERT(z, N, _) \
+ BOOST_PP_CAT(parser_t, N)::convert(BOOST_PP_CAT(p, N)) \
+ /**/
+
+ #define BOOST_SPIRIT_SELECT_PARSER(z, N, _) \
+ template < \
+ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), typename ParserT) \
+ > \
+ select_parser< \
+ ::phoenix::tuple< \
+ BOOST_PP_ENUM_ ## z(BOOST_PP_INC(N), \
+ BOOST_SPIRIT_SELECT_EMBEDDED, _) \
+ >, \
+ BehaviourT, \
+ T \
+ > \
+ operator()( \
+ BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_INC(N), \
+ ParserT, const &p) \
+ ) const \
+ { \
+ BOOST_PP_REPEAT_ ## z(BOOST_PP_INC(N), \
+ BOOST_SPIRIT_SELECT_EMBEDDED_TYPEDEF, _) \
+ \
+ typedef ::phoenix::tuple< \
+ BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_INC(N), \
+ typename parser_t, ::type BOOST_PP_INTERCEPT) \
+ > tuple_t; \
+ typedef select_parser<tuple_t, BehaviourT, T> result_t; \
+ \
+ return result_t(tuple_t( \
+ BOOST_PP_ENUM_ ## z(BOOST_PP_INC(N), \
+ BOOST_SPIRIT_SELECT_CONVERT, _) \
+ )); \
+ } \
+ /**/
+
+ BOOST_PP_REPEAT(BOOST_SPIRIT_SELECT_LIMIT_A,
+ BOOST_SPIRIT_SELECT_PARSER, _)
+
+ #undef BOOST_SPIRIT_SELECT_PARSER
+ #undef BOOST_SPIRIT_SELECT_CONVERT
+ #undef BOOST_SPIRIT_SELECT_EMBEDDED_TYPEDEF
+ #undef BOOST_SPIRIT_SELECT_EMBEDDED
+ ///////////////////////////////////////////////////////////////////////////
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Predefined parser generator helper objects
+//
+///////////////////////////////////////////////////////////////////////////////
+select_parser_gen<select_default_no_fail> const select_p =
+ select_parser_gen<select_default_no_fail>();
+
+select_parser_gen<select_default_fail> const select_fail_p =
+ select_parser_gen<select_default_fail>();
+
+#undef BOOST_SPIRIT_SELECT_LIMIT_A
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_SELECT_HPP
diff --git a/boost/spirit/home/classic/dynamic/stored_rule.hpp b/boost/spirit/home/classic/dynamic/stored_rule.hpp
new file mode 100644
index 0000000000..5661ef8855
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/stored_rule.hpp
@@ -0,0 +1,127 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_STORED_RULE_HPP)
+#define BOOST_SPIRIT_STORED_RULE_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/impl/rule.ipp>
+#include <boost/spirit/home/classic/dynamic/rule_alias.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <boost/spirit/home/classic/dynamic/stored_rule_fwd.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // stored_rule class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T0
+ , typename T1
+ , typename T2
+ , bool EmbedByValue
+ >
+ class stored_rule
+ : public impl::rule_base<
+ stored_rule<T0, T1, T2, EmbedByValue>
+ , typename mpl::if_c<
+ EmbedByValue
+ , stored_rule<T0, T1, T2, true>
+ , stored_rule<T0, T1, T2> const&>::type
+ , T0, T1, T2>
+ {
+ public:
+
+ typedef stored_rule<T0, T1, T2, EmbedByValue> self_t;
+ typedef impl::rule_base<
+ self_t
+ , typename mpl::if_c<
+ EmbedByValue
+ , stored_rule<T0, T1, T2, true>
+ , self_t const&>::type
+ , T0, T1, T2>
+ base_t;
+
+ typedef typename base_t::scanner_t scanner_t;
+ typedef typename base_t::attr_t attr_t;
+ typedef impl::abstract_parser<scanner_t, attr_t> abstract_parser_t;
+ typedef rule_alias<self_t> alias_t;
+
+ stored_rule() : ptr() {}
+ ~stored_rule() {}
+
+ stored_rule(stored_rule const& r)
+ : ptr(r.ptr) {}
+
+ template <typename ParserT>
+ stored_rule(ParserT const& p)
+ : ptr(new impl::concrete_parser<ParserT, scanner_t, attr_t>(p)) {}
+
+ template <typename ParserT>
+ stored_rule& operator=(ParserT const& p)
+ {
+ ptr.reset(new impl::concrete_parser<ParserT, scanner_t, attr_t>(p));
+ return *this;
+ }
+
+ stored_rule& operator=(stored_rule const& r)
+ {
+ // If this is placed above the templatized assignment
+ // operator, VC6 incorrectly complains ambiguity with
+ // r1 = r2, where r1 and r2 are both rules.
+ ptr = r.ptr;
+ return *this;
+ }
+
+ stored_rule<T0, T1, T2, true>
+ copy() const
+ {
+ return stored_rule<T0, T1, T2, true>(ptr);
+ }
+
+ alias_t
+ alias() const
+ {
+ return alias_t(*this);
+ }
+
+ private:
+
+ friend class impl::rule_base_access;
+ friend class stored_rule<T0, T1, T2, !EmbedByValue>;
+
+#if defined(__GNUC__) && (__GNUC__ < 3)
+ public:
+#endif
+ abstract_parser_t*
+ get() const
+ {
+ return ptr.get();
+ }
+#if defined(__GNUC__) && (__GNUC__ < 3)
+ private:
+#endif
+
+ stored_rule(shared_ptr<abstract_parser_t> const& ptr)
+ : ptr(ptr) {}
+
+ shared_ptr<abstract_parser_t> ptr;
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/dynamic/stored_rule_fwd.hpp b/boost/spirit/home/classic/dynamic/stored_rule_fwd.hpp
new file mode 100644
index 0000000000..655bd838a9
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/stored_rule_fwd.hpp
@@ -0,0 +1,31 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_STORED_RULE_FWD_HPP)
+#define BOOST_SPIRIT_STORED_RULE_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <
+ typename T0 = nil_t
+ , typename T1 = nil_t
+ , typename T2 = nil_t
+ , bool EmbedByValue = false
+ >
+ class stored_rule;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/dynamic/switch.hpp b/boost/spirit/home/classic/dynamic/switch.hpp
new file mode 100644
index 0000000000..4a2c7e463e
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/switch.hpp
@@ -0,0 +1,259 @@
+/*=============================================================================
+ Copyright (c) 2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SWITCH_HPP
+#define BOOST_SPIRIT_SWITCH_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The default_p parser generator template uses the following magic number
+// as the corresponding case label value inside the generated switch()
+// statements. If this number conflicts with your code, please pick a
+// different one.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_DEFAULTCASE_MAGIC)
+#define BOOST_SPIRIT_DEFAULTCASE_MAGIC 0x15F97A7
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Spirit predefined maximum number of possible case_p/default_p case branch
+// parsers.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_SWITCH_CASE_LIMIT)
+#define BOOST_SPIRIT_SWITCH_CASE_LIMIT 3
+#endif // !defined(BOOST_SPIRIT_SWITCH_CASE_LIMIT)
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Ensure BOOST_SPIRIT_SELECT_LIMIT > 0
+//
+///////////////////////////////////////////////////////////////////////////////
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_SWITCH_CASE_LIMIT > 0);
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/config.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/epsilon.hpp>
+#include <boost/spirit/home/classic/dynamic/impl/switch.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The switch_parser allows to build switch like parsing constructs, which
+// will have much better perfomance as comparable straight solutions.
+//
+// Input stream driven syntax:
+//
+// switch_p
+// [
+// case_p<'a'>
+// (...parser to use, if the next character is 'a'...),
+// case_p<'b'>
+// (...parser to use, if the next character is 'b'...),
+// default_p
+// (...parser to use, if nothing was matched before...)
+// ]
+//
+// General syntax:
+//
+// switch_p(...lazy expression returning the switch condition value...)
+// [
+// case_p<1>
+// (...parser to use, if the switch condition value is 1...),
+// case_p<2>
+// (...parser to use, if the switch condition value is 2...),
+// default_p
+// (...parser to use, if nothing was matched before...)
+// ]
+//
+// The maximum number of possible case_p branches is defined by the p constant
+// BOOST_SPIRIT_SWITCH_CASE_LIMIT (this value defaults to 3 if not otherwise
+// defined).
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CaseT, typename CondT = impl::get_next_token_cond>
+struct switch_parser
+: public unary<CaseT, parser<switch_parser<CaseT, CondT> > >
+{
+ typedef switch_parser<CaseT, CondT> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef unary<CaseT, parser<self_t> > base_t;
+
+ switch_parser(CaseT const &case_)
+ : base_t(case_), cond(CondT())
+ {}
+
+ switch_parser(CaseT const &case_, CondT const &cond_)
+ : base_t(case_), cond(cond_)
+ {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ return this->subject().parse(scan,
+ impl::make_cond_functor<CondT>::do_(cond));
+ }
+
+ CondT cond;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename CondT>
+struct switch_cond_parser
+{
+ switch_cond_parser(CondT const &cond_)
+ : cond(cond_)
+ {}
+
+ template <typename ParserT>
+ switch_parser<ParserT, CondT>
+ operator[](parser<ParserT> const &p) const
+ {
+ return switch_parser<ParserT, CondT>(p.derived(), cond);
+ }
+
+ CondT const &cond;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <int N, typename ParserT, bool IsDefault>
+struct case_parser
+: public unary<ParserT, parser<case_parser<N, ParserT, IsDefault> > >
+{
+ typedef case_parser<N, ParserT, IsDefault> self_t;
+ typedef unary_parser_category parser_category_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ typedef typename base_t::subject_t self_subject_t;
+
+ BOOST_STATIC_CONSTANT(int, value = N);
+ BOOST_STATIC_CONSTANT(bool, is_default = IsDefault);
+ BOOST_STATIC_CONSTANT(bool, is_simple = true);
+ BOOST_STATIC_CONSTANT(bool, is_epsilon = (
+ is_default && boost::is_same<self_subject_t, epsilon_parser>::value
+ ));
+
+ case_parser(parser<ParserT> const &p)
+ : base_t(p.derived())
+ {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ template <typename ScannerT, typename CondT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan, CondT const &cond) const
+ {
+ typedef impl::default_case<self_t> default_t;
+
+ if (!scan.at_end()) {
+ typedef impl::default_delegate_parse<
+ value, is_default, default_t::value> default_parse_t;
+
+ typename ScannerT::iterator_t const save(scan.first);
+ return default_parse_t::parse(cond(scan), *this,
+ *this, scan, save);
+ }
+
+ return default_t::is_epsilon ? scan.empty_match() : scan.no_match();
+ }
+
+ template <int N1, typename ParserT1, bool IsDefault1>
+ impl::compound_case_parser<
+ self_t, case_parser<N1, ParserT1, IsDefault1>, IsDefault1
+ >
+ operator, (case_parser<N1, ParserT1, IsDefault1> const &p) const
+ {
+ // If the following compile time assertion fires, you've probably used
+ // more than one default_p case inside the switch_p parser construct.
+ BOOST_STATIC_ASSERT(!is_default || !IsDefault1);
+
+ typedef case_parser<N1, ParserT1, IsDefault1> right_t;
+ return impl::compound_case_parser<self_t, right_t, IsDefault1>(*this, p);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+struct switch_parser_gen {
+
+// This generates a switch parser, which is driven by the condition value
+// returned by the lazy parameter expression 'cond'. This may be a parser,
+// which result is used or a phoenix actor, which will be dereferenced to
+// obtain the switch condition value.
+ template <typename CondT>
+ switch_cond_parser<CondT>
+ operator()(CondT const &cond) const
+ {
+ return switch_cond_parser<CondT>(cond);
+ }
+
+// This generates a switch parser, which is driven by the next character/token
+// found in the input stream.
+ template <typename CaseT>
+ switch_parser<CaseT>
+ operator[](parser<CaseT> const &p) const
+ {
+ return switch_parser<CaseT>(p.derived());
+ }
+};
+
+switch_parser_gen const switch_p = switch_parser_gen();
+
+///////////////////////////////////////////////////////////////////////////////
+template <int N, typename ParserT>
+inline case_parser<N, ParserT, false>
+case_p(parser<ParserT> const &p)
+{
+ return case_parser<N, ParserT, false>(p);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+struct default_parser_gen
+: public case_parser<BOOST_SPIRIT_DEFAULTCASE_MAGIC, epsilon_parser, true>
+{
+ default_parser_gen()
+ : case_parser<BOOST_SPIRIT_DEFAULTCASE_MAGIC, epsilon_parser, true>
+ (epsilon_p)
+ {}
+
+ template <typename ParserT>
+ case_parser<BOOST_SPIRIT_DEFAULTCASE_MAGIC, ParserT, true>
+ operator()(parser<ParserT> const &p) const
+ {
+ return case_parser<BOOST_SPIRIT_DEFAULTCASE_MAGIC, ParserT, true>(p);
+ }
+};
+
+default_parser_gen const default_p = default_parser_gen();
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_SWITCH_HPP
diff --git a/boost/spirit/home/classic/dynamic/typeof.hpp b/boost/spirit/home/classic/dynamic/typeof.hpp
new file mode 100644
index 0000000000..7ed99c657b
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/typeof.hpp
@@ -0,0 +1,89 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DYNAMIC_TYPEOF_HPP)
+#define BOOST_SPIRIT_DYNAMIC_TYPEOF_HPP
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/typeof.hpp>
+
+#include <boost/spirit/home/classic/dynamic/stored_rule_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ // if.hpp
+ template <class ParsableT, typename CondT> struct if_parser;
+ template <class ParsableTrueT, class ParsableFalseT, typename CondT>
+ struct if_else_parser;
+
+ // for.hpp
+ namespace impl {
+ template<typename InitF, typename CondT, typename StepF, class ParsableT>
+ struct for_parser;
+ }
+
+ // while.hpp
+ template<typename ParsableT, typename CondT, bool is_do_parser>
+ struct while_parser;
+
+ // lazy.hpp
+ template<typename ActorT> struct lazy_parser;
+
+ // rule_alias.hpp
+ template <typename ParserT> class rule_alias;
+
+ // switch.hpp
+ template <typename CaseT, typename CondT> struct switch_parser;
+ template <int N, class ParserT, bool IsDefault> struct case_parser;
+
+ // select.hpp
+ template <typename TupleT, typename BehaviourT, typename T>
+ struct select_parser;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+// if.hpp
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::if_parser,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::if_else_parser,3)
+
+// for.hpp
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::impl::for_parser,4)
+
+// while.hpp
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::while_parser,(class)(class)(bool))
+
+// lazy.hpp
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::lazy_parser,1)
+
+// stored_rule.hpp (has forward header)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::stored_rule,(typename)(typename)(typename)(bool))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::stored_rule,3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::stored_rule,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::stored_rule,1)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::stored_rule<>)
+
+// rule_alias.hpp
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::rule_alias,1)
+
+// switch.hpp
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::switch_parser,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::case_parser,(int)(class)(bool))
+
+// select.hpp
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::select_parser,3)
+
+#endif
+
diff --git a/boost/spirit/home/classic/dynamic/while.hpp b/boost/spirit/home/classic/dynamic/while.hpp
new file mode 100644
index 0000000000..e441e9c486
--- /dev/null
+++ b/boost/spirit/home/classic/dynamic/while.hpp
@@ -0,0 +1,189 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_WHILE_HPP
+#define BOOST_SPIRIT_WHILE_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/dynamic/impl/conditions.ipp>
+
+////////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl {
+
+ //////////////////////////////////
+ // while parser
+ // object are created by while_parser_gen and do_parser_gen
+ template <typename ParsableT, typename CondT, bool is_do_parser>
+ struct while_parser
+ : public condition_evaluator< typename as_parser<CondT>::type >
+ , public unary // the parent stores a copy of the body parser
+ <
+ typename as_parser<ParsableT>::type,
+ parser<while_parser<ParsableT, CondT, is_do_parser> >
+ >
+ {
+ typedef while_parser<ParsableT, CondT, is_do_parser> self_t;
+
+ typedef as_parser<ParsableT> as_parser_t;
+ typedef typename as_parser_t::type parser_t;
+ typedef as_parser<CondT> cond_as_parser_t;
+ typedef typename cond_as_parser_t::type condition_t;
+
+ typedef unary<parser_t, parser<self_t> > base_t;
+ typedef condition_evaluator<condition_t> eval_t;
+
+
+ //////////////////////////////
+ // constructor, saves condition and body parser
+ while_parser(ParsableT const &body, CondT const &cond)
+ : eval_t(cond_as_parser_t::convert(cond))
+ , base_t(as_parser_t::convert(body))
+ {}
+
+ //////////////////////////////
+ // result type computer.
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result
+ <ScannerT, nil_t>::type type;
+ };
+
+ //////////////////////////////
+ // parse member function
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<parser_t, ScannerT>::type sresult_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+
+ iterator_t save(scan.first);
+ std::size_t length = 0;
+ int eval_length = 0;
+
+ bool dont_check_condition = is_do_parser;
+
+ while (dont_check_condition || (eval_length=this->evaluate(scan))>=0)
+ {
+ dont_check_condition = false;
+ length += eval_length;
+ sresult_t tmp(this->subject().parse(scan));
+ if (tmp)
+ {
+ length+=tmp.length();
+ }
+ else
+ {
+ return scan.no_match();
+ }
+ }
+ return scan.create_match(length, nil_t(), save, scan.first);
+ }
+ };
+
+ //////////////////////////////////
+ // while-parser generator, takes the body-parser in brackets
+ // and returns the actual while-parser.
+ template <typename CondT>
+ struct while_parser_gen
+ {
+ //////////////////////////////
+ // constructor, saves the condition for use by operator[]
+ while_parser_gen(CondT const& cond_) : cond(cond_) {}
+
+ //////////////////////////////
+ // operator[] returns the actual while-parser object
+ template <typename ParsableT>
+ while_parser<ParsableT, CondT, false>
+ operator[](ParsableT const &subject) const
+ {
+ return while_parser<ParsableT, CondT, false>(subject, cond);
+ }
+ private:
+
+ //////////////////////////////
+ // the condition is stored by reference here.
+ // this should not cause any harm since object of type
+ // while_parser_gen<> are only used as temporaries
+ // the while-parser object constructed by the operator[]
+ // stores a copy of the condition.
+ CondT const &cond;
+ };
+
+ //////////////////////////////////
+ // do-while-parser generator, takes the condition as
+ // parameter to while_p member function and returns the
+ // actual do-while-parser.
+ template <typename ParsableT>
+ struct do_while_parser_gen
+ {
+ //////////////////////////////
+ // constructor. saves the body parser for use by while_p.
+ explicit do_while_parser_gen(ParsableT const &body_parser)
+ : body(body_parser)
+ {}
+
+ //////////////////////////////
+ // while_p returns the actual while-parser object
+ template <typename CondT>
+ while_parser<ParsableT, CondT, true>
+ while_p(CondT cond) const
+ {
+ return while_parser<ParsableT, CondT, true>(body, cond);
+ }
+ private:
+
+ //////////////////////////////
+ // the body is stored by reference here
+ // this should not cause any harm since object of type
+ // do_while_parser_gen<> are only used as temporaries
+ // the while-parser object constructed by the while_p
+ // member function stores a copy of the body parser.
+ ParsableT const &body;
+ };
+
+ struct do_parser_gen
+ {
+ inline do_parser_gen() {}
+
+ template <typename ParsableT>
+ impl::do_while_parser_gen<ParsableT>
+ operator[](ParsableT const& body) const
+ {
+ return impl::do_while_parser_gen<ParsableT>(body);
+ }
+ };
+} // namespace impl
+
+//////////////////////////////////
+// while_p function, while-parser generator
+// Usage: spirit::while_p(Condition)[Body]
+template <typename CondT>
+impl::while_parser_gen<CondT>
+while_p(CondT const& cond)
+{
+ return impl::while_parser_gen<CondT>(cond);
+}
+
+//////////////////////////////////
+// do_p functor, do-while-parser generator
+// Usage: spirit::do_p[Body].while_p(Condition)
+impl::do_parser_gen const do_p = impl::do_parser_gen();
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_WHILE_HPP
diff --git a/boost/spirit/home/classic/error_handling.hpp b/boost/spirit/home/classic/error_handling.hpp
new file mode 100644
index 0000000000..72c5d2cac2
--- /dev/null
+++ b/boost/spirit/home/classic/error_handling.hpp
@@ -0,0 +1,21 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ERROR_HANDLING_MAIN_HPP)
+#define BOOST_SPIRIT_ERROR_HANDLING_MAIN_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Master header for Spirit.ErrorHandling
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/home/classic/error_handling/exceptions.hpp>
+
+#endif // !defined(BOOST_SPIRIT_ERROR_HANDLING_MAIN_HPP)
diff --git a/boost/spirit/home/classic/error_handling/exceptions.hpp b/boost/spirit/home/classic/error_handling/exceptions.hpp
new file mode 100644
index 0000000000..c2e0c86983
--- /dev/null
+++ b/boost/spirit/home/classic/error_handling/exceptions.hpp
@@ -0,0 +1,365 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_EXCEPTIONS_HPP
+#define BOOST_SPIRIT_EXCEPTIONS_HPP
+
+#include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <exception>
+
+#include <boost/spirit/home/classic/error_handling/exceptions_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_error_base class
+ //
+ // This is the base class of parser_error (see below). This may be
+ // used to catch any type of parser error.
+ //
+ // This exception shouldn't propagate outside the parser. However to
+ // avoid quirks of many platforms/implementations which fall outside
+ // the C++ standard, we derive parser_error_base from std::exception
+ // to allow a single catch handler to catch all exceptions.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ class parser_error_base : public std::exception
+ {
+ protected:
+
+ parser_error_base() {}
+ virtual ~parser_error_base() throw() {}
+
+ public:
+
+ parser_error_base(parser_error_base const& rhs)
+ : std::exception(rhs) {}
+ parser_error_base& operator=(parser_error_base const&)
+ {
+ return *this;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // parser_error class
+ //
+ // Generic parser exception class. This is the base class for all
+ // parser exceptions. The exception holds the iterator position
+ // where the error was encountered in its member variable "where".
+ // The parser_error also holds information regarding the error
+ // (error descriptor) in its member variable "descriptor".
+ //
+ // The throw_ function creates and throws a parser_error given
+ // an iterator and an error descriptor.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ErrorDescrT, typename IteratorT>
+ struct parser_error : public parser_error_base
+ {
+ typedef ErrorDescrT error_descr_t;
+ typedef IteratorT iterator_t;
+
+ parser_error(IteratorT where_, ErrorDescrT descriptor_)
+ : where(where_), descriptor(descriptor_) {}
+
+ parser_error(parser_error const& rhs)
+ : parser_error_base(rhs)
+ , where(rhs.where), descriptor(rhs.descriptor) {}
+
+ parser_error&
+ operator=(parser_error const& rhs)
+ {
+ where = rhs.where;
+ descriptor = rhs.descriptor;
+ return *this;
+ }
+
+ virtual
+ ~parser_error() throw() {}
+
+ virtual const char*
+ what() const throw()
+ {
+ return "BOOST_SPIRIT_CLASSIC_NS::parser_error";
+ }
+
+ IteratorT where;
+ ErrorDescrT descriptor;
+ };
+
+ //////////////////////////////////
+ template <typename ErrorDescrT, typename IteratorT>
+ inline void
+ throw_(IteratorT where, ErrorDescrT descriptor)
+ {
+ boost::throw_exception(
+ parser_error<ErrorDescrT, IteratorT>(where, descriptor));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // assertive_parser class
+ //
+ // An assertive_parser class is a parser that throws an exception
+ // in response to a parsing failure. The assertive_parser throws a
+ // parser_error exception rather than returning an unsuccessful
+ // match to signal that the parser failed to match the input.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ErrorDescrT, typename ParserT>
+ struct assertive_parser
+ : public unary<ParserT, parser<assertive_parser<ErrorDescrT, ParserT> > >
+ {
+ typedef assertive_parser<ErrorDescrT, ParserT> self_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+ typedef unary_parser_category parser_category_t;
+
+ assertive_parser(ParserT const& parser, ErrorDescrT descriptor_)
+ : base_t(parser), descriptor(descriptor_) {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type result_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+
+ result_t hit = this->subject().parse(scan);
+ if (!hit)
+ {
+ throw_(scan.first, descriptor);
+ }
+ return hit;
+ }
+
+ ErrorDescrT descriptor;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // assertion class
+ //
+ // assertive_parsers are never instantiated directly. The assertion
+ // class is used to indirectly create an assertive_parser object.
+ // Before declaring the grammar, we declare some assertion objects.
+ // Examples:
+ //
+ // enum Errors
+ // {
+ // program_expected, begin_expected, end_expected
+ // };
+ //
+ // assertion<Errors> expect_program(program_expected);
+ // assertion<Errors> expect_begin(begin_expected);
+ // assertion<Errors> expect_end(end_expected);
+ //
+ // Now, we can use these assertions as wrappers around parsers:
+ //
+ // expect_end(str_p("end"))
+ //
+ // Take note that although the example uses enums to hold the
+ // information regarding the error (error desccriptor), we are free
+ // to use other types such as integers and strings. Enums are
+ // convenient for error handlers to easily catch since C++ treats
+ // enums as unique types.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ErrorDescrT>
+ struct assertion
+ {
+ assertion(ErrorDescrT descriptor_)
+ : descriptor(descriptor_) {}
+
+ template <typename ParserT>
+ assertive_parser<ErrorDescrT, ParserT>
+ operator()(ParserT const& parser) const
+ {
+ return assertive_parser<ErrorDescrT, ParserT>(parser, descriptor);
+ }
+
+ ErrorDescrT descriptor;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // error_status<T>
+ //
+ // Where T is an attribute type compatible with the match attribute
+ // of the fallback_parser's subject (defaults to nil_t). The class
+ // error_status reports the result of an error handler (see
+ // fallback_parser). result can be one of:
+ //
+ // fail: quit and fail (return a no_match)
+ // retry: attempt error recovery, possibly moving the scanner
+ // accept: force success returning a matching length, moving
+ // the scanner appropriately and returning an attribute
+ // value
+ // rethrow: rethrows the error.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct error_status
+ {
+ enum result_t { fail, retry, accept, rethrow };
+
+ error_status(
+ result_t result_ = fail,
+ std::ptrdiff_t length_ = -1,
+ T const& value_ = T())
+ : result(result_), length(length_), value(value_) {}
+
+ result_t result;
+ std::ptrdiff_t length;
+ T value;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // fallback_parser class
+ //
+ // Handles exceptions of type parser_error<ErrorDescrT, IteratorT>
+ // thrown somewhere inside its embedded ParserT object. The class
+ // sets up a try block before delegating parsing to its subject.
+ // When an exception is caught, the catch block then calls the
+ // HandlerT object. HandlerT may be a function or a functor (with
+ // an operator() member function) compatible with the interface:
+ //
+ // error_status<T>
+ // handler(ScannerT const& scan, ErrorT error);
+ //
+ // Where scan points to the scanner state prior to parsing and error
+ // is the error that arose (see parser_error). The handler must
+ // return an error_status<T> object (see above).
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ namespace impl
+ {
+ template <typename RT, typename ParserT, typename ScannerT>
+ RT fallback_parser_parse(ParserT const& p, ScannerT const& scan);
+ }
+
+ template <typename ErrorDescrT, typename ParserT, typename HandlerT>
+ struct fallback_parser
+ : public unary<ParserT,
+ parser<fallback_parser<ErrorDescrT, ParserT, HandlerT> > >
+ {
+ typedef fallback_parser<ErrorDescrT, ParserT, HandlerT>
+ self_t;
+ typedef ErrorDescrT
+ error_descr_t;
+ typedef unary<ParserT, parser<self_t> >
+ base_t;
+ typedef unary_parser_category
+ parser_category_t;
+
+ fallback_parser(ParserT const& parser, HandlerT const& handler_)
+ : base_t(parser), handler(handler_) {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::fallback_parser_parse<result_t>(*this, scan);
+ }
+
+ HandlerT handler;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // guard class
+ //
+ // fallback_parser objects are not instantiated directly. The guard
+ // class is used to indirectly create a fallback_parser object.
+ // guards are typically predeclared just like assertions (see the
+ // assertion class above; the example extends the previous example
+ // introduced in the assertion class above):
+ //
+ // guard<Errors> my_guard;
+ //
+ // Errors, in this example is the error descriptor type we want to
+ // detect; This is essentially the ErrorDescrT template parameter
+ // of the fallback_parser class.
+ //
+ // my_guard may now be used in a grammar declaration as:
+ //
+ // my_guard(p)[h]
+ //
+ // where p is a parser, h is a function or functor compatible with
+ // fallback_parser's HandlerT (see above).
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ErrorDescrT, typename ParserT>
+ struct guard_gen : public unary<ParserT, nil_t>
+ {
+ typedef guard<ErrorDescrT> parser_generator_t;
+ typedef unary_parser_category parser_category_t;
+
+ guard_gen(ParserT const& p)
+ : unary<ParserT, nil_t>(p) {}
+
+ template <typename HandlerT>
+ fallback_parser<ErrorDescrT, ParserT, HandlerT>
+ operator[](HandlerT const& handler) const
+ {
+ return fallback_parser<ErrorDescrT, ParserT, HandlerT>
+ (this->subject(), handler);
+ }
+ };
+
+ template <typename ErrorDescrT>
+ struct guard
+ {
+ template <typename ParserT>
+ struct result
+ {
+ typedef guard_gen<ErrorDescrT, ParserT> type;
+ };
+
+ template <typename ParserT>
+ static guard_gen<ErrorDescrT, ParserT>
+ generate(ParserT const& parser)
+ {
+ return guard_gen<ErrorDescrT, ParserT>(parser);
+ }
+
+ template <typename ParserT>
+ guard_gen<ErrorDescrT, ParserT>
+ operator()(ParserT const& parser) const
+ {
+ return guard_gen<ErrorDescrT, ParserT>(parser);
+ }
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#include <boost/spirit/home/classic/error_handling/impl/exceptions.ipp>
+#endif
+
diff --git a/boost/spirit/home/classic/error_handling/exceptions_fwd.hpp b/boost/spirit/home/classic/error_handling/exceptions_fwd.hpp
new file mode 100644
index 0000000000..a8c132cf81
--- /dev/null
+++ b/boost/spirit/home/classic/error_handling/exceptions_fwd.hpp
@@ -0,0 +1,41 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_EXCEPTIONS_FWD_HPP)
+#define BOOST_SPIRIT_EXCEPTIONS_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename ErrorDescrT, typename IteratorT = char const*>
+ struct parser_error;
+
+ template <typename ErrorDescrT, typename ParserT>
+ struct assertive_parser;
+
+ template <typename ErrorDescrT>
+ struct assertion;
+
+ template <typename T = nil_t>
+ struct error_status;
+
+ template <typename ErrorDescrT, typename ParserT, typename HandlerT>
+ struct fallback_parser;
+
+ template <typename ErrorDescrT>
+ struct guard;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/error_handling/impl/exceptions.ipp b/boost/spirit/home/classic/error_handling/impl/exceptions.ipp
new file mode 100644
index 0000000000..1cc63e798c
--- /dev/null
+++ b/boost/spirit/home/classic/error_handling/impl/exceptions.ipp
@@ -0,0 +1,93 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_EXCEPTIONS_IPP
+#define BOOST_SPIRIT_EXCEPTIONS_IPP
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace impl {
+
+#ifdef __BORLANDC__
+ template <typename ParserT, typename ScannerT>
+ typename parser_result<ParserT, ScannerT>::type
+ fallback_parser_helper(ParserT const& subject, ScannerT const& scan);
+#endif
+
+ template <typename RT, typename ParserT, typename ScannerT>
+ RT fallback_parser_parse(ParserT const& p, ScannerT const& scan)
+ {
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename RT::attr_t attr_t;
+ typedef error_status<attr_t> error_status_t;
+ typedef typename ParserT::error_descr_t error_descr_t;
+
+ iterator_t save = scan.first;
+ error_status_t hr(error_status_t::retry);
+
+ while (hr.result == error_status_t::retry)
+ {
+ try
+ {
+ #ifndef __BORLANDC__
+ return p.subject().parse(scan);
+ #else
+ return impl::fallback_parser_helper(p, scan);
+ #endif
+ }
+
+ catch (parser_error<error_descr_t, iterator_t>& error)
+ {
+ scan.first = save;
+ hr = p.handler(scan, error);
+ switch (hr.result)
+ {
+ case error_status_t::fail:
+ return scan.no_match();
+ case error_status_t::accept:
+ return scan.create_match
+ (std::size_t(hr.length), hr.value, save, scan.first);
+ case error_status_t::rethrow:
+ boost::throw_exception(error);
+ default:
+ continue;
+ }
+ }
+ }
+ return scan.no_match();
+ }
+
+///////////////////////////////////////////////////////////////////////////
+//
+// Borland does not like calling the subject directly in the try block.
+// Removing the #ifdef __BORLANDC__ code makes Borland complain that
+// some variables and types cannot be found in the catch block. Weird!
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef __BORLANDC__
+
+ template <typename ParserT, typename ScannerT>
+ typename parser_result<ParserT, ScannerT>::type
+ fallback_parser_helper(ParserT const& p, ScannerT const& scan)
+ {
+ return p.subject().parse(scan);
+ }
+
+#endif
+
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit::impl
+
+///////////////////////////////////////////////////////////////////////////////
+#endif
+
diff --git a/boost/spirit/home/classic/error_handling/typeof.hpp b/boost/spirit/home/classic/error_handling/typeof.hpp
new file mode 100644
index 0000000000..9e31cce62b
--- /dev/null
+++ b/boost/spirit/home/classic/error_handling/typeof.hpp
@@ -0,0 +1,33 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ERROR_HANDLING_TYPEOF_HPP)
+#define BOOST_SPIRIT_ERROR_HANDLING_TYPEOF_HPP
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/spirit/home/classic/core/typeof.hpp>
+
+#include <boost/spirit/home/classic/error_handling/exceptions_fwd.hpp>
+
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+
+// exceptions.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::parser_error,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::assertive_parser,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::error_status,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::fallback_parser,3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::guard,1)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::error_status<>)
+
+
+#endif
+
diff --git a/boost/spirit/home/classic/iterator.hpp b/boost/spirit/home/classic/iterator.hpp
new file mode 100644
index 0000000000..fb2b68f17c
--- /dev/null
+++ b/boost/spirit/home/classic/iterator.hpp
@@ -0,0 +1,25 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2003 Giovanni Bajo
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ITERATOR_MAIN_HPP)
+#define BOOST_SPIRIT_ITERATOR_MAIN_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Master header for Spirit.Iterators
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/home/classic/iterator/file_iterator.hpp>
+#include <boost/spirit/home/classic/iterator/fixed_size_queue.hpp>
+#include <boost/spirit/home/classic/iterator/position_iterator.hpp>
+#include <boost/spirit/home/classic/iterator/multi_pass.hpp>
+
+#endif // !defined(BOOST_SPIRIT_ITERATOR_MAIN_HPP)
diff --git a/boost/spirit/home/classic/iterator/file_iterator.hpp b/boost/spirit/home/classic/iterator/file_iterator.hpp
new file mode 100644
index 0000000000..5c20f15fe3
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/file_iterator.hpp
@@ -0,0 +1,229 @@
+/*=============================================================================
+ Copyright (c) 2003 Giovanni Bajo
+ Copyright (c) 2003 Thomas Witt
+ Copyright (c) 2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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 Iterator structure
+//
+// The new structure is designed on layers. The top class (used by the user)
+// is file_iterator, which implements a full random access iterator through
+// the file, and some specific member functions (constructor that opens
+// the file, make_end() to generate the end iterator, operator bool to check
+// if the file was opened correctly).
+//
+// file_iterator implements the random access iterator interface by the means
+// of boost::iterator_adaptor, that is inhering an object created with it.
+// iterator_adaptor gets a low-level file iterator implementation (with just
+// a few member functions) and a policy (that basically describes to it how
+// the low-level file iterator interface is). The advantage is that
+// with boost::iterator_adaptor only 5 functions are needed to implement
+// a fully conformant random access iterator, instead of dozens of functions
+// and operators.
+//
+// There are two low-level file iterators implemented in this module. The
+// first (std_file_iterator) uses cstdio stream functions (fopen/fread), which
+// support full buffering, and is available everywhere (it's standard C++).
+// The second (mmap_file_iterator) is currently available only on Windows
+// platforms, and uses memory mapped files, which gives a decent speed boost.
+//
+///////////////////////////////////////////////////////////////////////////////
+//
+// TODO LIST:
+//
+// - In the Win32 mmap iterator, we could check if keeping a handle to the
+// opened file is really required. If it's not, we can just store the file
+// length (for make_end()) and save performance. Notice that this should be
+// tested under different Windows versions, the behaviour might change.
+// - Add some error support (by the means of some exceptions) in case of
+// low-level I/O failure.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_SPIRIT_FILE_ITERATOR_HPP
+#define BOOST_SPIRIT_FILE_ITERATOR_HPP
+
+#include <string>
+#include <boost/config.hpp>
+#include <boost/iterator_adaptors.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/safe_bool.hpp>
+
+#include <boost/spirit/home/classic/iterator/file_iterator_fwd.hpp>
+
+#if !defined(BOOST_SPIRIT_FILEITERATOR_STD)
+# if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) \
+ && !defined(BOOST_DISABLE_WIN32)
+# define BOOST_SPIRIT_FILEITERATOR_WINDOWS
+# elif defined(BOOST_HAS_UNISTD_H)
+extern "C"
+{
+# include <unistd.h>
+}
+# ifdef _POSIX_MAPPED_FILES
+# define BOOST_SPIRIT_FILEITERATOR_POSIX
+# endif // _POSIX_MAPPED_FILES
+# endif // BOOST_HAS_UNISTD_H
+
+# if !defined(BOOST_SPIRIT_FILEITERATOR_WINDOWS) && \
+ !defined(BOOST_SPIRIT_FILEITERATOR_POSIX)
+# define BOOST_SPIRIT_FILEITERATOR_STD
+# endif
+#endif // BOOST_SPIRIT_FILEITERATOR_STD
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+template <
+ typename CharT = char,
+ typename BaseIterator =
+#ifdef BOOST_SPIRIT_FILEITERATOR_STD
+ fileiter_impl::std_file_iterator<CharT>
+#else
+ fileiter_impl::mmap_file_iterator<CharT>
+#endif
+> class file_iterator;
+
+///////////////////////////////////////////////////////////////////////////////
+namespace fileiter_impl {
+
+ /////////////////////////////////////////////////////////////////////////
+ //
+ // file_iter_generator
+ //
+ // Template meta-function to invoke boost::iterator_adaptor
+ // NOTE: This cannot be moved into the implementation file because of
+ // a bug of MSVC 7.0 and previous versions (base classes types are
+ // looked up at compilation time, not instantion types, and
+ // file_iterator would break).
+ //
+ /////////////////////////////////////////////////////////////////////////
+
+#if !defined(BOOST_ITERATOR_ADAPTORS_VERSION) || \
+ BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+#error "Please use at least Boost V1.31.0 while compiling the file_iterator class!"
+#else // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+ template <typename CharT, typename BaseIteratorT>
+ struct file_iter_generator
+ {
+ public:
+ typedef BaseIteratorT adapted_t;
+ typedef typename adapted_t::value_type value_type;
+
+ typedef boost::iterator_adaptor <
+ file_iterator<CharT, BaseIteratorT>,
+ adapted_t,
+ value_type const,
+ std::random_access_iterator_tag,
+ boost::use_default,
+ std::ptrdiff_t
+ > type;
+ };
+
+#endif // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+///////////////////////////////////////////////////////////////////////////////
+} /* namespace impl */
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// file_iterator
+//
+// Iterates through an opened file.
+//
+// The main iterator interface is implemented by the iterator_adaptors
+// library, which wraps a conforming iterator interface around the
+// impl::BaseIterator class. This class merely derives the iterator_adaptors
+// generated class to implement the custom constructors and make_end()
+// member function.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename CharT, typename BaseIteratorT>
+class file_iterator
+ : public fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::type,
+ public safe_bool<file_iterator<CharT, BaseIteratorT> >
+{
+private:
+ typedef typename
+ fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::type
+ base_t;
+ typedef typename
+ fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::adapted_t
+ adapted_t;
+
+public:
+ file_iterator()
+ {}
+
+ file_iterator(std::string const& fileName)
+ : base_t(adapted_t(fileName))
+ {}
+
+ file_iterator(const base_t& iter)
+ : base_t(iter)
+ {}
+
+ inline file_iterator& operator=(const base_t& iter);
+ file_iterator make_end(void);
+
+ // operator bool. This borrows a trick from boost::shared_ptr to avoid
+ // to interfere with arithmetic operations.
+ bool operator_bool(void) const
+ { return this->base(); }
+
+private:
+ friend class ::boost::iterator_core_access;
+
+ typename base_t::reference dereference() const
+ {
+ return this->base_reference().get_cur_char();
+ }
+
+ void increment()
+ {
+ this->base_reference().next_char();
+ }
+
+ void decrement()
+ {
+ this->base_reference().prev_char();
+ }
+
+ void advance(typename base_t::difference_type n)
+ {
+ this->base_reference().advance(n);
+ }
+
+ template <
+ typename OtherDerivedT, typename OtherIteratorT,
+ typename V, typename C, typename R, typename D
+ >
+ typename base_t::difference_type distance_to(
+ iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D>
+ const &x) const
+ {
+ return x.base().distance(this->base_reference());
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} /* namespace BOOST_SPIRIT_CLASSIC_NS */
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/iterator/impl/file_iterator.ipp> /* implementation */
+
+#endif /* BOOST_SPIRIT_FILE_ITERATOR_HPP */
+
diff --git a/boost/spirit/home/classic/iterator/file_iterator_fwd.hpp b/boost/spirit/home/classic/iterator/file_iterator_fwd.hpp
new file mode 100644
index 0000000000..fb732d56e6
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/file_iterator_fwd.hpp
@@ -0,0 +1,39 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_FILE_ITERATOR_FWD_HPP)
+#define BOOST_SPIRIT_FILE_ITERATOR_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace fileiter_impl
+ {
+ template <typename CharT = char>
+ class std_file_iterator;
+
+ // may never be defined -- so what...
+ template <typename CharT = char>
+ class mmap_file_iterator;
+ }
+
+ // no defaults here -- too much dependencies
+ template <
+ typename CharT,
+ typename BaseIterator
+ > class file_iterator;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/iterator/fixed_size_queue.hpp b/boost/spirit/home/classic/iterator/fixed_size_queue.hpp
new file mode 100644
index 0000000000..6efbf4c160
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/fixed_size_queue.hpp
@@ -0,0 +1,402 @@
+/*=============================================================================
+ Copyright (c) 2001, Daniel C. Nuffer
+ Copyright (c) 2003, Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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 FIXED_SIZE_QUEUE
+#define FIXED_SIZE_QUEUE
+
+#include <cstdlib>
+#include <iterator>
+#include <cstddef>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/assert.hpp> // for BOOST_SPIRIT_ASSERT
+
+// FIXES for broken compilers
+#include <boost/config.hpp>
+#include <boost/iterator_adaptors.hpp>
+
+#define BOOST_SPIRIT_ASSERT_FSQ_SIZE \
+ BOOST_SPIRIT_ASSERT(((m_tail + N + 1) - m_head) % (N+1) == m_size % (N+1)) \
+ /**/
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+#if !defined(BOOST_ITERATOR_ADAPTORS_VERSION) || \
+ BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+#error "Please use at least Boost V1.31.0 while compiling the fixed_size_queue class!"
+#else // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+template <typename QueueT, typename T, typename PointerT>
+class fsq_iterator
+: public boost::iterator_adaptor<
+ fsq_iterator<QueueT, T, PointerT>,
+ PointerT,
+ T,
+ std::random_access_iterator_tag
+ >
+{
+public:
+ typedef typename QueueT::position_t position;
+ typedef boost::iterator_adaptor<
+ fsq_iterator<QueueT, T, PointerT>, PointerT, T,
+ std::random_access_iterator_tag
+ > base_t;
+
+ fsq_iterator() {}
+ fsq_iterator(position const &p_) : p(p_) {}
+
+ position const &get_position() const { return p; }
+
+private:
+ friend class boost::iterator_core_access;
+
+ typename base_t::reference dereference() const
+ {
+ return p.self->m_queue[p.pos];
+ }
+
+ void increment()
+ {
+ ++p.pos;
+ if (p.pos == QueueT::MAX_SIZE+1)
+ p.pos = 0;
+ }
+
+ void decrement()
+ {
+ if (p.pos == 0)
+ p.pos = QueueT::MAX_SIZE;
+ else
+ --p.pos;
+ }
+
+ template <
+ typename OtherDerivedT, typename OtherIteratorT,
+ typename V, typename C, typename R, typename D
+ >
+ bool equal(iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D>
+ const &x) const
+ {
+ position const &rhs_pos =
+ static_cast<OtherDerivedT const &>(x).get_position();
+ return (p.self == rhs_pos.self) && (p.pos == rhs_pos.pos);
+ }
+
+ template <
+ typename OtherDerivedT, typename OtherIteratorT,
+ typename V, typename C, typename R, typename D
+ >
+ typename base_t::difference_type distance_to(
+ iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D>
+ const &x) const
+ {
+ typedef typename base_t::difference_type diff_t;
+
+ position const &p2 =
+ static_cast<OtherDerivedT const &>(x).get_position();
+ std::size_t pos1 = p.pos;
+ std::size_t pos2 = p2.pos;
+
+ // Undefined behaviour if the iterators come from different
+ // containers
+ BOOST_SPIRIT_ASSERT(p.self == p2.self);
+
+ if (pos1 < p.self->m_head)
+ pos1 += QueueT::MAX_SIZE;
+ if (pos2 < p2.self->m_head)
+ pos2 += QueueT::MAX_SIZE;
+
+ if (pos2 > pos1)
+ return diff_t(pos2 - pos1);
+ else
+ return -diff_t(pos1 - pos2);
+ }
+
+ void advance(typename base_t::difference_type n)
+ {
+ // Notice that we don't care values of n that can
+ // wrap around more than one time, since it would
+ // be undefined behaviour anyway (going outside
+ // the begin/end range). Negative wrapping is a bit
+ // cumbersome because we don't want to case p.pos
+ // to signed.
+ if (n < 0)
+ {
+ n = -n;
+ if (p.pos < (std::size_t)n)
+ p.pos = QueueT::MAX_SIZE+1 - (n - p.pos);
+ else
+ p.pos -= n;
+ }
+ else
+ {
+ p.pos += n;
+ if (p.pos >= QueueT::MAX_SIZE+1)
+ p.pos -= QueueT::MAX_SIZE+1;
+ }
+ }
+
+private:
+ position p;
+};
+
+#endif // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+///////////////////////////////////////////////////////////////////////////////
+} /* namespace impl */
+
+template <typename T, std::size_t N>
+class fixed_size_queue
+{
+private:
+ struct position
+ {
+ fixed_size_queue* self;
+ std::size_t pos;
+
+ position() : self(0), pos(0) {}
+
+ // The const_cast here is just to avoid to have two different
+ // position structures for the const and non-const case.
+ // The const semantic is guaranteed by the iterator itself
+ position(const fixed_size_queue* s, std::size_t p)
+ : self(const_cast<fixed_size_queue*>(s)), pos(p)
+ {}
+ };
+
+public:
+ // Declare the iterators
+ typedef impl::fsq_iterator<fixed_size_queue<T, N>, T, T*> iterator;
+ typedef impl::fsq_iterator<fixed_size_queue<T, N>, T const, T const*>
+ const_iterator;
+ typedef position position_t;
+
+ friend class impl::fsq_iterator<fixed_size_queue<T, N>, T, T*>;
+ friend class impl::fsq_iterator<fixed_size_queue<T, N>, T const, T const*>;
+
+ fixed_size_queue();
+ fixed_size_queue(const fixed_size_queue& x);
+ fixed_size_queue& operator=(const fixed_size_queue& x);
+ ~fixed_size_queue();
+
+ void push_back(const T& e);
+ void push_front(const T& e);
+ void serve(T& e);
+ void pop_front();
+
+ bool empty() const
+ {
+ return m_size == 0;
+ }
+
+ bool full() const
+ {
+ return m_size == N;
+ }
+
+ iterator begin()
+ {
+ return iterator(position(this, m_head));
+ }
+
+ const_iterator begin() const
+ {
+ return const_iterator(position(this, m_head));
+ }
+
+ iterator end()
+ {
+ return iterator(position(this, m_tail));
+ }
+
+ const_iterator end() const
+ {
+ return const_iterator(position(this, m_tail));
+ }
+
+ std::size_t size() const
+ {
+ return m_size;
+ }
+
+ T& front()
+ {
+ return m_queue[m_head];
+ }
+
+ const T& front() const
+ {
+ return m_queue[m_head];
+ }
+
+private:
+ // Redefine the template parameters to avoid using partial template
+ // specialization on the iterator policy to extract N.
+ BOOST_STATIC_CONSTANT(std::size_t, MAX_SIZE = N);
+
+ std::size_t m_head;
+ std::size_t m_tail;
+ std::size_t m_size;
+ T m_queue[N+1];
+};
+
+template <typename T, std::size_t N>
+inline
+fixed_size_queue<T, N>::fixed_size_queue()
+ : m_head(0)
+ , m_tail(0)
+ , m_size(0)
+{
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+template <typename T, std::size_t N>
+inline
+fixed_size_queue<T, N>::fixed_size_queue(const fixed_size_queue& x)
+ : m_head(x.m_head)
+ , m_tail(x.m_tail)
+ , m_size(x.m_size)
+{
+ copy(x.begin(), x.end(), begin());
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+template <typename T, std::size_t N>
+inline fixed_size_queue<T, N>&
+fixed_size_queue<T, N>::operator=(const fixed_size_queue& x)
+{
+ if (this != &x)
+ {
+ m_head = x.m_head;
+ m_tail = x.m_tail;
+ m_size = x.m_size;
+ copy(x.begin(), x.end(), begin());
+ }
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+ return *this;
+}
+
+template <typename T, std::size_t N>
+inline
+fixed_size_queue<T, N>::~fixed_size_queue()
+{
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+template <typename T, std::size_t N>
+inline void
+fixed_size_queue<T, N>::push_back(const T& e)
+{
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+ BOOST_SPIRIT_ASSERT(!full());
+
+ m_queue[m_tail] = e;
+ ++m_size;
+ ++m_tail;
+ if (m_tail == N+1)
+ m_tail = 0;
+
+
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+template <typename T, std::size_t N>
+inline void
+fixed_size_queue<T, N>::push_front(const T& e)
+{
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+ BOOST_SPIRIT_ASSERT(!full());
+
+ if (m_head == 0)
+ m_head = N;
+ else
+ --m_head;
+
+ m_queue[m_head] = e;
+ ++m_size;
+
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+
+template <typename T, std::size_t N>
+inline void
+fixed_size_queue<T, N>::serve(T& e)
+{
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+ e = m_queue[m_head];
+ pop_front();
+}
+
+
+
+template <typename T, std::size_t N>
+inline void
+fixed_size_queue<T, N>::pop_front()
+{
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+ ++m_head;
+ if (m_head == N+1)
+ m_head = 0;
+ --m_size;
+
+ BOOST_SPIRIT_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_SPIRIT_ASSERT(m_head <= N+1);
+ BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#undef BOOST_SPIRIT_ASSERT_FSQ_SIZE
+
+#endif
diff --git a/boost/spirit/home/classic/iterator/impl/file_iterator.ipp b/boost/spirit/home/classic/iterator/impl/file_iterator.ipp
new file mode 100644
index 0000000000..4227b69665
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/impl/file_iterator.ipp
@@ -0,0 +1,467 @@
+/*=============================================================================
+ Copyright (c) 2003 Giovanni Bajo
+ Copyright (c) 2003 Martin Wille
+ Copyright (c) 2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_FILE_ITERATOR_IPP
+#define BOOST_SPIRIT_FILE_ITERATOR_IPP
+
+#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS
+# include <windows.h>
+#endif
+
+#include <cstdio>
+#include <boost/shared_ptr.hpp>
+
+#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS
+# include <boost/type_traits/remove_pointer.hpp>
+#endif
+
+#ifdef BOOST_SPIRIT_FILEITERATOR_POSIX
+# include <sys/types.h> // open, stat, mmap, munmap
+# include <sys/stat.h> // stat
+# include <fcntl.h> // open
+# include <unistd.h> // stat, mmap, munmap
+# include <sys/mman.h> // mmap, mmunmap
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+namespace fileiter_impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// std_file_iterator
+//
+// Base class that implements iteration through a file using standard C
+// stream library (fopen and friends). This class and the following are
+// the base components on which the iterator is built (through the
+// iterator adaptor library).
+//
+// The opened file stream (FILE) is held with a shared_ptr<>, whose
+// custom deleter invokes fcose(). This makes the syntax of the class
+// very easy, especially everything related to copying.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename CharT>
+class std_file_iterator
+{
+public:
+ typedef CharT value_type;
+
+ std_file_iterator()
+ {}
+
+ explicit std_file_iterator(std::string const& fileName)
+ {
+ using namespace std;
+ FILE* f = fopen(fileName.c_str(), "rb");
+
+ // If the file was opened, store it into
+ // the smart pointer.
+ if (f)
+ {
+ m_file.reset(f, fclose);
+ m_pos = 0;
+ m_eof = false;
+ update_char();
+ }
+ }
+
+ std_file_iterator(const std_file_iterator& iter)
+ { *this = iter; }
+
+ std_file_iterator& operator=(const std_file_iterator& iter)
+ {
+ m_file = iter.m_file;
+ m_curChar = iter.m_curChar;
+ m_eof = iter.m_eof;
+ m_pos = iter.m_pos;
+
+ return *this;
+ }
+
+ // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context
+ // for shared_ptr to evaluate correctly
+ operator bool() const
+ { return m_file ? true : false; }
+
+ bool operator==(const std_file_iterator& iter) const
+ {
+ return (m_file == iter.m_file) && (m_eof == iter.m_eof) &&
+ (m_pos == iter.m_pos);
+ }
+
+ const CharT& get_cur_char(void) const
+ {
+ return m_curChar;
+ }
+
+ void prev_char(void)
+ {
+ m_pos -= sizeof(CharT);
+ update_char();
+ }
+
+ void next_char(void)
+ {
+ m_pos += sizeof(CharT);
+ update_char();
+ }
+
+ void seek_end(void)
+ {
+ using namespace std;
+ fseek(m_file.get(), 0, SEEK_END);
+ m_pos = ftell(m_file.get()) / sizeof(CharT);
+ m_eof = true;
+ }
+
+ void advance(std::ptrdiff_t n)
+ {
+ m_pos += n * sizeof(CharT);
+ update_char();
+ }
+
+ std::ptrdiff_t distance(const std_file_iterator& iter) const
+ {
+ return (std::ptrdiff_t)(m_pos - iter.m_pos) / sizeof(CharT);
+ }
+
+private:
+ boost::shared_ptr<std::FILE> m_file;
+ std::size_t m_pos;
+ CharT m_curChar;
+ bool m_eof;
+
+ void update_char(void)
+ {
+ using namespace std;
+ if ((std::size_t)ftell(m_file.get()) != m_pos)
+ fseek(m_file.get(), m_pos, SEEK_SET);
+
+ m_eof = (fread(&m_curChar, sizeof(CharT), 1, m_file.get()) < 1);
+ }
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// mmap_file_iterator
+//
+// File iterator for memory mapped files, for now implemented on Windows and
+// POSIX platforms. This class has the same interface of std_file_iterator,
+// and can be used in its place (in fact, it's the default for Windows and
+// POSIX).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// mmap_file_iterator, Windows version
+#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS
+template <typename CharT>
+class mmap_file_iterator
+{
+public:
+ typedef CharT value_type;
+
+ mmap_file_iterator()
+ : m_filesize(0), m_curChar(0)
+ {}
+
+ explicit mmap_file_iterator(std::string const& fileName)
+ : m_filesize(0), m_curChar(0)
+ {
+ HANDLE hFile = ::CreateFileA(
+ fileName.c_str(),
+ GENERIC_READ,
+ FILE_SHARE_READ,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_SEQUENTIAL_SCAN,
+ NULL
+ );
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ return;
+
+ // Store the size of the file, it's used to construct
+ // the end iterator
+ m_filesize = ::GetFileSize(hFile, NULL);
+
+ HANDLE hMap = ::CreateFileMapping(
+ hFile,
+ NULL,
+ PAGE_READONLY,
+ 0, 0,
+ NULL
+ );
+
+ if (hMap == NULL)
+ {
+ ::CloseHandle(hFile);
+ return;
+ }
+
+ LPVOID pMem = ::MapViewOfFile(
+ hMap,
+ FILE_MAP_READ,
+ 0, 0, 0
+ );
+
+ if (pMem == NULL)
+ {
+ ::CloseHandle(hMap);
+ ::CloseHandle(hFile);
+ return;
+ }
+
+ // We hold both the file handle and the memory pointer.
+ // We can close the hMap handle now because Windows holds internally
+ // a reference to it since there is a view mapped.
+ ::CloseHandle(hMap);
+
+ // It seems like we can close the file handle as well (because
+ // a reference is hold by the filemap object).
+ ::CloseHandle(hFile);
+
+ // Store the handles inside the shared_ptr (with the custom destructors)
+ m_mem.reset(static_cast<CharT*>(pMem), ::UnmapViewOfFile);
+
+ // Start of the file
+ m_curChar = m_mem.get();
+ }
+
+ mmap_file_iterator(const mmap_file_iterator& iter)
+ { *this = iter; }
+
+ mmap_file_iterator& operator=(const mmap_file_iterator& iter)
+ {
+ m_curChar = iter.m_curChar;
+ m_mem = iter.m_mem;
+ m_filesize = iter.m_filesize;
+
+ return *this;
+ }
+
+ // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context
+ // for shared_ptr to evaluate correctly
+ operator bool() const
+ { return m_mem ? true : false; }
+
+ bool operator==(const mmap_file_iterator& iter) const
+ { return m_curChar == iter.m_curChar; }
+
+ const CharT& get_cur_char(void) const
+ { return *m_curChar; }
+
+ void next_char(void)
+ { m_curChar++; }
+
+ void prev_char(void)
+ { m_curChar--; }
+
+ void advance(std::ptrdiff_t n)
+ { m_curChar += n; }
+
+ std::ptrdiff_t distance(const mmap_file_iterator& iter) const
+ { return m_curChar - iter.m_curChar; }
+
+ void seek_end(void)
+ {
+ m_curChar = m_mem.get() +
+ (m_filesize / sizeof(CharT));
+ }
+
+private:
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+ typedef boost::remove_pointer<HANDLE>::type handle_t;
+#else
+ typedef void handle_t;
+#endif
+
+ boost::shared_ptr<CharT> m_mem;
+ std::size_t m_filesize;
+ CharT* m_curChar;
+};
+
+#endif // BOOST_SPIRIT_FILEITERATOR_WINDOWS
+
+///////////////////////////////////////////////////////////////////////////////
+// mmap_file_iterator, POSIX version
+#ifdef BOOST_SPIRIT_FILEITERATOR_POSIX
+template <typename CharT>
+class mmap_file_iterator
+{
+private:
+ struct mapping
+ {
+ mapping(void *p, off_t len)
+ : data(p)
+ , size(len)
+ { }
+
+ CharT const *begin() const
+ {
+ return static_cast<CharT *>(data);
+ }
+
+ CharT const *end() const
+ {
+ return static_cast<CharT *>(data) + size/sizeof(CharT);
+ }
+
+ ~mapping()
+ {
+ munmap(static_cast<char*>(data), size);
+ }
+
+ private:
+ void *data;
+ off_t size;
+ };
+
+public:
+ typedef CharT value_type;
+
+ mmap_file_iterator()
+ : m_curChar(0)
+ {}
+
+ explicit mmap_file_iterator(std::string const& file_name)
+ : m_curChar(0)
+ {
+ // open the file
+ int fd = open(file_name.c_str(),
+#ifdef O_NOCTTY
+ O_NOCTTY | // if stdin was closed then opening a file
+ // would cause the file to become the controlling
+ // terminal if the filename refers to a tty. Setting
+ // O_NOCTTY inhibits this.
+#endif
+ O_RDONLY);
+
+ if (fd == -1)
+ return;
+
+ // call fstat to find get information about the file just
+ // opened (size and file type)
+ struct stat stat_buf;
+ if ((fstat(fd, &stat_buf) != 0) || !S_ISREG(stat_buf.st_mode))
+ { // if fstat returns an error or if the file isn't a
+ // regular file we give up.
+ close(fd);
+ return;
+ }
+
+ // perform the actual mapping
+ void *p = mmap(0, stat_buf.st_size, PROT_READ, MAP_SHARED, fd, 0);
+ // it is safe to close() here. POSIX requires that the OS keeps a
+ // second handle to the file while the file is mmapped.
+ close(fd);
+
+ if (p == MAP_FAILED)
+ return;
+
+ mapping *m = 0;
+ try
+ {
+ m = new mapping(p, stat_buf.st_size);
+ }
+ catch(...)
+ {
+ munmap(static_cast<char*>(p), stat_buf.st_size);
+ throw;
+ }
+
+ m_mem.reset(m);
+
+ // Start of the file
+ m_curChar = m_mem->begin();
+ }
+
+ mmap_file_iterator(const mmap_file_iterator& iter)
+ { *this = iter; }
+
+ mmap_file_iterator& operator=(const mmap_file_iterator& iter)
+ {
+ m_curChar = iter.m_curChar;
+ m_mem = iter.m_mem;
+
+ return *this;
+ }
+
+ // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context
+ // for shared_ptr to evaluate correctly
+ operator bool() const
+ { return m_mem ? true : false; }
+
+ bool operator==(const mmap_file_iterator& iter) const
+ { return m_curChar == iter.m_curChar; }
+
+ const CharT& get_cur_char(void) const
+ { return *m_curChar; }
+
+ void next_char(void)
+ { m_curChar++; }
+
+ void prev_char(void)
+ { m_curChar--; }
+
+ void advance(signed long n)
+ { m_curChar += n; }
+
+ long distance(const mmap_file_iterator& iter) const
+ { return m_curChar - iter.m_curChar; }
+
+ void seek_end(void)
+ {
+ m_curChar = m_mem->end();
+ }
+
+private:
+
+ boost::shared_ptr<mapping> m_mem;
+ CharT const* m_curChar;
+};
+
+#endif // BOOST_SPIRIT_FILEITERATOR_POSIX
+
+///////////////////////////////////////////////////////////////////////////////
+} /* namespace boost::spirit::fileiter_impl */
+
+template <typename CharT, typename BaseIteratorT>
+file_iterator<CharT,BaseIteratorT>
+file_iterator<CharT,BaseIteratorT>::make_end(void)
+{
+ file_iterator iter(*this);
+ iter.base_reference().seek_end();
+ return iter;
+}
+
+template <typename CharT, typename BaseIteratorT>
+file_iterator<CharT,BaseIteratorT>&
+file_iterator<CharT,BaseIteratorT>::operator=(const base_t& iter)
+{
+ base_t::operator=(iter);
+ return *this;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} /* namespace boost::spirit */
+
+
+#endif /* BOOST_SPIRIT_FILE_ITERATOR_IPP */
diff --git a/boost/spirit/home/classic/iterator/impl/position_iterator.ipp b/boost/spirit/home/classic/iterator/impl/position_iterator.ipp
new file mode 100644
index 0000000000..d473af1a4b
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/impl/position_iterator.ipp
@@ -0,0 +1,138 @@
+/*=============================================================================
+ Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+ Copyright (c) 2002-2006 Hartmut Kaiser
+ Copyright (c) 2003 Giovanni Bajo
+ http://spirit.sourceforge.net/
+
+ 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 POSITION_ITERATOR_IPP
+#define POSITION_ITERATOR_IPP
+
+#include <boost/config.hpp>
+#include <boost/iterator_adaptors.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp> // for nil_t
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// position_policy<file_position_without_column>
+//
+// Specialization to handle file_position_without_column. Only take care of
+// newlines since no column tracking is needed.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename String>
+class position_policy<file_position_without_column_base<String> > {
+
+public:
+ void next_line(file_position_without_column_base<String>& pos)
+ {
+ ++pos.line;
+ }
+
+ void set_tab_chars(unsigned int /*chars*/){}
+ void next_char(file_position_without_column_base<String>& /*pos*/) {}
+ void tabulation(file_position_without_column_base<String>& /*pos*/) {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// position_policy<file_position>
+//
+// Specialization to handle file_position. Track characters and tabulation
+// to compute the current column correctly.
+//
+// Default tab size is 4. You can change this with the set_tabchars member
+// of position_iterator.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename String>
+class position_policy<file_position_base<String> > {
+
+public:
+ position_policy()
+ : m_CharsPerTab(4)
+ {}
+
+ void next_line(file_position_base<String>& pos)
+ {
+ ++pos.line;
+ pos.column = 1;
+ }
+
+ void set_tab_chars(unsigned int chars)
+ {
+ m_CharsPerTab = chars;
+ }
+
+ void next_char(file_position_base<String>& pos)
+ {
+ ++pos.column;
+ }
+
+ void tabulation(file_position_base<String>& pos)
+ {
+ pos.column += m_CharsPerTab - (pos.column - 1) % m_CharsPerTab;
+ }
+
+private:
+ unsigned int m_CharsPerTab;
+};
+
+/* namespace boost::spirit { */ namespace iterator_ { namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// position_iterator_base_generator
+//
+// Metafunction to generate the iterator type using boost::iterator_adaptors,
+// hiding all the metaprogramming thunking code in it. It is used
+// mainly to keep the public interface (position_iterator) cleanear.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename MainIterT, typename ForwardIterT, typename PositionT>
+struct position_iterator_base_generator
+{
+private:
+ typedef boost::detail::iterator_traits<ForwardIterT> traits;
+ typedef typename traits::value_type value_type;
+ typedef typename traits::iterator_category iter_category_t;
+
+ // Position iterator is always a non-mutable iterator
+ typedef typename boost::add_const<value_type>::type const_value_type;
+
+public:
+ // Check if the MainIterT is nil. If it's nil, it means that the actual
+ // self type is position_iterator. Otherwise, it's a real type we
+ // must use
+ typedef typename boost::mpl::if_<
+ typename boost::is_same<MainIterT, nil_t>::type,
+ position_iterator<ForwardIterT, PositionT, nil_t>,
+ MainIterT
+ >::type main_iter_t;
+
+ typedef boost::iterator_adaptor<
+ main_iter_t,
+ ForwardIterT,
+ const_value_type,
+ boost::forward_traversal_tag
+ > type;
+};
+
+}}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} /* namespace boost::spirit::iterator_::impl */
+
+#endif
diff --git a/boost/spirit/home/classic/iterator/multi_pass.hpp b/boost/spirit/home/classic/iterator/multi_pass.hpp
new file mode 100644
index 0000000000..ec8e01c976
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/multi_pass.hpp
@@ -0,0 +1,1307 @@
+/*=============================================================================
+ Copyright (c) 2001, Daniel C. Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ITERATOR_MULTI_PASS_HPP
+#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_HPP
+
+#include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+#include <deque>
+#include <iterator>
+#include <iostream>
+#include <algorithm> // for std::swap
+#include <exception> // for std::exception
+#include <boost/limits.hpp>
+#include <boost/iterator.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/assert.hpp> // for BOOST_SPIRIT_ASSERT
+#include <boost/spirit/home/classic/iterator/fixed_size_queue.hpp>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+
+#include <boost/spirit/home/classic/iterator/multi_pass_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace impl {
+ template <typename T>
+ inline void mp_swap(T& t1, T& t2);
+}
+
+namespace multi_pass_policies
+{
+
+///////////////////////////////////////////////////////////////////////////////
+// class ref_counted
+// Implementation of an OwnershipPolicy used by multi_pass.
+//
+// Implementation modified from RefCounted class from the Loki library by
+// Andrei Alexandrescu
+///////////////////////////////////////////////////////////////////////////////
+class ref_counted
+{
+ protected:
+ ref_counted()
+ : count(new std::size_t(1))
+ {}
+
+ ref_counted(ref_counted const& x)
+ : count(x.count)
+ {}
+
+ // clone is called when a copy of the iterator is made, so increment
+ // the ref-count.
+ void clone()
+ {
+ ++*count;
+ }
+
+ // called when a copy is deleted. Decrement the ref-count. Return
+ // value of true indicates that the last copy has been released.
+ bool release()
+ {
+ if (!--*count)
+ {
+ delete count;
+ count = 0;
+ return true;
+ }
+ return false;
+ }
+
+ void swap(ref_counted& x)
+ {
+ impl::mp_swap(count, x.count);
+ }
+
+ public:
+ // returns true if there is only one iterator in existence.
+ // std_deque StoragePolicy will free it's buffered data if this
+ // returns true.
+ bool unique() const
+ {
+ return *count == 1;
+ }
+
+ private:
+ std::size_t* count;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class first_owner
+// Implementation of an OwnershipPolicy used by multi_pass
+// This ownership policy dictates that the first iterator created will
+// determine the lifespan of the shared components. This works well for
+// spirit, since no dynamic allocation of iterators is done, and all copies
+// are make on the stack.
+//
+// There is a caveat about using this policy together with the std_deque
+// StoragePolicy. Since first_owner always returns false from unique(),
+// std_deque will only release the queued data if clear_queue() is called.
+///////////////////////////////////////////////////////////////////////////////
+class first_owner
+{
+ protected:
+ first_owner()
+ : first(true)
+ {}
+
+ first_owner(first_owner const&)
+ : first(false)
+ {}
+
+ void clone()
+ {
+ }
+
+ // return true to indicate deletion of resources
+ bool release()
+ {
+ return first;
+ }
+
+ void swap(first_owner&)
+ {
+ // if we're the first, we still remain the first, even if assigned
+ // to, so don't swap first_. swap is only called from operator=
+ }
+
+ public:
+ bool unique() const
+ {
+ return false; // no way to know, so always return false
+ }
+
+ private:
+ bool first;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class illegal_backtracking
+// thrown by buf_id_check CheckingPolicy if an instance of an iterator is
+// used after another one has invalidated the queue
+///////////////////////////////////////////////////////////////////////////////
+class illegal_backtracking : public std::exception
+{
+public:
+
+ illegal_backtracking() throw() {}
+ ~illegal_backtracking() throw() {}
+
+ virtual const char*
+ what() const throw()
+ { return "BOOST_SPIRIT_CLASSIC_NS::illegal_backtracking"; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class buf_id_check
+// Implementation of the CheckingPolicy used by multi_pass
+// This policy is most effective when used together with the std_deque
+// StoragePolicy.
+// If used with the fixed_size_queue StoragePolicy, it will not detect
+// iterator derefereces that are out of the range of the queue.
+///////////////////////////////////////////////////////////////////////////////
+class buf_id_check
+{
+ protected:
+ buf_id_check()
+ : shared_buf_id(new unsigned long(0))
+ , buf_id(0)
+ {}
+
+ buf_id_check(buf_id_check const& x)
+ : shared_buf_id(x.shared_buf_id)
+ , buf_id(x.buf_id)
+ {}
+
+ // will be called from the destructor of the last iterator.
+ void destroy()
+ {
+ delete shared_buf_id;
+ shared_buf_id = 0;
+ }
+
+ void swap(buf_id_check& x)
+ {
+ impl::mp_swap(shared_buf_id, x.shared_buf_id);
+ impl::mp_swap(buf_id, x.buf_id);
+ }
+
+ // called to verify that everything is okay.
+ void check() const
+ {
+ if (buf_id != *shared_buf_id)
+ {
+ boost::throw_exception(illegal_backtracking());
+ }
+ }
+
+ // called from multi_pass::clear_queue, so we can increment the count
+ void clear_queue()
+ {
+ ++*shared_buf_id;
+ ++buf_id;
+ }
+
+ private:
+ unsigned long* shared_buf_id;
+ unsigned long buf_id;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class no_check
+// Implementation of the CheckingPolicy used by multi_pass
+// It does not do anything :-)
+///////////////////////////////////////////////////////////////////////////////
+class no_check
+{
+ protected:
+ no_check() {}
+ no_check(no_check const&) {}
+ void destroy() {}
+ void swap(no_check&) {}
+ void check() const {}
+ void clear_queue() {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class std_deque
+// Implementation of the StoragePolicy used by multi_pass
+// This stores all data in a std::deque, and keeps an offset to the current
+// position. It stores all the data unless there is only one
+// iterator using the queue.
+// Note: a position is used instead of an iterator, because a push_back on
+// a deque can invalidate any iterators.
+///////////////////////////////////////////////////////////////////////////////
+class std_deque
+{
+ public:
+
+template <typename ValueT>
+class inner
+{
+ private:
+
+ typedef std::deque<ValueT> queue_type;
+ queue_type* queuedElements;
+ mutable typename queue_type::size_type queuePosition;
+
+ protected:
+ inner()
+ : queuedElements(new queue_type)
+ , queuePosition(0)
+ {}
+
+ inner(inner const& x)
+ : queuedElements(x.queuedElements)
+ , queuePosition(x.queuePosition)
+ {}
+
+ // will be called from the destructor of the last iterator.
+ void destroy()
+ {
+ BOOST_SPIRIT_ASSERT(NULL != queuedElements);
+ delete queuedElements;
+ queuedElements = 0;
+ }
+
+ void swap(inner& x)
+ {
+ impl::mp_swap(queuedElements, x.queuedElements);
+ impl::mp_swap(queuePosition, x.queuePosition);
+ }
+
+ // This is called when the iterator is dereferenced. It's a template
+ // method so we can recover the type of the multi_pass iterator
+ // and call unique and access the m_input data member.
+ template <typename MultiPassT>
+ static typename MultiPassT::reference dereference(MultiPassT const& mp)
+ {
+ if (mp.queuePosition == mp.queuedElements->size())
+ {
+ // check if this is the only iterator
+ if (mp.unique())
+ {
+ // free up the memory used by the queue.
+ if (mp.queuedElements->size() > 0)
+ {
+ mp.queuedElements->clear();
+ mp.queuePosition = 0;
+ }
+ }
+ return mp.get_input();
+ }
+ else
+ {
+ return (*mp.queuedElements)[mp.queuePosition];
+ }
+ }
+
+ // This is called when the iterator is incremented. It's a template
+ // method so we can recover the type of the multi_pass iterator
+ // and call unique and access the m_input data member.
+ template <typename MultiPassT>
+ static void increment(MultiPassT& mp)
+ {
+ if (mp.queuePosition == mp.queuedElements->size())
+ {
+ // check if this is the only iterator
+ if (mp.unique())
+ {
+ // free up the memory used by the queue.
+ if (mp.queuedElements->size() > 0)
+ {
+ mp.queuedElements->clear();
+ mp.queuePosition = 0;
+ }
+ }
+ else
+ {
+ mp.queuedElements->push_back(mp.get_input());
+ ++mp.queuePosition;
+ }
+ mp.advance_input();
+ }
+ else
+ {
+ ++mp.queuePosition;
+ }
+
+ }
+
+ // called to forcibly clear the queue
+ void clear_queue()
+ {
+ queuedElements->clear();
+ queuePosition = 0;
+ }
+
+ // called to determine whether the iterator is an eof iterator
+ template <typename MultiPassT>
+ static bool is_eof(MultiPassT const& mp)
+ {
+ return mp.queuePosition == mp.queuedElements->size() &&
+ mp.input_at_eof();
+ }
+
+ // called by operator==
+ bool equal_to(inner const& x) const
+ {
+ return queuePosition == x.queuePosition;
+ }
+
+ // called by operator<
+ bool less_than(inner const& x) const
+ {
+ return queuePosition < x.queuePosition;
+ }
+}; // class inner
+
+}; // class std_deque
+
+
+///////////////////////////////////////////////////////////////////////////////
+// class fixed_size_queue
+// Implementation of the StoragePolicy used by multi_pass
+// fixed_size_queue keeps a circular buffer (implemented by
+// BOOST_SPIRIT_CLASSIC_NS::fixed_size_queue class) that is size N+1 and stores N elements.
+// It is up to the user to ensure that there is enough look ahead for their
+// grammar. Currently there is no way to tell if an iterator is pointing
+// to forgotten data. The leading iterator will put an item in the queue
+// and remove one when it is incremented. No dynamic allocation is done,
+// except on creation of the queue (fixed_size_queue constructor).
+///////////////////////////////////////////////////////////////////////////////
+template < std::size_t N>
+class fixed_size_queue
+{
+ public:
+
+template <typename ValueT>
+class inner
+{
+ private:
+
+ typedef BOOST_SPIRIT_CLASSIC_NS::fixed_size_queue<ValueT, N> queue_type;
+ queue_type * queuedElements;
+ mutable typename queue_type::iterator queuePosition;
+
+ protected:
+ inner()
+ : queuedElements(new queue_type)
+ , queuePosition(queuedElements->begin())
+ {}
+
+ inner(inner const& x)
+ : queuedElements(x.queuedElements)
+ , queuePosition(x.queuePosition)
+ {}
+
+ // will be called from the destructor of the last iterator.
+ void destroy()
+ {
+ BOOST_SPIRIT_ASSERT(NULL != queuedElements);
+ delete queuedElements;
+ queuedElements = 0;
+ }
+
+ void swap(inner& x)
+ {
+ impl::mp_swap(queuedElements, x.queuedElements);
+ impl::mp_swap(queuePosition, x.queuePosition);
+ }
+
+ // This is called when the iterator is dereferenced. It's a template
+ // method so we can recover the type of the multi_pass iterator
+ // and access the m_input data member.
+ template <typename MultiPassT>
+ static typename MultiPassT::reference dereference(MultiPassT const& mp)
+ {
+ if (mp.queuePosition == mp.queuedElements->end())
+ {
+ return mp.get_input();
+ }
+ else
+ {
+ return *mp.queuePosition;
+ }
+ }
+
+ // This is called when the iterator is incremented. It's a template
+ // method so we can recover the type of the multi_pass iterator
+ // and access the m_input data member.
+ template <typename MultiPassT>
+ static void increment(MultiPassT& mp)
+ {
+ if (mp.queuePosition == mp.queuedElements->end())
+ {
+ // don't let the queue get larger than N
+ if (mp.queuedElements->size() >= N)
+ mp.queuedElements->pop_front();
+
+ mp.queuedElements->push_back(mp.get_input());
+ mp.advance_input();
+ }
+ ++mp.queuePosition;
+ }
+
+ // no-op
+ void clear_queue()
+ {}
+
+ // called to determine whether the iterator is an eof iterator
+ template <typename MultiPassT>
+ static bool is_eof(MultiPassT const& mp)
+ {
+ return mp.queuePosition == mp.queuedElements->end() &&
+ mp.input_at_eof();
+ }
+
+ // called by operator==
+ bool equal_to(inner const& x) const
+ {
+ return queuePosition == x.queuePosition;
+ }
+
+ // called by operator<
+ bool less_than(inner const& x) const
+ {
+ return queuePosition < x.queuePosition;
+ }
+}; // class inner
+
+}; // class fixed_size_queue
+
+
+///////////////////////////////////////////////////////////////////////////////
+// class input_iterator
+// Implementation of the InputPolicy used by multi_pass
+// input_iterator encapsulates an input iterator of type InputT
+///////////////////////////////////////////////////////////////////////////////
+class input_iterator
+{
+ public:
+
+template <typename InputT>
+class inner
+{
+ private:
+ typedef
+ typename boost::detail::iterator_traits<InputT>::value_type
+ result_type;
+
+ public:
+ typedef result_type value_type;
+
+ private:
+ struct Data {
+ Data(InputT const &input_)
+ : input(input_), was_initialized(false)
+ {}
+
+ InputT input;
+ value_type curtok;
+ bool was_initialized;
+ };
+
+ // Needed by compilers not implementing the resolution to DR45. For
+ // reference, see
+ // http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45.
+
+ friend struct Data;
+
+ public:
+ typedef
+ typename boost::detail::iterator_traits<InputT>::difference_type
+ difference_type;
+ typedef
+ typename boost::detail::iterator_traits<InputT>::pointer
+ pointer;
+ typedef
+ typename boost::detail::iterator_traits<InputT>::reference
+ reference;
+
+ protected:
+ inner()
+ : data(0)
+ {}
+
+ inner(InputT x)
+ : data(new Data(x))
+ {}
+
+ inner(inner const& x)
+ : data(x.data)
+ {}
+
+ void destroy()
+ {
+ delete data;
+ data = 0;
+ }
+
+ bool same_input(inner const& x) const
+ {
+ return data == x.data;
+ }
+
+ typedef
+ typename boost::detail::iterator_traits<InputT>::value_type
+ value_t;
+ void swap(inner& x)
+ {
+ impl::mp_swap(data, x.data);
+ }
+
+ void ensure_initialized() const
+ {
+ if (data && !data->was_initialized) {
+ data->curtok = *data->input; // get the first token
+ data->was_initialized = true;
+ }
+ }
+
+ public:
+ reference get_input() const
+ {
+ BOOST_SPIRIT_ASSERT(NULL != data);
+ ensure_initialized();
+ return data->curtok;
+ }
+
+ void advance_input()
+ {
+ BOOST_SPIRIT_ASSERT(NULL != data);
+ data->was_initialized = false; // should get the next token
+ ++data->input;
+ }
+
+ bool input_at_eof() const
+ {
+ return !data || data->input == InputT();
+ }
+
+ private:
+ Data *data;
+};
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class lex_input
+// Implementation of the InputPolicy used by multi_pass
+// lex_input gets tokens (ints) from yylex()
+///////////////////////////////////////////////////////////////////////////////
+class lex_input
+{
+ public:
+
+template <typename InputT>
+class inner
+{
+ public:
+ typedef int value_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef int* pointer;
+ typedef int& reference;
+
+ protected:
+ inner()
+ : curtok(new int(0))
+ {}
+
+ inner(InputT x)
+ : curtok(new int(x))
+ {}
+
+ inner(inner const& x)
+ : curtok(x.curtok)
+ {}
+
+ void destroy()
+ {
+ delete curtok;
+ curtok = 0;
+ }
+
+ bool same_input(inner const& x) const
+ {
+ return curtok == x.curtok;
+ }
+
+ void swap(inner& x)
+ {
+ impl::mp_swap(curtok, x.curtok);
+ }
+
+ public:
+ reference get_input() const
+ {
+ return *curtok;
+ }
+
+ void advance_input()
+ {
+ extern int yylex();
+ *curtok = yylex();
+ }
+
+ bool input_at_eof() const
+ {
+ return *curtok == 0;
+ }
+
+ private:
+ int* curtok;
+
+};
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class functor_input
+// Implementation of the InputPolicy used by multi_pass
+// functor_input gets tokens from a functor
+// Note: the functor must have a typedef for result_type
+// It also must have a static variable of type result_type defined to
+// represent eof that is called eof.
+///////////////////////////////////////////////////////////////////////////////
+class functor_input
+{
+ public:
+
+template <typename FunctorT>
+class inner
+{
+ typedef typename FunctorT::result_type result_type;
+ public:
+ typedef result_type value_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef result_type* pointer;
+ typedef result_type& reference;
+
+ protected:
+ inner()
+ : ftor(0)
+ , curtok(0)
+ {}
+
+ inner(FunctorT const& x)
+ : ftor(new FunctorT(x))
+ , curtok(new result_type((*ftor)()))
+ {}
+
+ inner(inner const& x)
+ : ftor(x.ftor)
+ , curtok(x.curtok)
+ {}
+
+ void destroy()
+ {
+ delete ftor;
+ ftor = 0;
+ delete curtok;
+ curtok = 0;
+ }
+
+ bool same_input(inner const& x) const
+ {
+ return ftor == x.ftor;
+ }
+
+ void swap(inner& x)
+ {
+ impl::mp_swap(curtok, x.curtok);
+ impl::mp_swap(ftor, x.ftor);
+ }
+
+ public:
+ reference get_input() const
+ {
+ return *curtok;
+ }
+
+ void advance_input()
+ {
+ if (curtok) {
+ *curtok = (*ftor)();
+ }
+ }
+
+ bool input_at_eof() const
+ {
+ return !curtok || *curtok == ftor->eof;
+ }
+
+ FunctorT& get_functor() const
+ {
+ return *ftor;
+ }
+
+
+ private:
+ FunctorT* ftor;
+ result_type* curtok;
+
+};
+
+};
+
+} // namespace multi_pass_policies
+
+///////////////////////////////////////////////////////////////////////////////
+// iterator_base_creator
+///////////////////////////////////////////////////////////////////////////////
+
+namespace iterator_ { namespace impl {
+
+// Meta-function to generate a std::iterator<> base class for multi_pass. This
+// is used mainly to improve conformance of compilers not supporting PTS
+// and thus relying on inheritance to recognize an iterator.
+// We are using boost::iterator<> because it offers an automatic workaround
+// for broken std::iterator<> implementations.
+template <typename InputPolicyT, typename InputT>
+struct iterator_base_creator
+{
+ typedef typename InputPolicyT::BOOST_NESTED_TEMPLATE inner<InputT> input_t;
+
+ typedef boost::iterator
+ <
+ std::forward_iterator_tag,
+ typename input_t::value_type,
+ typename input_t::difference_type,
+ typename input_t::pointer,
+ typename input_t::reference
+ > type;
+};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+// class template multi_pass
+///////////////////////////////////////////////////////////////////////////////
+
+// The default multi_pass instantiation uses a ref-counted std_deque scheme.
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+class multi_pass
+ : public OwnershipPolicy
+ , public CheckingPolicy
+ , public StoragePolicy::template inner<
+ typename InputPolicy::template inner<InputT>::value_type>
+ , public InputPolicy::template inner<InputT>
+ , public iterator_::impl::iterator_base_creator<InputPolicy, InputT>::type
+{
+ typedef OwnershipPolicy OP;
+ typedef CheckingPolicy CHP;
+ typedef typename StoragePolicy::template inner<
+ typename InputPolicy::template inner<InputT>::value_type> SP;
+ typedef typename InputPolicy::template inner<InputT> IP;
+ typedef typename
+ iterator_::impl::iterator_base_creator<InputPolicy, InputT>::type
+ IB;
+
+ public:
+ typedef typename IB::value_type value_type;
+ typedef typename IB::difference_type difference_type;
+ typedef typename IB::reference reference;
+ typedef typename IB::pointer pointer;
+ typedef InputT iterator_type;
+
+ multi_pass();
+ explicit multi_pass(InputT input);
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+ multi_pass(int);
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+ ~multi_pass();
+
+ multi_pass(multi_pass const&);
+ multi_pass& operator=(multi_pass const&);
+
+ void swap(multi_pass& x);
+
+ reference operator*() const;
+ pointer operator->() const;
+ multi_pass& operator++();
+ multi_pass operator++(int);
+
+ void clear_queue();
+
+ bool operator==(const multi_pass& y) const;
+ bool operator<(const multi_pass& y) const;
+
+ private: // helper functions
+ bool is_eof() const;
+};
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+multi_pass()
+ : OP()
+ , CHP()
+ , SP()
+ , IP()
+{
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+multi_pass(InputT input)
+ : OP()
+ , CHP()
+ , SP()
+ , IP(input)
+{
+}
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+ // The standard library shipped with gcc-3.1 has a bug in
+ // bits/basic_string.tcc. It tries to use iter::iter(0) to
+ // construct an iterator. Ironically, this happens in sanity
+ // checking code that isn't required by the standard.
+ // The workaround is to provide an additional constructor that
+ // ignores its int argument and behaves like the default constructor.
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+multi_pass(int)
+ : OP()
+ , CHP()
+ , SP()
+ , IP()
+{
+}
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+~multi_pass()
+{
+ if (OP::release())
+ {
+ CHP::destroy();
+ SP::destroy();
+ IP::destroy();
+ }
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+multi_pass(
+ multi_pass const& x)
+ : OP(x)
+ , CHP(x)
+ , SP(x)
+ , IP(x)
+{
+ OP::clone();
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>&
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator=(
+ multi_pass const& x)
+{
+ multi_pass temp(x);
+ temp.swap(*this);
+ return *this;
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline void
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+swap(multi_pass& x)
+{
+ OP::swap(x);
+ CHP::swap(x);
+ SP::swap(x);
+ IP::swap(x);
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+typename multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+reference
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator*() const
+{
+ CHP::check();
+ return SP::dereference(*this);
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+typename multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+pointer
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator->() const
+{
+ return &(operator*());
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>&
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator++()
+{
+ CHP::check();
+ SP::increment(*this);
+ return *this;
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator++(int)
+{
+ multi_pass
+ <
+ InputT,
+ InputPolicy,
+ OwnershipPolicy,
+ CheckingPolicy,
+ StoragePolicy
+ > tmp(*this);
+
+ ++*this;
+
+ return tmp;
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline void
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+clear_queue()
+{
+ SP::clear_queue();
+ CHP::clear_queue();
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline bool
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+is_eof() const
+{
+ return SP::is_eof(*this);
+}
+
+///// Comparisons
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline bool
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator==(const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& y) const
+{
+ bool is_eof_ = SP::is_eof(*this);
+ bool y_is_eof_ = SP::is_eof(y);
+
+ if (is_eof_ && y_is_eof_)
+ {
+ return true; // both are EOF
+ }
+ else if (is_eof_ ^ y_is_eof_)
+ {
+ return false; // one is EOF, one isn't
+ }
+ else if (!IP::same_input(y))
+ {
+ return false;
+ }
+ else
+ {
+ return SP::equal_to(y);
+ }
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline bool
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator<(const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& y) const
+{
+ return SP::less_than(y);
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+bool operator!=(
+ const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& x,
+ const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& y)
+{
+ return !(x == y);
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+bool operator>(
+ const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& x,
+ const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& y)
+{
+ return y < x;
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+bool operator>=(
+ const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& x,
+ const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& y)
+{
+ return !(x < y);
+}
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+inline
+bool operator<=(
+ const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& x,
+ const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+ StoragePolicy>& y)
+{
+ return !(y < x);
+}
+
+///// Generator function
+template <typename InputT>
+inline multi_pass<InputT,
+ multi_pass_policies::input_iterator, multi_pass_policies::ref_counted,
+ multi_pass_policies::buf_id_check, multi_pass_policies::std_deque>
+make_multi_pass(InputT i)
+{
+ return multi_pass<InputT,
+ multi_pass_policies::input_iterator, multi_pass_policies::ref_counted,
+ multi_pass_policies::buf_id_check, multi_pass_policies::std_deque>(i);
+}
+
+// this could be a template typedef, since such a thing doesn't
+// exist in C++, we'll use inheritance to accomplish the same thing.
+
+template <typename InputT, std::size_t N>
+class look_ahead :
+ public multi_pass<
+ InputT,
+ multi_pass_policies::input_iterator,
+ multi_pass_policies::first_owner,
+ multi_pass_policies::no_check,
+ multi_pass_policies::fixed_size_queue<N> >
+{
+ typedef multi_pass<
+ InputT,
+ multi_pass_policies::input_iterator,
+ multi_pass_policies::first_owner,
+ multi_pass_policies::no_check,
+ multi_pass_policies::fixed_size_queue<N> > base_t;
+ public:
+ look_ahead()
+ : base_t() {}
+
+ explicit look_ahead(InputT x)
+ : base_t(x) {}
+
+ look_ahead(look_ahead const& x)
+ : base_t(x) {}
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+ look_ahead(int) // workaround for a bug in the library
+ : base_t() {} // shipped with gcc 3.1
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+ // default generated operators destructor and assignment operator are okay.
+};
+
+template
+<
+ typename InputT,
+ typename InputPolicy,
+ typename OwnershipPolicy,
+ typename CheckingPolicy,
+ typename StoragePolicy
+>
+void swap(
+ multi_pass<
+ InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy
+ > &x,
+ multi_pass<
+ InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy
+ > &y)
+{
+ x.swap(y);
+}
+
+namespace impl {
+
+ template <typename T>
+ inline void mp_swap(T& t1, T& t2)
+ {
+ using std::swap;
+ using BOOST_SPIRIT_CLASSIC_NS::swap;
+ swap(t1, t2);
+ }
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_ITERATOR_MULTI_PASS_HPP
+
+
diff --git a/boost/spirit/home/classic/iterator/multi_pass_fwd.hpp b/boost/spirit/home/classic/iterator/multi_pass_fwd.hpp
new file mode 100644
index 0000000000..a212305ac2
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/multi_pass_fwd.hpp
@@ -0,0 +1,47 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ITERATOR_MULTI_PASS_FWD_HPP)
+#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_FWD_HPP
+
+#include <cstddef>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace multi_pass_policies
+ {
+ class ref_counted;
+ class first_owner;
+ class buf_id_check;
+ class no_check;
+ class std_deque;
+ template<std::size_t N> class fixed_size_queue;
+ class input_iterator;
+ class lex_input;
+ class functor_input;
+ }
+
+ template
+ <
+ typename InputT,
+ typename InputPolicy = multi_pass_policies::input_iterator,
+ typename OwnershipPolicy = multi_pass_policies::ref_counted,
+ typename CheckingPolicy = multi_pass_policies::buf_id_check,
+ typename StoragePolicy = multi_pass_policies::std_deque
+ >
+ class multi_pass;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/iterator/position_iterator.hpp b/boost/spirit/home/classic/iterator/position_iterator.hpp
new file mode 100644
index 0000000000..e352f883ae
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/position_iterator.hpp
@@ -0,0 +1,436 @@
+/*=============================================================================
+ Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+ Copyright (c) 2002-2006 Hartmut Kaiser
+ Copyright (c) 2003 Giovanni Bajo
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_POSITION_ITERATOR_HPP
+#define BOOST_SPIRIT_POSITION_ITERATOR_HPP
+
+#include <string>
+#include <boost/config.hpp>
+#include <boost/concept_check.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/iterator/position_iterator_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// file_position_without_column
+//
+// A structure to hold positional information. This includes the file,
+// and the line number
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename String>
+struct file_position_without_column_base {
+ String file;
+ int line;
+
+ file_position_without_column_base(String const& file_ = String(),
+ int line_ = 1):
+ file (file_),
+ line (line_)
+ {}
+
+ bool operator==(const file_position_without_column_base& fp) const
+ { return line == fp.line && file == fp.file; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// file_position
+//
+// This structure holds complete file position, including file name,
+// line and column number
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename String>
+struct file_position_base : public file_position_without_column_base<String> {
+ int column;
+
+ file_position_base(String const& file_ = String(),
+ int line_ = 1, int column_ = 1):
+ file_position_without_column_base<String> (file_, line_),
+ column (column_)
+ {}
+
+ bool operator==(const file_position_base& fp) const
+ { return column == fp.column && this->line == fp.line && this->file == fp.file; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// position_policy<>
+//
+// This template is the policy to handle the file position. It is specialized
+// on the position type. Providing a custom file_position also requires
+// providing a specialization of this class.
+//
+// Policy interface:
+//
+// Default constructor of the custom position class must be accessible.
+// set_tab_chars(unsigned int chars) - Set the tabstop width
+// next_char(PositionT& pos) - Notify that a new character has been
+// processed
+// tabulation(PositionT& pos) - Notify that a tab character has been
+// processed
+// next_line(PositionT& pos) - Notify that a new line delimiter has
+// been reached.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename PositionT> class position_policy;
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} /* namespace BOOST_SPIRIT_CLASSIC_NS */
+
+
+// This must be included here for full compatibility with old MSVC
+#include "boost/spirit/home/classic/iterator/impl/position_iterator.ipp"
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// position_iterator
+//
+// It wraps an iterator, and keeps track of the current position in the input,
+// as it gets incremented.
+//
+// The wrapped iterator must be at least a Forward iterator. The position
+// iterator itself will always be a non-mutable Forward iterator.
+//
+// In order to have begin/end iterators constructed, the end iterator must be
+// empty constructed. Similar to what happens with stream iterators. The begin
+// iterator must be constructed from both, the begin and end iterators of the
+// wrapped iterator type. This is necessary to implement the lookahead of
+// characters necessary to parse CRLF sequences.
+//
+// In order to extract the current positional data from the iterator, you may
+// use the get_position member function.
+//
+// You can also use the set_position member function to reset the current
+// position to something new.
+//
+// The structure that holds the current position can be customized through a
+// template parameter, and the class position_policy must be specialized
+// on the new type to define how to handle it. Currently, it's possible
+// to choose between the file_position and file_position_without_column
+// (which saves some overhead if managing current column is not required).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#if !defined(BOOST_ITERATOR_ADAPTORS_VERSION) || \
+ BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+#error "Please use at least Boost V1.31.0 while compiling the position_iterator class!"
+#else // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Uses the newer iterator_adaptor version (should be released with
+// Boost V1.31.0)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename ForwardIteratorT,
+ typename PositionT,
+ typename SelfT
+>
+class position_iterator
+: public iterator_::impl::position_iterator_base_generator<
+ SelfT,
+ ForwardIteratorT,
+ PositionT
+ >::type,
+ public position_policy<PositionT>
+{
+private:
+
+ typedef position_policy<PositionT> position_policy_t;
+ typedef typename iterator_::impl::position_iterator_base_generator<
+ SelfT,
+ ForwardIteratorT,
+ PositionT
+ >::type base_t;
+ typedef typename iterator_::impl::position_iterator_base_generator<
+ SelfT,
+ ForwardIteratorT,
+ PositionT
+ >::main_iter_t main_iter_t;
+
+public:
+
+ typedef PositionT position_t;
+
+ position_iterator()
+ : _isend(true)
+ {}
+
+ position_iterator(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end)
+ : base_t(begin), _end(end), _pos(PositionT()), _isend(begin == end)
+ {}
+
+ template <typename FileNameT>
+ position_iterator(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end,
+ FileNameT fileName)
+ : base_t(begin), _end(end), _pos(PositionT(fileName)),
+ _isend(begin == end)
+ {}
+
+ template <typename FileNameT, typename LineT>
+ position_iterator(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end,
+ FileNameT fileName, LineT line)
+ : base_t(begin), _end(end), _pos(PositionT(fileName, line)),
+ _isend(begin == end)
+ {}
+
+ template <typename FileNameT, typename LineT, typename ColumnT>
+ position_iterator(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end,
+ FileNameT fileName, LineT line, ColumnT column)
+ : base_t(begin), _end(end), _pos(PositionT(fileName, line, column)),
+ _isend(begin == end)
+ {}
+
+ position_iterator(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end,
+ const PositionT& pos)
+ : base_t(begin), _end(end), _pos(pos), _isend(begin == end)
+ {}
+
+ position_iterator(const position_iterator& iter)
+ : base_t(iter.base()), position_policy_t(iter),
+ _end(iter._end), _pos(iter._pos), _isend(iter._isend)
+ {}
+
+ position_iterator& operator=(const position_iterator& iter)
+ {
+ base_t::operator=(iter);
+ position_policy_t::operator=(iter);
+ _end = iter._end;
+ _pos = iter._pos;
+ _isend = iter._isend;
+ return *this;
+ }
+
+ void set_position(PositionT const& newpos) { _pos = newpos; }
+ PositionT& get_position() { return _pos; }
+ PositionT const& get_position() const { return _pos; }
+
+ void set_tabchars(unsigned int chars)
+ {
+ // This function (which comes from the position_policy) has a
+ // different name on purpose, to avoid messing with using
+ // declarations or qualified calls to access the base template
+ // function, which might break some compilers.
+ this->position_policy_t::set_tab_chars(chars);
+ }
+
+private:
+ friend class boost::iterator_core_access;
+
+ void increment()
+ {
+ typename base_t::reference val = *(this->base());
+ if (val == '\n') {
+ ++this->base_reference();
+ this->next_line(_pos);
+ static_cast<main_iter_t &>(*this).newline();
+ }
+ else if ( val == '\r') {
+ ++this->base_reference();
+ if (this->base_reference() == _end || *(this->base()) != '\n')
+ {
+ this->next_line(_pos);
+ static_cast<main_iter_t &>(*this).newline();
+ }
+ }
+ else if (val == '\t') {
+ this->tabulation(_pos);
+ ++this->base_reference();
+ }
+ else {
+ this->next_char(_pos);
+ ++this->base_reference();
+ }
+
+ // The iterator is at the end only if it's the same
+ // of the
+ _isend = (this->base_reference() == _end);
+ }
+
+ template <
+ typename OtherDerivedT, typename OtherIteratorT,
+ typename V, typename C, typename R, typename D
+ >
+ bool equal(iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D>
+ const &x) const
+ {
+ OtherDerivedT const &rhs = static_cast<OtherDerivedT const &>(x);
+ bool x_is_end = rhs._isend;
+
+ return (_isend == x_is_end) && (_isend || this->base() == rhs.base());
+ }
+
+protected:
+
+ void newline(void)
+ {}
+
+ ForwardIteratorT _end;
+ PositionT _pos;
+ bool _isend;
+};
+
+#endif // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// position_iterator2
+//
+// Equivalent to position_iterator, but it is able to extract the current
+// line into a string. This is very handy for error reports.
+//
+// Notice that the footprint of this class is higher than position_iterator,
+// (how much depends on how bulky the underlying iterator is), so it should
+// be used only if necessary.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template
+<
+ typename ForwardIteratorT,
+ typename PositionT
+>
+class position_iterator2
+ : public position_iterator
+ <
+ ForwardIteratorT,
+ PositionT,
+ position_iterator2<ForwardIteratorT, PositionT>
+ >
+{
+ typedef position_iterator
+ <
+ ForwardIteratorT,
+ PositionT,
+ position_iterator2<ForwardIteratorT, PositionT> // JDG 4-15-03
+ > base_t;
+
+public:
+ typedef typename base_t::value_type value_type;
+ typedef PositionT position_t;
+
+ position_iterator2()
+ {}
+
+ position_iterator2(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end):
+ base_t(begin, end),
+ _startline(begin)
+ {}
+
+ template <typename FileNameT>
+ position_iterator2(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end,
+ FileNameT file):
+ base_t(begin, end, file),
+ _startline(begin)
+ {}
+
+ template <typename FileNameT, typename LineT>
+ position_iterator2(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end,
+ FileNameT file, LineT line):
+ base_t(begin, end, file, line),
+ _startline(begin)
+ {}
+
+ template <typename FileNameT, typename LineT, typename ColumnT>
+ position_iterator2(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end,
+ FileNameT file, LineT line, ColumnT column):
+ base_t(begin, end, file, line, column),
+ _startline(begin)
+ {}
+
+ position_iterator2(
+ const ForwardIteratorT& begin,
+ const ForwardIteratorT& end,
+ const PositionT& pos):
+ base_t(begin, end, pos),
+ _startline(begin)
+ {}
+
+ position_iterator2(const position_iterator2& iter)
+ : base_t(iter), _startline(iter._startline)
+ {}
+
+ position_iterator2& operator=(const position_iterator2& iter)
+ {
+ base_t::operator=(iter);
+ _startline = iter._startline;
+ return *this;
+ }
+
+ ForwardIteratorT get_currentline_begin(void) const
+ { return _startline; }
+
+ ForwardIteratorT get_currentline_end(void) const
+ { return get_endline(); }
+
+ std::basic_string<value_type> get_currentline(void) const
+ {
+ return std::basic_string<value_type>
+ (get_currentline_begin(), get_currentline_end());
+ }
+
+protected:
+ ForwardIteratorT _startline;
+
+ friend class position_iterator<ForwardIteratorT, PositionT,
+ position_iterator2<ForwardIteratorT, PositionT> >;
+
+ ForwardIteratorT get_endline() const
+ {
+ ForwardIteratorT endline = _startline;
+ while (endline != this->_end && *endline != '\r' && *endline != '\n')
+ {
+ ++endline;
+ }
+ return endline;
+ }
+
+ void newline(void)
+ { _startline = this->base(); }
+};
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/iterator/position_iterator_fwd.hpp b/boost/spirit/home/classic/iterator/position_iterator_fwd.hpp
new file mode 100644
index 0000000000..f194e24cab
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/position_iterator_fwd.hpp
@@ -0,0 +1,60 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ Copyright (c) 2002-2006 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_POSITION_ITERATOR_FWD_HPP)
+#define BOOST_SPIRIT_POSITION_ITERATOR_FWD_HPP
+
+#include <string>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename String = std::string>
+ struct file_position_base;
+
+ typedef file_position_base<std::string> file_position;
+
+ template <typename String = std::string>
+ struct file_position_without_column_base;
+
+ typedef file_position_without_column_base<std::string> file_position_without_column;
+
+ template <
+ typename ForwardIteratorT,
+ typename PositionT = file_position_base<
+ std::basic_string<
+ typename boost::detail::iterator_traits<ForwardIteratorT>::value_type
+ >
+ >,
+ typename SelfT = nil_t
+ >
+ class position_iterator;
+
+ template
+ <
+ typename ForwardIteratorT,
+ typename PositionT = file_position_base<
+ std::basic_string<
+ typename boost::detail::iterator_traits<ForwardIteratorT>::value_type
+ >
+ >
+ >
+ class position_iterator2;
+
+ template <typename PositionT> class position_policy;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/iterator/typeof.hpp b/boost/spirit/home/classic/iterator/typeof.hpp
new file mode 100644
index 0000000000..23882cab64
--- /dev/null
+++ b/boost/spirit/home/classic/iterator/typeof.hpp
@@ -0,0 +1,94 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ITERATOR_TYPEOF_HPP)
+#define BOOST_SPIRIT_ITERATOR_TYPEOF_HPP
+
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/string.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/iterator/multi_pass_fwd.hpp>
+#include <boost/spirit/home/classic/iterator/file_iterator_fwd.hpp>
+#include <boost/spirit/home/classic/iterator/position_iterator_fwd.hpp>
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ // external (from core)
+ struct nil_t;
+
+ // fixed_size_queue.hpp
+ template<typename T, std::size_t N> class fixed_size_queue;
+ template<typename QueueT, typename T, typename PointerT>
+ class fsq_iterator;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+#if !defined(BOOST_SPIRIT_NIL_T_TYPEOF_REGISTERED)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::nil_t)
+# define BOOST_SPIRIT_NIL_T_TYPEOF_REGISTERED
+#endif
+
+
+// multi_pass.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::multi_pass,5)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::ref_counted)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::first_owner)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::buf_id_check)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::no_check)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::std_deque)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::fixed_size_queue,(BOOST_TYPEOF_INTEGRAL(std::size_t)))
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::input_iterator)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::lex_input)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::functor_input)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::multi_pass,3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::multi_pass,1)
+
+
+// file_iterator.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::file_iterator,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::fileiter_impl::std_file_iterator,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::fileiter_impl::mmap_file_iterator,1)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::fileiter_impl::std_file_iterator<char>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::fileiter_impl::std_file_iterator<wchar_t>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::fileiter_impl::mmap_file_iterator<char>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::fileiter_impl::mmap_file_iterator<wchar_t>)
+
+
+// fixed_size_queue.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::fixed_size_queue,(typename)(BOOST_TYPEOF_INTEGRAL(std::size_t)))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::fsq_iterator,3)
+
+
+// position_iterator.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::position_iterator,3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::position_iterator2,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::position_policy,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::file_position_base,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::file_position_without_column_base,1)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::file_position)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::file_position_base<std::basic_string<wchar_t> >)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::file_position_without_column)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::file_position_without_column_base<std::basic_string<wchar_t> >)
+
+#endif
+
diff --git a/boost/spirit/home/classic/meta.hpp b/boost/spirit/home/classic/meta.hpp
new file mode 100644
index 0000000000..bdb93c5bb0
--- /dev/null
+++ b/boost/spirit/home/classic/meta.hpp
@@ -0,0 +1,26 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_META_MAIN_HPP)
+#define BOOST_SPIRIT_META_MAIN_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Master header for Spirit.Meta
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/home/classic/meta/fundamental.hpp>
+#include <boost/spirit/home/classic/meta/parser_traits.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+#include <boost/spirit/home/classic/meta/traverse.hpp>
+
+#endif // BOOST_SPIRIT_CORE_MAIN_HPP
+
diff --git a/boost/spirit/home/classic/meta/as_parser.hpp b/boost/spirit/home/classic/meta/as_parser.hpp
new file mode 100644
index 0000000000..c5cc82d643
--- /dev/null
+++ b/boost/spirit/home/classic/meta/as_parser.hpp
@@ -0,0 +1,113 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_AS_PARSER_HPP)
+#define BOOST_SPIRIT_AS_PARSER_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Helper templates to derive the parser type from an auxilliary type
+ // and to generate an object of the required parser type given an
+ // auxilliary object. Supported types to convert are parsers,
+ // single characters and character strings.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ namespace impl
+ {
+ template<typename T>
+ struct default_as_parser
+ {
+ typedef T type;
+ static type const& convert(type const& p)
+ {
+ return p;
+ }
+ };
+
+ struct char_as_parser
+ {
+ typedef chlit<char> type;
+ static type convert(char ch)
+ {
+ return type(ch);
+ }
+ };
+
+ struct wchar_as_parser
+ {
+ typedef chlit<wchar_t> type;
+ static type convert(wchar_t ch)
+ {
+ return type(ch);
+ }
+ };
+
+ struct string_as_parser
+ {
+ typedef strlit<char const*> type;
+ static type convert(char const* str)
+ {
+ return type(str);
+ }
+ };
+
+ struct wstring_as_parser
+ {
+ typedef strlit<wchar_t const*> type;
+ static type convert(wchar_t const* str)
+ {
+ return type(str);
+ }
+ };
+ }
+
+ template<typename T>
+ struct as_parser : impl::default_as_parser<T> {};
+
+ template<>
+ struct as_parser<char> : impl::char_as_parser {};
+
+ template<>
+ struct as_parser<wchar_t> : impl::wchar_as_parser {};
+
+ template<>
+ struct as_parser<char*> : impl::string_as_parser {};
+
+ template<>
+ struct as_parser<char const*> : impl::string_as_parser {};
+
+ template<>
+ struct as_parser<wchar_t*> : impl::wstring_as_parser {};
+
+ template<>
+ struct as_parser<wchar_t const*> : impl::wstring_as_parser {};
+
+ template<int N>
+ struct as_parser<char[N]> : impl::string_as_parser {};
+
+ template<int N>
+ struct as_parser<wchar_t[N]> : impl::wstring_as_parser {};
+
+ template<int N>
+ struct as_parser<char const[N]> : impl::string_as_parser {};
+
+ template<int N>
+ struct as_parser<wchar_t const[N]> : impl::wstring_as_parser {};
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/meta/fundamental.hpp b/boost/spirit/home/classic/meta/fundamental.hpp
new file mode 100644
index 0000000000..c7fcf04492
--- /dev/null
+++ b/boost/spirit/home/classic/meta/fundamental.hpp
@@ -0,0 +1,56 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_FUNDAMENTAL_HPP)
+#define BOOST_SPIRIT_FUNDAMENTAL_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/meta/impl/fundamental.ipp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Helper template for counting the number of nodes contained in a
+ // given parser type.
+ // All parser_category type parsers are counted as nodes.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ParserT>
+ struct node_count {
+
+ typedef typename ParserT::parser_category_t parser_category_t;
+ typedef typename impl::nodes<parser_category_t>
+ ::template count<ParserT, mpl::int_<0> > count_t;
+
+ BOOST_STATIC_CONSTANT(int, value = count_t::value);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Helper template for counting the number of leaf nodes contained in a
+ // given parser type.
+ // Only plain_parser_category type parsers are counted as leaf nodes.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ParserT>
+ struct leaf_count {
+
+ typedef typename ParserT::parser_category_t parser_category_t;
+ typedef typename impl::leafs<parser_category_t>
+ ::template count<ParserT, mpl::int_<0> > count_t;
+
+ BOOST_STATIC_CONSTANT(int, value = count_t::value);
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // !defined(BOOST_SPIRIT_FUNDAMENTAL_HPP)
diff --git a/boost/spirit/home/classic/meta/impl/fundamental.ipp b/boost/spirit/home/classic/meta/impl/fundamental.ipp
new file mode 100644
index 0000000000..798f22b61a
--- /dev/null
+++ b/boost/spirit/home/classic/meta/impl/fundamental.ipp
@@ -0,0 +1,309 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_FUNDAMENTAL_IPP)
+#define BOOST_SPIRIT_FUNDAMENTAL_IPP
+
+#include <boost/mpl/int.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+ BOOST_SPIRIT_DEPENDENT_TEMPLATE_WRAPPER2(count_wrapper, count);
+#endif // defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+
+namespace impl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Helper template for counting the number of nodes contained in a
+ // given parser type.
+ // All parser_category type parsers are counted as nodes.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CategoryT>
+ struct nodes;
+
+ template <>
+ struct nodes<plain_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+ enum { value = (LeafCountT::value + 1) };
+ };
+ };
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+
+ template <>
+ struct nodes<unary_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ typedef nodes<subject_category_t> nodes_t;
+ typedef typename count_wrapper<nodes_t>
+ ::template result_<subject_t, LeafCountT> count_t;
+
+ BOOST_STATIC_CONSTANT(int, value = count_t::value + 1);
+ };
+ };
+
+ template <>
+ struct nodes<action_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ typedef nodes<subject_category_t> nodes_t;
+ typedef typename count_wrapper<nodes_t>
+ ::template result_<subject_t, LeafCountT> count_t;
+
+ BOOST_STATIC_CONSTANT(int, value = count_t::value + 1);
+ };
+ };
+
+ template <>
+ struct nodes<binary_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::left_t left_t;
+ typedef typename ParserT::right_t right_t;
+ typedef typename left_t::parser_category_t left_category_t;
+ typedef typename right_t::parser_category_t right_category_t;
+
+ typedef nodes<left_category_t> left_nodes_t;
+ typedef typename count_wrapper<left_nodes_t>
+ ::template result_<left_t, LeafCountT> left_count_t;
+
+ typedef nodes<right_category_t> right_nodes_t;
+ typedef typename count_wrapper<right_nodes_t>
+ ::template result_<right_t, LeafCountT> right_count_t;
+
+ BOOST_STATIC_CONSTANT(int,
+ value = (left_count_t::value + right_count_t::value + 1));
+ };
+ };
+
+#else
+
+ template <>
+ struct nodes<unary_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+ enum { value = (nodes<subject_category_t>
+ ::template count<subject_t, LeafCountT>::value + 1) };
+ };
+ };
+
+ template <>
+ struct nodes<action_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+ enum { value = (nodes<subject_category_t>
+ ::template count<subject_t, LeafCountT>::value + 1) };
+ };
+ };
+
+ template <>
+ struct nodes<binary_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::left_t left_t;
+ typedef typename ParserT::right_t right_t;
+ typedef typename left_t::parser_category_t left_category_t;
+ typedef typename right_t::parser_category_t right_category_t;
+
+ typedef count self_t;
+
+ // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+ enum {
+ leftcount = (nodes<left_category_t>
+ ::template count<left_t, LeafCountT>::value),
+ rightcount = (nodes<right_category_t>
+ ::template count<right_t, LeafCountT>::value),
+ value = ((self_t::leftcount) + (self_t::rightcount) + 1)
+ };
+ };
+ };
+
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Helper template for counting the number of leaf nodes contained in a
+ // given parser type.
+ // Only plain_parser_category type parsers are counted as leaf nodes.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CategoryT>
+ struct leafs;
+
+ template <>
+ struct leafs<plain_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+ enum { value = (LeafCountT::value + 1) };
+ };
+ };
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+
+ template <>
+ struct leafs<unary_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ typedef leafs<subject_category_t> nodes_t;
+ typedef typename count_wrapper<nodes_t>
+ ::template result_<subject_t, LeafCountT> count_t;
+
+ BOOST_STATIC_CONSTANT(int, value = count_t::value);
+ };
+ };
+
+ template <>
+ struct leafs<action_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ typedef leafs<subject_category_t> nodes_t;
+ typedef typename count_wrapper<nodes_t>
+ ::template result_<subject_t, LeafCountT> count_t;
+
+ BOOST_STATIC_CONSTANT(int, value = count_t::value);
+ };
+ };
+
+ template <>
+ struct leafs<binary_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::left_t left_t;
+ typedef typename ParserT::right_t right_t;
+ typedef typename left_t::parser_category_t left_category_t;
+ typedef typename right_t::parser_category_t right_category_t;
+
+ typedef leafs<left_category_t> left_nodes_t;
+ typedef typename count_wrapper<left_nodes_t>
+ ::template result_<left_t, LeafCountT> left_count_t;
+
+ typedef leafs<right_category_t> right_nodes_t;
+ typedef typename count_wrapper<right_nodes_t>
+ ::template result_<right_t, LeafCountT> right_count_t;
+
+ BOOST_STATIC_CONSTANT(int,
+ value = (left_count_t::value + right_count_t::value));
+ };
+ };
+
+#else
+
+ template <>
+ struct leafs<unary_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+ enum { value = (leafs<subject_category_t>
+ ::template count<subject_t, LeafCountT>::value) };
+ };
+ };
+
+ template <>
+ struct leafs<action_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+ enum { value = (leafs<subject_category_t>
+ ::template count<subject_t, LeafCountT>::value) };
+ };
+ };
+
+ template <>
+ struct leafs<binary_parser_category> {
+
+ template <typename ParserT, typename LeafCountT>
+ struct count {
+
+ typedef typename ParserT::left_t left_t;
+ typedef typename ParserT::right_t right_t;
+ typedef typename left_t::parser_category_t left_category_t;
+ typedef typename right_t::parser_category_t right_category_t;
+
+ typedef count self_t;
+
+ // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+ enum {
+ leftcount = (leafs<left_category_t>
+ ::template count<left_t, LeafCountT>::value),
+ rightcount = (leafs<right_category_t>
+ ::template count<right_t, LeafCountT>::value),
+ value = (self_t::leftcount + self_t::rightcount)
+ };
+ };
+ };
+
+#endif
+
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_FUNDAMENTAL_IPP)
diff --git a/boost/spirit/home/classic/meta/impl/parser_traits.ipp b/boost/spirit/home/classic/meta/impl/parser_traits.ipp
new file mode 100644
index 0000000000..e648acd4d0
--- /dev/null
+++ b/boost/spirit/home/classic/meta/impl/parser_traits.ipp
@@ -0,0 +1,191 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ Copyright (c) 2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_PARSER_TRAITS_IPP)
+#define BOOST_SPIRIT_PARSER_TRAITS_IPP
+
+#include <boost/spirit/home/classic/core/composite/operators.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace impl
+{
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // from spirit 1.1 (copyright (c) 2001 Bruce Florman)
+ // various workarounds to support compile time decisions without partial
+ // template specialization whether a given type is an instance of a
+ // concrete parser type.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct parser_type_traits
+ {
+ // Determine at compile time (without partial specialization)
+ // whether a given type is an instance of the alternative<A,B>
+
+ static T t();
+
+ typedef struct { char dummy[1]; } size1_t;
+ typedef struct { char dummy[2]; } size2_t;
+ typedef struct { char dummy[3]; } size3_t;
+ typedef struct { char dummy[4]; } size4_t;
+ typedef struct { char dummy[5]; } size5_t;
+ typedef struct { char dummy[6]; } size6_t;
+ typedef struct { char dummy[7]; } size7_t;
+ typedef struct { char dummy[8]; } size8_t;
+ typedef struct { char dummy[9]; } size9_t;
+ typedef struct { char dummy[10]; } size10_t;
+
+ // the following functions need no implementation
+ template <typename A, typename B>
+ static size1_t test_(alternative<A, B> const&);
+ template <typename A, typename B>
+ static size2_t test_(sequence<A, B> const&);
+ template <typename A, typename B>
+ static size3_t test_(sequential_or<A, B> const&);
+ template <typename A, typename B>
+ static size4_t test_(intersection<A, B> const&);
+ template <typename A, typename B>
+ static size5_t test_(difference<A, B> const&);
+ template <typename A, typename B>
+ static size6_t test_(exclusive_or<A, B> const&);
+ template <typename S>
+ static size7_t test_(optional<S> const&);
+ template <typename S>
+ static size8_t test_(kleene_star<S> const&);
+ template <typename S>
+ static size9_t test_(positive<S> const&);
+
+ static size10_t test_(...);
+
+ BOOST_STATIC_CONSTANT(bool,
+ is_alternative = (sizeof(size1_t) == sizeof(test_(t()))) );
+ BOOST_STATIC_CONSTANT(bool,
+ is_sequence = (sizeof(size2_t) == sizeof(test_(t()))) );
+ BOOST_STATIC_CONSTANT(bool,
+ is_sequential_or = (sizeof(size3_t) == sizeof(test_(t()))) );
+ BOOST_STATIC_CONSTANT(bool,
+ is_intersection = (sizeof(size4_t) == sizeof(test_(t()))) );
+ BOOST_STATIC_CONSTANT(bool,
+ is_difference = (sizeof(size5_t) == sizeof(test_(t()))) );
+ BOOST_STATIC_CONSTANT(bool,
+ is_exclusive_or = (sizeof(size6_t) == sizeof(test_(t()))) );
+ BOOST_STATIC_CONSTANT(bool,
+ is_optional = (sizeof(size7_t) == sizeof(test_(t()))) );
+ BOOST_STATIC_CONSTANT(bool,
+ is_kleene_star = (sizeof(size8_t) == sizeof(test_(t()))) );
+ BOOST_STATIC_CONSTANT(bool,
+ is_positive = (sizeof(size9_t) == sizeof(test_(t()))) );
+ };
+
+#else
+
+ ///////////////////////////////////////////////////////////////////////////
+ struct parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_alternative = false);
+ BOOST_STATIC_CONSTANT(bool, is_sequence = false);
+ BOOST_STATIC_CONSTANT(bool, is_sequential_or = false);
+ BOOST_STATIC_CONSTANT(bool, is_intersection = false);
+ BOOST_STATIC_CONSTANT(bool, is_difference = false);
+ BOOST_STATIC_CONSTANT(bool, is_exclusive_or = false);
+ BOOST_STATIC_CONSTANT(bool, is_optional = false);
+ BOOST_STATIC_CONSTANT(bool, is_kleene_star = false);
+ BOOST_STATIC_CONSTANT(bool, is_positive = false);
+ };
+
+ template <typename ParserT>
+ struct parser_type_traits : public parser_type_traits_base {
+
+ // no definition here, fallback for all not explicitly mentioned parser
+ // types
+ };
+
+ template <typename A, typename B>
+ struct parser_type_traits<alternative<A, B> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_alternative = true);
+ };
+
+ template <typename A, typename B>
+ struct parser_type_traits<sequence<A, B> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_sequence = true);
+ };
+
+ template <typename A, typename B>
+ struct parser_type_traits<sequential_or<A, B> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_sequential_or = true);
+ };
+
+ template <typename A, typename B>
+ struct parser_type_traits<intersection<A, B> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_intersection = true);
+ };
+
+ template <typename A, typename B>
+ struct parser_type_traits<difference<A, B> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_difference = true);
+ };
+
+ template <typename A, typename B>
+ struct parser_type_traits<exclusive_or<A, B> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_exclusive_or = true);
+ };
+
+ template <typename S>
+ struct parser_type_traits<optional<S> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_optional = true);
+ };
+
+ template <typename S>
+ struct parser_type_traits<kleene_star<S> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_kleene_star = true);
+ };
+
+ template <typename S>
+ struct parser_type_traits<positive<S> >
+ : public parser_type_traits_base {
+
+ BOOST_STATIC_CONSTANT(bool, is_positive = true);
+ };
+
+#endif // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_PARSER_TRAITS_IPP)
diff --git a/boost/spirit/home/classic/meta/impl/refactoring.ipp b/boost/spirit/home/classic/meta/impl/refactoring.ipp
new file mode 100644
index 0000000000..61cc6b57b1
--- /dev/null
+++ b/boost/spirit/home/classic/meta/impl/refactoring.ipp
@@ -0,0 +1,451 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_REFACTORING_IPP
+#define BOOST_SPIRIT_REFACTORING_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The struct 'self_nested_refactoring' is used to indicate, that the
+// refactoring algorithm should be 'self-nested'.
+//
+// The struct 'non_nested_refactoring' is used to indicate, that no nesting
+// of refactoring algorithms is reqired.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+struct non_nested_refactoring { typedef non_nested_refactoring embed_t; };
+struct self_nested_refactoring { typedef self_nested_refactoring embed_t; };
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Helper templates for refactoring parsers
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // refactor the left unary operand of a binary parser
+ //
+ // The refactoring should be done only if the left operand is an
+ // unary_parser_category parser.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CategoryT>
+ struct refactor_unary_nested {
+
+ template <
+ typename ParserT, typename NestedT,
+ typename ScannerT, typename BinaryT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, BinaryT const& binary,
+ NestedT const& /*nested_d*/)
+ {
+ return binary.parse(scan);
+ }
+ };
+
+ template <>
+ struct refactor_unary_nested<unary_parser_category> {
+
+ template <
+ typename ParserT, typename ScannerT, typename BinaryT,
+ typename NestedT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, BinaryT const& binary,
+ NestedT const& nested_d)
+ {
+ typedef typename BinaryT::parser_generator_t op_t;
+ typedef
+ typename BinaryT::left_t::parser_generator_t
+ unary_t;
+
+ return
+ unary_t::generate(
+ nested_d[
+ op_t::generate(binary.left().subject(), binary.right())
+ ]
+ ).parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CategoryT>
+ struct refactor_unary_non_nested {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, BinaryT const& binary)
+ {
+ return binary.parse(scan);
+ }
+ };
+
+ template <>
+ struct refactor_unary_non_nested<unary_parser_category> {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, BinaryT const& binary)
+ {
+ typedef typename BinaryT::parser_generator_t op_t;
+ typedef
+ typename BinaryT::left_t::parser_generator_t
+ unary_t;
+
+ return unary_t::generate(
+ op_t::generate(binary.left().subject(), binary.right())
+ ).parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename NestedT>
+ struct refactor_unary_type {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+ NestedT const& nested_d)
+ {
+ typedef
+ typename BinaryT::left_t::parser_category_t
+ parser_category_t;
+
+ return refactor_unary_nested<parser_category_t>::
+ parse(p, scan, binary, nested_d);
+ }
+ };
+
+ template <>
+ struct refactor_unary_type<non_nested_refactoring> {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+ non_nested_refactoring const&)
+ {
+ typedef
+ typename BinaryT::left_t::parser_category_t
+ parser_category_t;
+
+ return refactor_unary_non_nested<parser_category_t>::
+ parse(p, scan, binary);
+ }
+
+ };
+
+ template <>
+ struct refactor_unary_type<self_nested_refactoring> {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+ self_nested_refactoring const &nested_tag)
+ {
+ typedef
+ typename BinaryT::left_t::parser_category_t
+ parser_category_t;
+ typedef typename ParserT::parser_generator_t parser_generator_t;
+
+ parser_generator_t nested_d(nested_tag);
+ return refactor_unary_nested<parser_category_t>::
+ parse(p, scan, binary, nested_d);
+ }
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // refactor the action on the left operand of a binary parser
+ //
+ // The refactoring should be done only if the left operand is an
+ // action_parser_category parser.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CategoryT>
+ struct refactor_action_nested {
+
+ template <
+ typename ParserT, typename ScannerT, typename BinaryT,
+ typename NestedT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, BinaryT const& binary,
+ NestedT const& nested_d)
+ {
+ return nested_d[binary].parse(scan);
+ }
+ };
+
+ template <>
+ struct refactor_action_nested<action_parser_category> {
+
+ template <
+ typename ParserT, typename ScannerT, typename BinaryT,
+ typename NestedT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, BinaryT const& binary,
+ NestedT const& nested_d)
+ {
+ typedef typename BinaryT::parser_generator_t binary_gen_t;
+
+ return (
+ nested_d[
+ binary_gen_t::generate(
+ binary.left().subject(),
+ binary.right()
+ )
+ ][binary.left().predicate()]
+ ).parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CategoryT>
+ struct refactor_action_non_nested {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, BinaryT const& binary)
+ {
+ return binary.parse(scan);
+ }
+ };
+
+ template <>
+ struct refactor_action_non_nested<action_parser_category> {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, BinaryT const& binary)
+ {
+ typedef typename BinaryT::parser_generator_t binary_gen_t;
+
+ return (
+ binary_gen_t::generate(
+ binary.left().subject(),
+ binary.right()
+ )[binary.left().predicate()]
+ ).parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename NestedT>
+ struct refactor_action_type {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+ NestedT const& nested_d)
+ {
+ typedef
+ typename BinaryT::left_t::parser_category_t
+ parser_category_t;
+
+ return refactor_action_nested<parser_category_t>::
+ parse(p, scan, binary, nested_d);
+ }
+ };
+
+ template <>
+ struct refactor_action_type<non_nested_refactoring> {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+ non_nested_refactoring const&)
+ {
+ typedef
+ typename BinaryT::left_t::parser_category_t
+ parser_category_t;
+
+ return refactor_action_non_nested<parser_category_t>::
+ parse(p, scan, binary);
+ }
+ };
+
+ template <>
+ struct refactor_action_type<self_nested_refactoring> {
+
+ template <typename ParserT, typename ScannerT, typename BinaryT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+ self_nested_refactoring const &nested_tag)
+ {
+ typedef typename ParserT::parser_generator_t parser_generator_t;
+ typedef
+ typename BinaryT::left_t::parser_category_t
+ parser_category_t;
+
+ parser_generator_t nested_d(nested_tag);
+ return refactor_action_nested<parser_category_t>::
+ parse(p, scan, binary, nested_d);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // refactor the action attached to a binary parser
+ //
+ // The refactoring should be done only if the given parser is an
+ // binary_parser_category parser.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CategoryT>
+ struct attach_action_nested {
+
+ template <
+ typename ParserT, typename ScannerT, typename ActionT,
+ typename NestedT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, ActionT const &action,
+ NestedT const& nested_d)
+ {
+ return action.parse(scan);
+ }
+ };
+
+ template <>
+ struct attach_action_nested<binary_parser_category> {
+
+ template <
+ typename ParserT, typename ScannerT, typename ActionT,
+ typename NestedT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, ActionT const &action,
+ NestedT const& nested_d)
+ {
+ typedef
+ typename ActionT::subject_t::parser_generator_t
+ binary_gen_t;
+
+ return (
+ binary_gen_t::generate(
+ nested_d[action.subject().left()[action.predicate()]],
+ nested_d[action.subject().right()[action.predicate()]]
+ )
+ ).parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CategoryT>
+ struct attach_action_non_nested {
+
+ template <typename ParserT, typename ScannerT, typename ActionT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, ActionT const &action)
+ {
+ return action.parse(scan);
+ }
+ };
+
+ template <>
+ struct attach_action_non_nested<binary_parser_category> {
+
+ template <typename ParserT, typename ScannerT, typename ActionT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &, ScannerT const& scan, ActionT const &action)
+ {
+ typedef
+ typename ActionT::subject_t::parser_generator_t
+ binary_gen_t;
+
+ return (
+ binary_gen_t::generate(
+ action.subject().left()[action.predicate()],
+ action.subject().right()[action.predicate()]
+ )
+ ).parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename NestedT>
+ struct attach_action_type {
+
+ template <typename ParserT, typename ScannerT, typename ActionT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, ActionT const& action,
+ NestedT const& nested_d)
+ {
+ typedef
+ typename ActionT::subject_t::parser_category_t
+ parser_category_t;
+
+ return attach_action_nested<parser_category_t>::
+ parse(p, scan, action, nested_d);
+ }
+ };
+
+ template <>
+ struct attach_action_type<non_nested_refactoring> {
+
+ template <typename ParserT, typename ScannerT, typename ActionT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, ActionT const &action,
+ non_nested_refactoring const&)
+ {
+ typedef
+ typename ActionT::subject_t::parser_category_t
+ parser_category_t;
+
+ return attach_action_non_nested<parser_category_t>::
+ parse(p, scan, action);
+ }
+ };
+
+ template <>
+ struct attach_action_type<self_nested_refactoring> {
+
+ template <typename ParserT, typename ScannerT, typename ActionT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const &p, ScannerT const& scan, ActionT const &action,
+ self_nested_refactoring const& nested_tag)
+ {
+ typedef typename ParserT::parser_generator_t parser_generator_t;
+ typedef
+ typename ActionT::subject_t::parser_category_t
+ parser_category_t;
+
+ parser_generator_t nested_d(nested_tag);
+ return attach_action_nested<parser_category_t>::
+ parse(p, scan, action, nested_d);
+ }
+ };
+
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/meta/impl/traverse.ipp b/boost/spirit/home/classic/meta/impl/traverse.ipp
new file mode 100644
index 0000000000..3968230889
--- /dev/null
+++ b/boost/spirit/home/classic/meta/impl/traverse.ipp
@@ -0,0 +1,393 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_TRAVERSE_IPP)
+#define BOOST_SPIRIT_TRAVERSE_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/meta/fundamental.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl
+{
+
+ template <typename CategoryT>
+ struct traverse_post_order_return_category;
+
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Environment class for post_order_traversal
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <int Level, int Node, int Index, int LastLeft>
+struct traverse_post_order_env {
+
+ BOOST_STATIC_CONSTANT(int, level = Level);
+ BOOST_STATIC_CONSTANT(int, node = Node);
+ BOOST_STATIC_CONSTANT(int, index = Index);
+ BOOST_STATIC_CONSTANT(int, lastleft = LastLeft);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// traverse_post_order_return template
+//
+// This template is a helper for dispatching the calculation of a parser
+// type result for a traversal level to the corresponding parser_category
+// based specialization.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename MetaT, typename ParserT, typename EnvT>
+struct traverse_post_order_return {
+
+ typedef typename ParserT::parser_category_t parser_category_t;
+ typedef typename impl::traverse_post_order_return_category<parser_category_t>
+ ::template result<MetaT, ParserT, EnvT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// parser_traversal_..._result templates
+//
+// These are metafunctions, which calculate the resulting parser type
+// for all subparsers and feed these types to the user supplied
+// metafunctions to get back the resulting parser type of this traversal
+// level.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename MetaT, typename ParserT, typename EnvT>
+struct parser_traversal_plain_result {
+
+ typedef typename MetaT::template plain_result<ParserT, EnvT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename MetaT, typename UnaryT, typename SubjectT, typename EnvT>
+struct parser_traversal_unary_result {
+
+ typedef typename MetaT
+ ::template unary_result<UnaryT, SubjectT, EnvT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename MetaT, typename ActionT, typename SubjectT, typename EnvT>
+struct parser_traversal_action_result {
+
+ typedef typename MetaT
+ ::template action_result<ActionT, SubjectT, EnvT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename MetaT, typename BinaryT, typename LeftT,
+ typename RightT, typename EnvT
+>
+struct parser_traversal_binary_result {
+
+ BOOST_STATIC_CONSTANT(int,
+ thisnum = (node_count<BinaryT>::value + EnvT::lastleft-1));
+ BOOST_STATIC_CONSTANT(int,
+ leftnum = (node_count<LeftT>::value + EnvT::lastleft-1));
+ BOOST_STATIC_CONSTANT(int,
+ leafnum = (leaf_count<LeftT>::value + EnvT::index));
+
+ typedef parser_traversal_binary_result self_t;
+
+ // left traversal environment and resulting parser type
+ typedef traverse_post_order_env<
+ (EnvT::level+1), (self_t::leftnum), (EnvT::index), (EnvT::lastleft)
+ > left_sub_env_t;
+ typedef typename traverse_post_order_return<
+ MetaT, LeftT, left_sub_env_t
+ >::type
+ left_t;
+
+ // right traversal environment and resulting parser type
+ typedef traverse_post_order_env<
+ (EnvT::level+1), (self_t::thisnum-1), (self_t::leafnum), (self_t::leftnum+1)
+ > right_sub_env_t;
+ typedef typename traverse_post_order_return<
+ MetaT, RightT, right_sub_env_t
+ >::type
+ right_t;
+
+ typedef typename MetaT::template binary_result<
+ BinaryT, left_t, right_t, EnvT
+ >::type
+ type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Meta functions, which dispatch the calculation of the return type of
+ // of the post_order traverse function to the result template of the
+ // corresponding parser_category based metafunction template.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ template <typename CategoryT>
+ struct traverse_post_order_return_category;
+
+ template <>
+ struct traverse_post_order_return_category<plain_parser_category> {
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ struct result {
+
+ typedef typename parser_traversal_plain_result<
+ MetaT, ParserT, EnvT
+ >::type
+ type;
+ };
+ };
+
+ template <>
+ struct traverse_post_order_return_category<unary_parser_category> {
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ struct result {
+
+ typedef typename parser_traversal_unary_result<
+ MetaT, ParserT, typename ParserT::subject_t, EnvT
+ >::type
+ type;
+ };
+ };
+
+ template <>
+ struct traverse_post_order_return_category<action_parser_category> {
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ struct result {
+
+ typedef typename parser_traversal_action_result<
+ MetaT, ParserT, typename ParserT::subject_t, EnvT
+ >::type
+ type;
+ };
+ };
+
+ template <>
+ struct traverse_post_order_return_category<binary_parser_category> {
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ struct result {
+
+ typedef typename parser_traversal_binary_result<
+ MetaT, ParserT, typename ParserT::left_t,
+ typename ParserT::right_t, EnvT
+ >::type
+ type;
+ };
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Post-order parser traversal
+ //
+ // The following templates contain the parser_category based code for
+ //
+ // - calculating the type of the resulting parser, which is to be
+ // returned from a level of traversal
+ // - traversing down the composite parser structure, this traversal
+ // returnes a new parser object
+ //
+ // Both tasks are delegated to the MetaT metafunction supplied by the
+ // user.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ template <typename CategoryT>
+ struct traverse_post_order;
+
+ template <>
+ struct traverse_post_order<plain_parser_category> {
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ struct result {
+
+ typedef
+ typename parser_traversal_plain_result<MetaT, ParserT, EnvT>::type
+ type;
+ };
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ static
+ typename parser_traversal_plain_result<MetaT, ParserT, EnvT>::type
+ generate(MetaT const &meta_, ParserT const &parser_, EnvT const &env)
+ {
+ return meta_.generate_plain(parser_, env);
+ }
+ };
+
+ template <>
+ struct traverse_post_order<unary_parser_category> {
+
+ template <
+ typename MetaT, typename ParserT, typename SubjectT, typename EnvT
+ >
+ struct result {
+
+ typedef typename parser_traversal_unary_result<
+ MetaT, ParserT, SubjectT, EnvT
+ >::type
+ type;
+ };
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ static
+ typename parser_traversal_unary_result<
+ MetaT, ParserT,
+ typename traverse_post_order_return<
+ MetaT, typename ParserT::subject_t, EnvT
+ >::type,
+ EnvT
+ >::type
+ generate(MetaT const &meta_, ParserT const &unary_, EnvT const &env)
+ {
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ return meta_.generate_unary(
+ unary_,
+ traverse_post_order<subject_category_t>::generate(meta_,
+ unary_.subject(),
+ traverse_post_order_env<
+ EnvT::level+1, EnvT::node-1, EnvT::index, EnvT::lastleft
+ >()
+ ),
+ env
+ );
+ }
+ };
+
+ template <>
+ struct traverse_post_order<action_parser_category> {
+
+ template <
+ typename MetaT, typename ParserT, typename SubjectT, typename EnvT
+ >
+ struct result {
+
+ typedef typename parser_traversal_action_result<
+ MetaT, ParserT, SubjectT, EnvT
+ >::type
+ type;
+ };
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ static
+ typename parser_traversal_action_result<
+ MetaT, ParserT,
+ typename traverse_post_order_return<
+ MetaT, typename ParserT::subject_t, EnvT
+ >::type,
+ EnvT
+ >::type
+ generate(MetaT const &meta_, ParserT const &action_, EnvT const &env)
+ {
+ typedef typename ParserT::subject_t subject_t;
+ typedef typename subject_t::parser_category_t subject_category_t;
+
+ return meta_.generate_action(
+ action_,
+ traverse_post_order<subject_category_t>::generate(meta_,
+ action_.subject(),
+ traverse_post_order_env<
+ EnvT::level+1, EnvT::node-1, EnvT::index, EnvT::lastleft
+ >()
+ ),
+ env
+ );
+ }
+ };
+
+ template <>
+ struct traverse_post_order<binary_parser_category> {
+
+ template <
+ typename MetaT, typename ParserT, typename LeftT,
+ typename RightT, typename EnvT
+ >
+ struct result {
+
+ typedef typename parser_traversal_binary_result<
+ MetaT, ParserT, LeftT, RightT, EnvT
+ >::type
+ type;
+ };
+
+ template <typename MetaT, typename ParserT, typename EnvT>
+ static
+ typename parser_traversal_binary_result<
+ MetaT, ParserT,
+ typename traverse_post_order_return<
+ MetaT, typename ParserT::left_t, EnvT
+ >::type,
+ typename traverse_post_order_return<
+ MetaT, typename ParserT::right_t, EnvT
+ >::type,
+ EnvT
+ >::type
+ generate(MetaT const &meta_, ParserT const &binary_, EnvT const& /*env*/)
+ {
+ typedef typename ParserT::left_t left_t;
+ typedef typename ParserT::right_t right_t;
+ typedef typename left_t::parser_category_t left_category_t;
+ typedef typename right_t::parser_category_t right_category_t;
+
+ enum {
+ leftnum = (node_count<left_t>::value + EnvT::lastleft-1),
+ thisnum = (node_count<ParserT>::value + EnvT::lastleft-1),
+ rightnum = (thisnum-1),
+ leafnum = (leaf_count<left_t>::value + EnvT::index)
+ };
+
+ return meta_.generate_binary(
+ binary_,
+ traverse_post_order<left_category_t>::generate(
+ meta_, binary_.left(),
+ traverse_post_order_env<
+ EnvT::level+1, leftnum, EnvT::index, EnvT::lastleft
+ >()
+ ),
+ traverse_post_order<right_category_t>::generate(
+ meta_, binary_.right(),
+ traverse_post_order_env<
+ EnvT::level+1, rightnum, leafnum, leftnum+1
+ >()
+ ),
+ traverse_post_order_env<
+ EnvT::level, thisnum, EnvT::index, EnvT::lastleft
+ >()
+ );
+ }
+ };
+
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_TRAVERSE_IPP)
diff --git a/boost/spirit/home/classic/meta/parser_traits.hpp b/boost/spirit/home/classic/meta/parser_traits.hpp
new file mode 100644
index 0000000000..618aade1d7
--- /dev/null
+++ b/boost/spirit/home/classic/meta/parser_traits.hpp
@@ -0,0 +1,320 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ Copyright (c) 2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_PARSER_TRAITS_HPP)
+#define BOOST_SPIRIT_PARSER_TRAITS_HPP
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/meta/impl/parser_traits.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Parser traits templates
+//
+// Used to determine the type and several other characteristics of a given
+// parser type.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The is_parser traits template can be used to tell wether a given
+// class is a parser.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct is_parser
+{
+ BOOST_STATIC_CONSTANT(bool, value =
+ (::boost::is_base_and_derived<parser<T>, T>::value));
+
+// [JDG 2/3/03] simplified implementation by
+// using boost::is_base_and_derived
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The is_unary_composite traits template can be used to tell if a given
+// parser is a unary parser as for instance kleene_star or optional.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename UnaryT>
+struct is_unary_composite {
+
+ BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<
+ typename UnaryT::parser_category_t, unary_parser_category>::value));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The is_acction_parser traits template can be used to tell if a given
+// parser is a action parser, i.e. it is a composite consisting of a
+// auxilliary parser and an attached semantic action.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+struct is_action_parser {
+
+ BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<
+ typename ActionT::parser_category_t, action_parser_category>::value));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The is_binary_composite traits template can be used to tell if a given
+// parser is a binary parser as for instance sequence or difference.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BinaryT>
+struct is_binary_composite {
+
+ BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<
+ typename BinaryT::parser_category_t, binary_parser_category>::value));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The is_composite_parser traits template can be used to tell if a given
+// parser is a unary or a binary parser composite type.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CompositeT>
+struct is_composite_parser {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::is_unary_composite<CompositeT>::value ||
+ ::BOOST_SPIRIT_CLASSIC_NS::is_binary_composite<CompositeT>::value));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename ParserT>
+struct is_alternative {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_alternative));
+};
+
+template <typename ParserT>
+struct is_sequence {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_sequence));
+};
+
+template <typename ParserT>
+struct is_sequential_or {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_sequential_or));
+};
+
+template <typename ParserT>
+struct is_intersection {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_intersection));
+};
+
+template <typename ParserT>
+struct is_difference {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_difference));
+};
+
+template <typename ParserT>
+struct is_exclusive_or {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_exclusive_or));
+};
+
+template <typename ParserT>
+struct is_optional {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_optional));
+};
+
+template <typename ParserT>
+struct is_kleene_star {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_kleene_star));
+};
+
+template <typename ParserT>
+struct is_positive {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ ::BOOST_SPIRIT_CLASSIC_NS::impl::parser_type_traits<ParserT>::is_positive));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Parser extraction templates
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The unary_subject template can be used to return the type of the
+// parser used as the subject of an unary parser.
+// If the parser under inspection is not an unary type parser the compilation
+// will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename UnaryT>
+struct unary_subject {
+
+ BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLASSIC_NS::is_unary_composite<UnaryT>::value);
+ typedef typename UnaryT::subject_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The get_unary_subject template function returns the parser object, which
+// is used as the subject of an unary parser.
+// If the parser under inspection is not an unary type parser the compilation
+// will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename UnaryT>
+inline typename unary_subject<UnaryT>::type const &
+get_unary_subject(UnaryT const &unary_)
+{
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_unary_composite<UnaryT>::value);
+ return unary_.subject();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The binary_left_subject and binary_right_subject templates can be used to
+// return the types of the parsers used as the left and right subject of an
+// binary parser.
+// If the parser under inspection is not a binary type parser the compilation
+// will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BinaryT>
+struct binary_left_subject {
+
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_binary_composite<BinaryT>::value);
+ typedef typename BinaryT::left_t type;
+};
+
+template <typename BinaryT>
+struct binary_right_subject {
+
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_binary_composite<BinaryT>::value);
+ typedef typename BinaryT::right_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The get_binary_left_subject and get_binary_right_subject template functions
+// return the parser object, which is used as the left or right subject of a
+// binary parser.
+// If the parser under inspection is not a binary type parser the compilation
+// will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BinaryT>
+inline typename binary_left_subject<BinaryT>::type const &
+get_binary_left_subject(BinaryT const &binary_)
+{
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_binary_composite<BinaryT>::value);
+ return binary_.left();
+}
+
+template <typename BinaryT>
+inline typename binary_right_subject<BinaryT>::type const &
+get_binary_right_subject(BinaryT const &binary_)
+{
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_binary_composite<BinaryT>::value);
+ return binary_.right();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The action_subject template can be used to return the type of the
+// parser used as the subject of an action parser.
+// If the parser under inspection is not an action type parser the compilation
+// will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+struct action_subject {
+
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_action_parser<ActionT>::value);
+ typedef typename ActionT::subject_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The get_action_subject template function returns the parser object, which
+// is used as the subject of an action parser.
+// If the parser under inspection is not an action type parser the compilation
+// will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+inline typename action_subject<ActionT>::type const &
+get_action_subject(ActionT const &action_)
+{
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_action_parser<ActionT>::value);
+ return action_.subject();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The semantic_action template can be used to return the type of the
+// attached semantic action of an action parser.
+// If the parser under inspection is not an action type parser the compilation
+// will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+struct semantic_action {
+
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_action_parser<ActionT>::value);
+ typedef typename ActionT::predicate_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The get_semantic_action template function returns the attached semantic
+// action of an action parser.
+// If the parser under inspection is not an action type parser the compilation
+// will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+inline typename semantic_action<ActionT>::type const &
+get_semantic_action(ActionT const &action_)
+{
+ BOOST_STATIC_ASSERT(::BOOST_SPIRIT_CLASSIC_NS::is_action_parser<ActionT>::value);
+ return action_.predicate();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // !defined(BOOST_SPIRIT_PARSER_TRAITS_HPP)
diff --git a/boost/spirit/home/classic/meta/refactoring.hpp b/boost/spirit/home/classic/meta/refactoring.hpp
new file mode 100644
index 0000000000..e5d45f9297
--- /dev/null
+++ b/boost/spirit/home/classic/meta/refactoring.hpp
@@ -0,0 +1,287 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_REFACTORING_HPP
+#define BOOST_SPIRIT_REFACTORING_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/static_assert.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#include <boost/spirit/home/classic/meta/impl/refactoring.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// refactor_unary_parser class
+//
+// This helper template allows to attach an unary operation to a newly
+// constructed parser, which combines the subject of the left operand of
+// the original given parser (BinaryT) with the right operand of the
+// original binary parser through the original binary operation and
+// rewraps the resulting parser with the original unary operator.
+//
+// For instance given the parser:
+// *some_parser - another_parser
+//
+// will be refactored to:
+// *(some_parser - another_parser)
+//
+// If the parser to refactor is not a unary parser, no refactoring is done
+// at all.
+//
+// The original parser should be a binary_parser_category parser,
+// else the compilation will fail
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename NestedT = non_nested_refactoring>
+class refactor_unary_gen;
+
+template <typename BinaryT, typename NestedT = non_nested_refactoring>
+class refactor_unary_parser :
+ public parser<refactor_unary_parser<BinaryT, NestedT> > {
+
+public:
+ // the parser to refactor has to be at least a binary_parser_category
+ // parser
+ BOOST_STATIC_ASSERT((
+ boost::is_convertible<typename BinaryT::parser_category_t,
+ binary_parser_category>::value
+ ));
+
+ refactor_unary_parser(BinaryT const& binary_, NestedT const& nested_)
+ : binary(binary_), nested(nested_) {}
+
+ typedef refactor_unary_parser<BinaryT, NestedT> self_t;
+ typedef refactor_unary_gen<NestedT> parser_generator_t;
+ typedef typename BinaryT::left_t::parser_category_t parser_category_t;
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ return impl::refactor_unary_type<NestedT>::
+ parse(*this, scan, binary, nested);
+ }
+
+private:
+ typename as_parser<BinaryT>::type::embed_t binary;
+ typename NestedT::embed_t nested;
+};
+
+//////////////////////////////////
+template <typename NestedT>
+class refactor_unary_gen {
+
+public:
+ typedef refactor_unary_gen<NestedT> embed_t;
+
+ refactor_unary_gen(NestedT const& nested_ = non_nested_refactoring())
+ : nested(nested_) {}
+
+ template <typename ParserT>
+ refactor_unary_parser<ParserT, NestedT>
+ operator[](parser<ParserT> const& subject) const
+ {
+ return refactor_unary_parser<ParserT, NestedT>
+ (subject.derived(), nested);
+ }
+
+private:
+ typename NestedT::embed_t nested;
+};
+
+const refactor_unary_gen<> refactor_unary_d = refactor_unary_gen<>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// refactor_action_parser class
+//
+// This helper template allows to attach an action taken from the left
+// operand of the given binary parser to a newly constructed parser,
+// which combines the subject of the left operand of the original binary
+// parser with the right operand of the original binary parser by means of
+// the original binary operator parser.
+//
+// For instance the parser:
+// some_parser[some_attached_functor] - another_parser
+//
+// will be refactored to:
+// (some_parser - another_parser)[some_attached_functor]
+//
+// If the left operand to refactor is not an action parser, no refactoring
+// is done at all.
+//
+// The original parser should be a binary_parser_category parser,
+// else the compilation will fail
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename NestedT = non_nested_refactoring>
+class refactor_action_gen;
+
+template <typename BinaryT, typename NestedT = non_nested_refactoring>
+class refactor_action_parser :
+ public parser<refactor_action_parser<BinaryT, NestedT> > {
+
+public:
+ // the parser to refactor has to be at least a binary_parser_category
+ // parser
+ BOOST_STATIC_ASSERT((
+ boost::is_convertible<typename BinaryT::parser_category_t,
+ binary_parser_category>::value
+ ));
+
+ refactor_action_parser(BinaryT const& binary_, NestedT const& nested_)
+ : binary(binary_), nested(nested_) {}
+
+ typedef refactor_action_parser<BinaryT, NestedT> self_t;
+ typedef refactor_action_gen<NestedT> parser_generator_t;
+ typedef typename BinaryT::left_t::parser_category_t parser_category_t;
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ return impl::refactor_action_type<NestedT>::
+ parse(*this, scan, binary, nested);
+ }
+
+private:
+ typename as_parser<BinaryT>::type::embed_t binary;
+ typename NestedT::embed_t nested;
+};
+
+//////////////////////////////////
+template <typename NestedT>
+class refactor_action_gen {
+
+public:
+ typedef refactor_action_gen<NestedT> embed_t;
+
+ refactor_action_gen(NestedT const& nested_ = non_nested_refactoring())
+ : nested(nested_) {}
+
+ template <typename ParserT>
+ refactor_action_parser<ParserT, NestedT>
+ operator[](parser<ParserT> const& subject) const
+ {
+ return refactor_action_parser<ParserT, NestedT>
+ (subject.derived(), nested);
+ }
+
+private:
+ typename NestedT::embed_t nested;
+};
+
+const refactor_action_gen<> refactor_action_d = refactor_action_gen<>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// attach_action_parser class
+//
+// This helper template allows to attach an action given separately
+// to to all parsers, out of which the given parser is constructed and
+// reconstructs a new parser having the same structure.
+//
+// For instance the parser:
+// (some_parser >> another_parser)[some_attached_functor]
+//
+// will be refactored to:
+// some_parser[some_attached_functor]
+// >> another_parser[some_attached_functor]
+//
+// The original parser should be a action_parser_category parser,
+// else the compilation will fail
+//
+// If the parser, to which the action is attached is not an binary parser,
+// no refactoring is done at all.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename NestedT = non_nested_refactoring>
+class attach_action_gen;
+
+template <typename ActionT, typename NestedT = non_nested_refactoring>
+class attach_action_parser :
+ public parser<attach_action_parser<ActionT, NestedT> > {
+
+public:
+ // the parser to refactor has to be at least a action_parser_category
+ // parser
+ BOOST_STATIC_ASSERT((
+ boost::is_convertible<typename ActionT::parser_category_t,
+ action_parser_category>::value
+ ));
+
+ attach_action_parser(ActionT const& actor_, NestedT const& nested_)
+ : actor(actor_), nested(nested_) {}
+
+ typedef attach_action_parser<ActionT, NestedT> self_t;
+ typedef attach_action_gen<NestedT> parser_generator_t;
+ typedef typename ActionT::parser_category_t parser_category_t;
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ return impl::attach_action_type<NestedT>::
+ parse(*this, scan, actor, nested);
+ }
+
+private:
+ typename as_parser<ActionT>::type::embed_t actor;
+ typename NestedT::embed_t nested;
+};
+
+//////////////////////////////////
+template <typename NestedT>
+class attach_action_gen {
+
+public:
+ typedef attach_action_gen<NestedT> embed_t;
+
+ attach_action_gen(NestedT const& nested_ = non_nested_refactoring())
+ : nested(nested_) {}
+
+ template <typename ParserT, typename ActionT>
+ attach_action_parser<action<ParserT, ActionT>, NestedT>
+ operator[](action<ParserT, ActionT> const& actor) const
+ {
+ return attach_action_parser<action<ParserT, ActionT>, NestedT>
+ (actor, nested);
+ }
+
+private:
+ typename NestedT::embed_t nested;
+};
+
+const attach_action_gen<> attach_action_d = attach_action_gen<>();
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_REFACTORING_HPP
+
diff --git a/boost/spirit/home/classic/meta/traverse.hpp b/boost/spirit/home/classic/meta/traverse.hpp
new file mode 100644
index 0000000000..aef68cb7e9
--- /dev/null
+++ b/boost/spirit/home/classic/meta/traverse.hpp
@@ -0,0 +1,222 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_TRAVERSE_HPP)
+#define BOOST_SPIRIT_TRAVERSE_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/meta/impl/traverse.ipp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Post-order traversal of auxilliary parsers.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct post_order
+ {
+ // Return the parser type, which is generated as the result of the
+ // traverse function below.
+
+ template <typename MetaT, typename ParserT>
+ struct result
+ {
+ typedef typename
+ traverse_post_order_return<
+ MetaT
+ , ParserT
+ , traverse_post_order_env<0, 0, 0, 0>
+ >::type
+ type;
+ };
+
+ // Traverse a given parser and refactor it with the help of the given
+ // MetaT metafunction template.
+
+ template <typename MetaT, typename ParserT>
+ static typename result<MetaT, ParserT>::type
+ traverse(MetaT const &meta_, ParserT const &parser_)
+ {
+ typedef typename ParserT::parser_category_t parser_category_t;
+ return impl::traverse_post_order<parser_category_t>::generate(
+ meta_, parser_, traverse_post_order_env<0, 0, 0, 0>());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Transform policies
+ //
+ // The following policy classes could be used to assemble some new
+ // transformation metafunction which uses identity transformations
+ // for some parser_category type parsers.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ // transform plain parsers
+ template <typename TransformT>
+ struct plain_identity_policy
+ {
+ template <typename ParserT, typename EnvT>
+ struct plain_result
+ {
+ // plain parsers should be embedded and returned correctly
+ typedef typename ParserT::embed_t type;
+ };
+
+ template <typename ParserT, typename EnvT>
+ typename parser_traversal_plain_result<TransformT, ParserT, EnvT>::type
+ generate_plain(ParserT const &parser_, EnvT const& /*env*/) const
+ {
+ return parser_;
+ }
+ };
+
+ //////////////////////////////////
+ // transform unary parsers
+ template <typename UnaryT, typename SubjectT>
+ struct unary_identity_policy_return
+ {
+ typedef typename UnaryT::parser_generator_t parser_generator_t;
+ typedef typename parser_generator_t
+ ::template result<SubjectT>::type type;
+ };
+
+ template <typename TransformT>
+ struct unary_identity_policy
+ {
+ template <typename UnaryT, typename SubjectT, typename EnvT>
+ struct unary_result
+ {
+ typedef
+ typename unary_identity_policy_return<UnaryT, SubjectT>::type
+ type;
+ };
+
+ template <typename UnaryT, typename SubjectT, typename EnvT>
+ typename parser_traversal_unary_result<
+ TransformT, UnaryT, SubjectT, EnvT>::type
+ generate_unary(
+ UnaryT const &, SubjectT const &subject_, EnvT const& /*env*/) const
+ {
+ typedef typename UnaryT::parser_generator_t parser_generator_t;
+ return parser_generator_t::template generate<SubjectT>(subject_);
+ }
+ };
+
+ //////////////////////////////////
+ // transform action parsers
+ template <typename TransformT>
+ struct action_identity_policy
+ {
+ template <typename ActionT, typename SubjectT, typename EnvT>
+ struct action_result
+ {
+ typedef action<SubjectT, typename ActionT::predicate_t> type;
+ };
+
+ template <typename ActionT, typename SubjectT, typename EnvT>
+ typename parser_traversal_action_result<
+ TransformT, ActionT, SubjectT, EnvT
+ >::type
+ generate_action(ActionT const &action_, SubjectT const &subject_,
+ EnvT const& /*env*/) const
+ {
+ return subject_[action_.predicate()];
+ }
+ };
+
+ //////////////////////////////////
+ // transform binary parsers
+ template <typename BinaryT, typename LeftT, typename RightT>
+ struct binary_identity_policy_return
+ {
+ typedef typename BinaryT::parser_generator_t parser_generator_t;
+ typedef typename parser_generator_t
+ ::template result<LeftT, RightT>::type type;
+ };
+
+ template <typename TransformT>
+ struct binary_identity_policy
+ {
+ template <typename BinaryT, typename LeftT
+ , typename RightT, typename EnvT>
+ struct binary_result {
+
+ typedef typename
+ binary_identity_policy_return<BinaryT, LeftT, RightT>::type
+ type;
+ };
+
+ template <typename BinaryT, typename LeftT
+ , typename RightT, typename EnvT>
+ typename parser_traversal_binary_result<
+ TransformT, BinaryT, LeftT, RightT, EnvT
+ >::type
+ generate_binary(
+ BinaryT const &, LeftT const& left_
+ , RightT const& right_, EnvT const& /*env*/) const
+ {
+ typedef typename BinaryT::parser_generator_t parser_generator_t;
+ return parser_generator_t::
+ template generate<LeftT, RightT>(left_, right_);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // transform_policies template
+ //
+ // The transform_policies template metafunction could serve as a
+ // base class for new metafunctions to be passed to the traverse meta
+ // template (see above), where only minimal parts have to be
+ // overwritten.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ template <
+ typename TransformT,
+ typename PlainPolicyT = plain_identity_policy<TransformT>,
+ typename UnaryPolicyT = unary_identity_policy<TransformT>,
+ typename ActionPolicyT = action_identity_policy<TransformT>,
+ typename BinaryPolicyT = binary_identity_policy<TransformT>
+ >
+ struct transform_policies :
+ public PlainPolicyT,
+ public UnaryPolicyT,
+ public ActionPolicyT,
+ public BinaryPolicyT
+ {
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Identity transformation
+ //
+ // The identity_transform metafunction supplied to the traverse
+ // template will generate a new parser, which will be exactly
+ // identical to the parser given as the parameter to the traverse
+ // metafunction. I.e. the following conceptual 'equation' will be
+ // always true:
+ //
+ // some_parser ==
+ // post_order::traverse(identity_transform(), some_parser)
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ struct identity_transform : transform_policies<identity_transform> {};
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // !defined(BOOST_SPIRIT_TRAVERSE_HPP)
diff --git a/boost/spirit/home/classic/namespace.hpp b/boost/spirit/home/classic/namespace.hpp
new file mode 100644
index 0000000000..f64fc81bb6
--- /dev/null
+++ b/boost/spirit/home/classic/namespace.hpp
@@ -0,0 +1,35 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(SPIRIT_CLASSIC_NAMESPACE_HPP)
+#define SPIRIT_CLASSIC_NAMESPACE_HPP
+
+#if defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+
+// Use the old namespace for Spirit.Classic, everything is located in the
+// namespace boost::spirit.
+// This is in place for backwards compatibility with Spirit V1.8.x. Don't use
+// it when combining Spirit.Classic with other parts of the library
+
+#define BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN /*namespace classic {*/
+#define BOOST_SPIRIT_CLASSIC_NS boost::spirit/*::classic*/
+#define BOOST_SPIRIT_CLASSIC_NAMESPACE_END /*}*/
+
+#else
+
+// This is the normal (and suggested) mode of operation when using
+// Spirit.Classic. Everything will be located in the namespace
+// boost::spirit::classic, avoiding name clashes with other parts of Spirit.
+
+#define BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN namespace classic {
+#define BOOST_SPIRIT_CLASSIC_NS boost::spirit::classic
+#define BOOST_SPIRIT_CLASSIC_NAMESPACE_END }
+
+#endif
+
+#endif
diff --git a/boost/spirit/home/classic/phoenix.hpp b/boost/spirit/home/classic/phoenix.hpp
new file mode 100644
index 0000000000..c0aadd1743
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix.hpp
@@ -0,0 +1,25 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_PHOENIX_HPP)
+#define BOOST_SPIRIT_PHOENIX_HPP
+
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+#include <boost/spirit/home/classic/phoenix/tuple_helpers.hpp>
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+#include <boost/spirit/home/classic/phoenix/primitives.hpp>
+#include <boost/spirit/home/classic/phoenix/composite.hpp>
+#include <boost/spirit/home/classic/phoenix/functions.hpp>
+#include <boost/spirit/home/classic/phoenix/operators.hpp>
+#include <boost/spirit/home/classic/phoenix/special_ops.hpp>
+#include <boost/spirit/home/classic/phoenix/statements.hpp>
+#include <boost/spirit/home/classic/phoenix/binders.hpp>
+#include <boost/spirit/home/classic/phoenix/closures.hpp>
+#include <boost/spirit/home/classic/phoenix/casts.hpp>
+#include <boost/spirit/home/classic/phoenix/new.hpp>
+
+#endif // !defined(BOOST_SPIRIT_PHOENIX_HPP)
diff --git a/boost/spirit/home/classic/phoenix/actor.hpp b/boost/spirit/home/classic/phoenix/actor.hpp
new file mode 100644
index 0000000000..67a4b02898
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/actor.hpp
@@ -0,0 +1,604 @@
+/*=============================================================================
+ Phoenix v1.2
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_ACTOR_HPP
+#define PHOENIX_ACTOR_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+// These are forward declared here because we cannot include impl.hpp
+// or operators.hpp yet but the actor's assignment operator and index
+// operator are required to be members.
+
+//////////////////////////////////
+struct assign_op;
+struct index_op;
+
+//////////////////////////////////
+namespace impl {
+
+ template <typename OperationT, typename BaseT, typename B>
+ struct make_binary1;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// unpack_tuple class
+//
+// This class is used to unpack a supplied tuple such, that the members of
+// this tuple will be handled as if they would be supplied separately.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TupleT>
+struct unpack_tuple : public TupleT {
+
+ typedef TupleT tuple_t;
+
+ unpack_tuple() {}
+ unpack_tuple(tuple_t const &tuple_) : TupleT(tuple_) {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// actor class
+//
+// This class is a protocol class for all actors. This class is
+// essentially an interface contract. The actor class does not
+// really know how how to act on anything but instead relies on the
+// template parameter BaseT (from which the actor will derive from)
+// to do the actual action.
+//
+// An actor is a functor that is capable of accepting arguments up
+// to a predefined maximum. It is up to the base class to do the
+// actual processing or possibly to limit the arity (no. of
+// arguments) passed in. Upon invocation of the functor through a
+// supplied operator(), the actor funnels the arguments passed in
+// by the client into a tuple and calls the base eval member
+// function.
+//
+// Schematically:
+//
+// arg0 ---------|
+// arg1 ---------|
+// arg2 ---------|---> tupled_args ---> base.eval
+// ... |
+// argN ---------|
+//
+// actor::operator()(arg0, arg1... argN)
+// ---> BaseT::eval(tupled_args);
+//
+// Actor base classes from which this class inherits from are
+// expected to have a corresponding member function eval compatible
+// with the conceptual Interface:
+//
+// template <typename TupleT>
+// actor_return_type
+// eval(TupleT const& args) const;
+//
+// where args are the actual arguments passed in by the client
+// funneled into a tuple (see tuple.hpp for details).
+//
+// The actor_return_type can be anything. Base classes are free to
+// return any type, even argument dependent types (types that are
+// deduced from the types of the arguments). After evaluating the
+// parameters and doing some computations or actions, the eval
+// member function concludes by returning something back to the
+// client. To do this, the forwarding function (the actor's
+// operator()) needs to know the return type of the eval member
+// function that it is calling. For this purpose, actor base
+// classes are required to provide a nested template class:
+//
+// template <typename TupleT>
+// struct result;
+//
+// This auxiliary class provides the result type information
+// returned by the eval member function of a base actor class. The
+// nested template class result should have a typedef 'type' that
+// reflects the return type of its member function eval. It is
+// basically a type computer that answers the question "given
+// arguments packed into a TupleT type, what will be the result
+// type of the eval member function of ActorT?". The template class
+// actor_result queries this to extract the return type of an
+// actor. Example:
+//
+// typedef typename actor_result<ActorT, TupleT>::type
+// actor_return_type;
+//
+// where actor_return_type is the actual type returned by ActorT's
+// eval member function given some arguments in a TupleT.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActorT, typename TupleT>
+struct actor_result {
+
+ typedef typename ActorT::template result<TupleT>::type type;
+ typedef typename remove_reference<type>::type plain_type;
+};
+
+//////////////////////////////////
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+template <typename BaseT>
+struct actor : public BaseT {
+
+ actor();
+ actor(BaseT const& base);
+
+ typename actor_result<BaseT, tuple<> >::type
+ operator()() const;
+
+ template <typename A>
+ typename actor_result<BaseT, tuple<A&> >::type
+ operator()(A& a) const;
+
+ template <typename A, typename B>
+ typename actor_result<BaseT, tuple<A&, B&> >::type
+ operator()(A& a, B& b) const;
+
+ template <typename A, typename B, typename C>
+ typename actor_result<BaseT, tuple<A&, B&, C&> >::type
+ operator()(A& a, B& b, C& c) const;
+
+#if PHOENIX_LIMIT > 3
+ template <typename A, typename B, typename C, typename D>
+ typename actor_result<BaseT, tuple<A&, B&, C&, D&> >::type
+ operator()(A& a, B& b, C& c, D& d) const;
+
+ template <typename A, typename B, typename C, typename D, typename E>
+ typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&> >::type
+ operator()(A& a, B& b, C& c, D& d, E& e) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F>
+ typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&, F&> >::type
+ operator()(A& a, B& b, C& c, D& d, E& e, F& f) const;
+
+#if PHOENIX_LIMIT > 6
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G>
+ typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&, F&, G&> >::type
+ operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H>
+ typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&>
+ >::type
+ operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I>
+ typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
+ >::type
+ operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i) const;
+
+#if PHOENIX_LIMIT > 9
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J>
+ typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
+ >::type
+ operator()(
+ A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K>
+ typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
+ >::type
+ operator()(
+ A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+ K& k) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L>
+ typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
+ >::type
+ operator()(
+ A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+ K& k, L& l) const;
+
+#if PHOENIX_LIMIT > 12
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M>
+ typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
+ >::type
+ operator()(
+ A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+ K& k, L& l, M& m) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N>
+ typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
+ >::type
+ operator()(
+ A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+ K& k, L& l, M& m, N& n) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O>
+ typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
+ >::type
+ operator()(
+ A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+ K& k, L& l, M& m, N& n, O& o) const;
+
+#endif
+#endif
+#endif
+#endif
+
+ template <typename TupleT>
+ typename actor_result<BaseT, unpack_tuple<TupleT> >::type
+ operator()(unpack_tuple<TupleT> const &t) const;
+
+ template <typename B>
+ typename impl::make_binary1<assign_op, BaseT, B>::type
+ operator=(B const& b) const;
+
+ template <typename B>
+ typename impl::make_binary1<index_op, BaseT, B>::type
+ operator[](B const& b) const;
+};
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+///////////////////////////////////////////////////////////////////////////
+//
+// as_actor
+//
+// as_actor is a meta-program that converts an arbitrary type into
+// an actor. All participants in the framework must be first-class
+// actors. This meta-program is used all throughout the framework
+// whenever an unknown type needs to be converted to an actor.
+// as_actor specializations are expected to have a typedef 'type'.
+// This is the destination actor type. A static member function
+// 'convert' converts an object to this target type.
+//
+// The meta-program does no conversion if the object to be
+// converted is already an actor.
+//
+///////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct as_actor;
+
+//////////////////////////////////
+template <typename BaseT>
+struct as_actor<actor<BaseT> > {
+
+ typedef actor<BaseT> type;
+ static type convert(actor<BaseT> const& x) { return x; }
+};
+
+//////////////////////////////////
+template <>
+struct as_actor<nil_t> {
+
+ typedef nil_t type;
+ static nil_t convert(nil_t /*x*/)
+ { return nil_t(); }
+};
+
+//////////////////////////////////
+template <>
+struct as_actor<void> {
+
+ typedef void type;
+ // ERROR!!!
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// actor class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BaseT>
+actor<BaseT>::actor()
+: BaseT() {}
+
+//////////////////////////////////
+template <typename BaseT>
+actor<BaseT>::actor(BaseT const& base)
+: BaseT(base) {}
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename actor_result<BaseT, tuple<> >::type
+actor<BaseT>::operator()() const
+{
+ return BaseT::eval(tuple<>());
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename A>
+inline typename actor_result<BaseT, tuple<A&> >::type
+actor<BaseT>::operator()(A& a_) const
+{
+ return BaseT::eval(tuple<A&>(a_));
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename A, typename B>
+inline typename actor_result<BaseT, tuple<A&, B&> >::type
+actor<BaseT>::operator()(A& a_, B& b_) const
+{
+ return BaseT::eval(tuple<A&, B&>(a_, b_));
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename A, typename B, typename C>
+inline typename actor_result<BaseT, tuple<A&, B&, C&> >::type
+actor<BaseT>::operator()(A& a_, B& b_, C& c_) const
+{
+ return BaseT::eval(tuple<A&, B&, C&>(a_, b_, c_));
+}
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename BaseT>
+template <typename A, typename B, typename C, typename D>
+inline typename actor_result<BaseT, tuple<A&, B&, C&, D&> >::type
+actor<BaseT>::operator()(A& a_, B& b_, C& c_, D& d_) const
+{
+ return BaseT::eval(tuple<A&, B&, C&, D&>(a_, b_, c_, d_));
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename A, typename B, typename C, typename D, typename E>
+inline typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&> >::type
+actor<BaseT>::operator()(A& a_, B& b_, C& c_, D& d_, E& e_) const
+{
+ return BaseT::eval(tuple<A&, B&, C&, D&, E&>(a_, b_, c_, d_, e_));
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&>
+ (a_, b_, c_, d_, e_, f_)
+ );
+}
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&>
+ (a_, b_, c_, d_, e_, f_, g_)
+ );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&>
+ (a_, b_, c_, d_, e_, f_, g_, h_)
+ );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
+ (a_, b_, c_, d_, e_, f_, g_, h_, i_)
+ );
+}
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
+ (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_)
+ );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
+ K& k_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
+ (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_)
+ );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
+ K& k_, L& l_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
+ (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_, l_)
+ );
+}
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
+ K& k_, L& l_, M& m_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
+ (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_, l_, m_)
+ );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
+ K& k_, L& l_, M& m_, N& n_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
+ (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_, l_, m_, n_)
+ );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O>
+inline typename actor_result<BaseT,
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
+>::type
+actor<BaseT>::operator()(
+ A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
+ K& k_, L& l_, M& m_, N& n_, O& o_
+) const
+{
+ return BaseT::eval(
+ tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
+ (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_, l_, m_, n_, o_)
+ );
+}
+
+#endif
+#endif
+#endif
+#endif
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename TupleT>
+typename actor_result<BaseT, unpack_tuple<TupleT> >::type
+actor<BaseT>::operator()(unpack_tuple<TupleT> const &t) const
+{
+ return BaseT::eval(t);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace phoenix
+
+#endif
diff --git a/boost/spirit/home/classic/phoenix/binders.hpp b/boost/spirit/home/classic/phoenix/binders.hpp
new file mode 100644
index 0000000000..a1d115903e
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/binders.hpp
@@ -0,0 +1,4066 @@
+/*=============================================================================
+ Phoenix v1.2
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_BINDERS_HPP
+#define PHOENIX_BINDERS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/functions.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/mpl/if.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Binders
+//
+// There are times when it is desireable to bind a simple functor,
+// function, member function or member variable for deferred
+// evaluation. This can be done through the binding facilities
+// provided below. There are template classes:
+//
+// 1) function_ptr ( function pointer binder )
+// 2) functor ( functor pointer binder )
+// 3) member_function_ptr ( member function pointer binder )
+// 4) member_var_ptr ( member variable pointer binder )
+//
+// These template classes are specialized lazy function classes for
+// functors, function pointers, member function pointers and member
+// variable pointers, respectively. These are subclasses of the
+// lazy-function class (see functions.hpp). Each of these has a
+// corresponding overloaded bind(x) function. Each bind(x) function
+// generates a suitable binder object.
+//
+// Example, given a function foo:
+//
+// void foo_(int n) { std::cout << n << std::endl; }
+//
+// Here's how the function foo is bound:
+//
+// bind(&foo_)
+//
+// This bind expression results to a lazy-function (see
+// functions.hpp) that is lazily evaluated. This bind expression is
+// also equivalent to:
+//
+// function_ptr<void, int> foo = &foo_;
+//
+// The template parameter of the function_ptr is the return and
+// argument types of actual signature of the function to be bound
+// read from left to right:
+//
+// void foo_(int); ---> function_ptr<void, int>
+//
+// Either bind(&foo_) and its equivalent foo can now be used in the
+// same way a lazy function (see functions.hpp) is used:
+//
+// bind(&foo_)(arg1)
+//
+// or
+//
+// foo(arg1)
+//
+// The latter, of course, being much easier to understand. This is
+// now a full-fledged lazy function that can finally be evaluated
+// by another function call invocation. A second function call will
+// invoke the actual foo function:
+//
+// int i = 4;
+// foo(arg1)(i);
+//
+// will print out "4".
+//
+// Binding functors and member functions can be done similarly.
+// Here's how to bind a functor (e.g. std::plus<int>):
+//
+// bind(std::plus<int>())
+//
+// or
+//
+// functor<std::plus<int> > plus;
+//
+// Again, these are full-fledged lazy functions. In this case,
+// unlike the first example, expect 2 arguments (std::plus<int>
+// needs two arguments lhs and rhs). Either or both of which can be
+// lazily bound:
+//
+// plus(arg1, arg2) // arg1 + arg2
+// plus(100, arg1) // 100 + arg1
+// plus(100, 200) // 300
+//
+// A bound member function takes in a pointer or reference to an
+// object as the first argument. For instance, given:
+//
+// struct xyz { void foo(int) const; };
+//
+// xyz's foo member function can be bound as:
+//
+// bind(&xyz::foo)
+//
+// or
+//
+// member_function_ptr<void, xyz, int> xyz_foo = &xyz::foo;
+//
+// The template parameter of the member_function_ptr is the return,
+// class and argument types of actual signature of the function to
+// be bound read from left to right:
+//
+// void xyz::foo_(int); ---> member_function_ptr<void, xyz, int>
+//
+// Take note that a member_function_ptr lazy-function expects the
+// first argument to be a pointer or reference to an object. Both
+// the object (reference or pointer) and the arguments can be
+// lazily bound. Examples:
+//
+// xyz obj;
+// xyz_foo(arg1, arg2) // arg1.foo(arg2)
+// xyz_foo(obj, arg1) // obj.foo(arg1)
+// xyz_foo(obj, 100) // obj.foo(100)
+//
+// Be reminded that var(obj) must be used to call non-const member
+// functions. For example, if xyz was declared as:
+//
+// struct xyz { void foo(int); };
+//
+// the pointer or reference to the object must also be non-const.
+// Lazily bound arguments are stored as const value by default (see
+// variable class in primitives.hpp).
+//
+// xyz_foo(var(obj), 100) // obj.foo(100)
+//
+// Finally, member variables can be bound much like member
+// functions. For instance, given:
+//
+// struct xyz { int v; };
+//
+// xyz::v can be bound as:
+//
+// bind(&xyz::v)
+// or
+//
+// member_var_ptr<int, xyz> xyz_v = &xyz::v;
+//
+// The template parameter of the member_var_ptr is the type of the
+// variable followed by the class:
+//
+// int xyz::v; ---> member_var_ptr<int, xyz>
+//
+// Just like the member_function_ptr, member_var_ptr also expects
+// the first argument to be a pointer or reference to an object.
+// Both the object (reference or pointer) and the arguments can be
+// lazily bound. Examples:
+//
+// xyz obj;
+// xyz_v(arg1) // arg1.v
+// xyz_v(obj) // obj.v
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Functor binder
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename FuncT>
+struct functor_action : public FuncT {
+
+#if !defined(__BORLANDC__) && (!defined(__MWERKS__) || (__MWERKS__ > 0x3002))
+
+ template <
+ typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+ >
+ struct result { typedef typename FuncT::result_type type; };
+#endif
+
+ functor_action(FuncT fptr_ = FuncT())
+ : FuncT(fptr_) {}
+};
+
+#if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The following specializations are needed because Borland and CodeWarrior
+// does not accept default template arguments in nested template classes in
+// classes (i.e functor_action::result)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename FuncT, typename TupleT>
+struct composite0_result<functor_action<FuncT>, TupleT> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A>
+struct composite1_result<functor_action<FuncT>, TupleT, A> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B>
+struct composite2_result<functor_action<FuncT>, TupleT, A, B> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C>
+struct composite3_result<functor_action<FuncT>, TupleT, A, B, C> {
+
+ typedef typename FuncT::result_type type;
+};
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D>
+struct composite4_result<functor_action<FuncT>, TupleT,
+ A, B, C, D> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E>
+struct composite5_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F>
+struct composite6_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F> {
+
+ typedef typename FuncT::result_type type;
+};
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G>
+struct composite7_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H>
+struct composite8_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G, H> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I>
+struct composite9_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G, H, I> {
+
+ typedef typename FuncT::result_type type;
+};
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J>
+struct composite10_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G, H, I, J> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K>
+struct composite11_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L>
+struct composite12_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L> {
+
+ typedef typename FuncT::result_type type;
+};
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M>
+struct composite13_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N>
+struct composite14_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
+
+ typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O>
+struct composite15_result<functor_action<FuncT>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
+
+ typedef typename FuncT::result_type type;
+};
+
+#endif
+#endif
+#endif
+#endif
+#endif
+
+//////////////////////////////////
+template <typename FuncT>
+struct functor : public function<functor_action<FuncT> > {
+
+ functor(FuncT func)
+ : function<functor_action<FuncT> >(functor_action<FuncT>(func)) {};
+};
+
+//////////////////////////////////
+template <typename FuncT>
+inline functor<FuncT>
+bind(FuncT func)
+{
+ return functor<FuncT>(func);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member variable pointer binder
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+ //////////////////////////////////
+ template <typename T>
+ struct as_ptr {
+
+ typedef T* pointer_type;
+
+ static T* get(T& ref)
+ { return &ref; }
+ };
+
+ //////////////////////////////////
+ template <typename T>
+ struct as_ptr<T*> {
+
+ typedef T* pointer_type;
+
+ static T* get(T* ptr)
+ { return ptr; }
+ };
+}
+
+//////////////////////////////////
+template <typename ActionT, typename ClassT>
+struct member_var_ptr_action_result {
+
+ typedef typename ActionT::template result<ClassT>::type type;
+};
+
+//////////////////////////////////
+template <typename T, typename ClassT>
+struct member_var_ptr_action {
+
+ typedef member_var_ptr_action<T, ClassT> self_t;
+
+ template <typename CT>
+ struct result {
+ typedef typename boost::mpl::if_<boost::is_const<CT>, T const&, T&
+ >::type type;
+ };
+
+ typedef T ClassT::*mem_var_ptr_t;
+
+ member_var_ptr_action(mem_var_ptr_t ptr_)
+ : ptr(ptr_) {}
+
+ template <typename CT>
+ typename member_var_ptr_action_result<self_t, CT>::type
+ operator()(CT& obj) const
+ { return impl::as_ptr<CT>::get(obj)->*ptr; }
+
+ mem_var_ptr_t ptr;
+};
+
+//////////////////////////////////
+template <typename T, typename ClassT>
+struct member_var_ptr
+: public function<member_var_ptr_action<T, ClassT> > {
+
+ member_var_ptr(T ClassT::*mp)
+ : function<member_var_ptr_action<T, ClassT> >
+ (member_var_ptr_action<T, ClassT>(mp)) {}
+};
+
+//////////////////////////////////
+template <typename T, typename ClassT>
+inline member_var_ptr<T, ClassT>
+bind(T ClassT::*mp)
+{
+ return member_var_ptr<T, ClassT>(mp);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (main class)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename RT
+ , typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+ , typename NU = nil_t // Not used
+>
+struct function_ptr_action;
+
+//////////////////////////////////
+template <
+ typename RT
+ , typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+>
+struct function_ptr
+: public function<function_ptr_action<RT
+ , A, B, C
+#if PHOENIX_LIMIT > 3
+ , D, E, F
+#if PHOENIX_LIMIT > 6
+ , G, H, I
+#if PHOENIX_LIMIT > 9
+ , J, K, L
+#if PHOENIX_LIMIT > 12
+ , M, N, O
+#endif
+#endif
+#endif
+#endif
+ > > {
+
+ typedef function_ptr_action<RT
+ , A, B, C
+#if PHOENIX_LIMIT > 3
+ , D, E, F
+#if PHOENIX_LIMIT > 6
+ , G, H, I
+#if PHOENIX_LIMIT > 9
+ , J, K, L
+#if PHOENIX_LIMIT > 12
+ , M, N, O
+#endif
+#endif
+#endif
+#endif
+ > action_t;
+
+ template <typename FPT>
+ function_ptr(FPT fp)
+ : function<action_t>(action_t(fp)) {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 0 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT>
+struct function_ptr_action<RT,
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)();
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()() const
+ { return fptr(); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT>
+inline function_ptr<RT>
+bind(RT(*fptr)())
+{
+ return function_ptr<RT>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 1 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename A>
+struct function_ptr_action<RT,
+ A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A);
+
+ template <typename A_>
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(A a) const
+ { return fptr(a); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename A>
+inline function_ptr<RT, A>
+bind(RT(*fptr)(A))
+{
+ return function_ptr<RT, A>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 2 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename A, typename B>
+struct function_ptr_action<RT,
+ A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B);
+
+ template <typename A_, typename B_>
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(A a, B b) const
+ { return fptr(a, b); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename A, typename B>
+inline function_ptr<RT, A, B>
+bind(RT(*fptr)(A, B))
+{
+ return function_ptr<RT, A, B>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 3 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename A, typename B, typename C>
+struct function_ptr_action<RT,
+ A, B, C,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C);
+
+ template <typename A_, typename B_, typename C_>
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(A a, B b, C c) const
+ { return fptr(a, b, c); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename A, typename B, typename C>
+inline function_ptr<RT, A, B, C>
+bind(RT(*fptr)(A, B, C))
+{
+ return function_ptr<RT, A, B, C>(fptr);
+}
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 4 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename A, typename B, typename C, typename D>
+struct function_ptr_action<RT,
+ A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D);
+
+ template <typename A_, typename B_, typename C_, typename D_>
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(A a, B b, C c, D d) const
+ { return fptr(a, b, c, d); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename A, typename B, typename C, typename D>
+inline function_ptr<RT, A, B, C, D>
+bind(RT(*fptr)(A, B, C, D))
+{
+ return function_ptr<RT, A, B, C, D>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 5 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e
+ ) const
+ { return fptr(a, b, c, d, e); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E
+>
+inline function_ptr<RT, A, B, C, D, E>
+bind(RT(*fptr)(A, B, C, D, E))
+{
+ return function_ptr<RT, A, B, C, D, E>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 6 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f
+ ) const
+ { return fptr(a, b, c, d, e, f); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+>
+inline function_ptr<RT, A, B, C, D, E, F>
+bind(RT(*fptr)(A, B, C, D, E, F))
+{
+ return function_ptr<RT, A, B, C, D, E, F>(fptr);
+}
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 7 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g
+ ) const
+ { return fptr(a, b, c, d, e, f, g); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+>
+inline function_ptr<RT, A, B, C, D, E, F, G>
+bind(RT(*fptr)(A, B, C, D, E, F, G))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 8 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_, typename H_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g, H h
+ ) const
+ { return fptr(a, b, c, d, e, f, g, h); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G, H>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 9 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, H, I,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_, typename H_, typename I_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g, H h, I i
+ ) const
+ { return fptr(a, b, c, d, e, f, g, h, i); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G, H, I>(fptr);
+}
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 10 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_, typename H_, typename I_, typename J_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g, H h, I i, J j
+ ) const
+ { return fptr(a, b, c, d, e, f, g, h, i, j); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G, H, I, J>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 11 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_, typename H_, typename I_, typename J_,
+ typename K_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g, H h, I i, J j,
+ K k
+ ) const
+ { return fptr(a, b, c, d, e, f, g, h, i, j, k); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 12 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, H, I, J, K, L,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_, typename H_, typename I_, typename J_,
+ typename K_, typename L_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g, H h, I i, J j,
+ K k, L l
+ ) const
+ { return fptr(a, b, c, d, e, f, g, h, i, j, k, l); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
+}
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 13 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_, typename H_, typename I_, typename J_,
+ typename K_, typename L_, typename M_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g, H h, I i, J j,
+ K k, L l, M m
+ ) const
+ { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 14 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_, typename H_, typename I_, typename J_,
+ typename K_, typename L_, typename M_, typename N_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g, H h, I i, J j,
+ K k, L l, M m, N n
+ ) const
+ { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m, n); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function pointer binder (specialization for 15 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+>
+struct function_ptr_action<RT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
+
+ template <
+ typename A_, typename B_, typename C_, typename D_, typename E_,
+ typename F_, typename G_, typename H_, typename I_, typename J_,
+ typename K_, typename L_, typename M_, typename N_, typename O_
+ >
+ struct result { typedef result_type type; };
+
+ function_ptr_action(func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e,
+ F f, G g, H h, I i, J j,
+ K k, L l, M m, N n, O o
+ ) const
+ { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o); }
+
+ func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
+{
+ return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
+}
+
+#endif
+#endif
+#endif
+#endif
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (main class)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename RT,
+ typename ClassT
+ , typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+ , typename NU = nil_t // Not used
+>
+struct member_function_ptr_action;
+
+//////////////////////////////////
+template <
+ typename RT,
+ typename ClassT
+ , typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+>
+struct member_function_ptr
+: public function<member_function_ptr_action<RT, ClassT
+ , A, B, C
+#if PHOENIX_LIMIT > 3
+ , D, E, F
+#if PHOENIX_LIMIT > 6
+ , G, H, I
+#if PHOENIX_LIMIT > 9
+ , J, K, L
+#if PHOENIX_LIMIT > 12
+ , M, N, O
+#endif
+#endif
+#endif
+#endif
+ > > {
+
+ typedef member_function_ptr_action<RT, ClassT
+ , A, B, C
+#if PHOENIX_LIMIT > 3
+ , D, E, F
+#if PHOENIX_LIMIT > 6
+ , G, H, I
+#if PHOENIX_LIMIT > 9
+ , J, K, L
+#if PHOENIX_LIMIT > 12
+ , M, N, O
+#endif
+#endif
+#endif
+#endif
+ > action_t;
+
+ template <typename FPT>
+ member_function_ptr(FPT fp)
+ : function<action_t>(action_t(fp)) {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 0 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT>
+struct member_function_ptr_action<RT, ClassT,
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)();
+ typedef RT(ClassT::*cmf)() const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT>
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT>
+inline member_function_ptr<RT, ClassT>
+bind(RT(ClassT::*fptr)())
+{
+ return member_function_ptr<RT, ClassT>(fptr);
+}
+
+template <typename RT, typename ClassT>
+inline member_function_ptr<RT, ClassT const>
+bind(RT(ClassT::*fptr)() const)
+{
+ return member_function_ptr<RT, ClassT const>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 1 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+struct member_function_ptr_action<RT, ClassT,
+ A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A);
+ typedef RT(ClassT::*cmf)(A) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT, typename A_>
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj, A a) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+inline member_function_ptr<RT, ClassT, A>
+bind(RT(ClassT::*fptr)(A))
+{
+ return member_function_ptr<RT, ClassT, A>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+inline member_function_ptr<RT, ClassT const, A>
+bind(RT(ClassT::*fptr)(A) const)
+{
+ return member_function_ptr<RT, ClassT const, A>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 2 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B);
+ typedef RT(ClassT::*cmf)(A, B) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT, typename A_, typename B_>
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj, A a, B b) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+inline member_function_ptr<RT, ClassT, A, B>
+bind(RT(ClassT::*fptr)(A, B))
+{
+ return member_function_ptr<RT, ClassT, A, B>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+inline member_function_ptr<RT, ClassT const, A, B>
+bind(RT(ClassT::*fptr)(A, B) const)
+{
+ return member_function_ptr<RT, ClassT const, A, B>(fptr);
+}
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 3 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C);
+ typedef RT(ClassT::*cmf)(A, B, C) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT, typename A_, typename B_, typename C_>
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj, A a, B b, C c) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline member_function_ptr<RT, ClassT, A, B, C>
+bind(RT(ClassT::*fptr)(A, B, C))
+{
+ return member_function_ptr<RT, ClassT, A, B, C>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline member_function_ptr<RT, ClassT const, A, B, C>
+bind(RT(ClassT::*fptr)(A, B, C) const)
+{
+ return member_function_ptr<RT, ClassT const, A, B, C>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 4 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D);
+ typedef RT(ClassT::*cmf)(A, B, C, D) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d
+ ) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D>
+bind(RT(ClassT::*fptr)(A, B, C, D))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D>
+bind(RT(ClassT::*fptr)(A, B, C, D) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 5 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e
+ ) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E>
+bind(RT(ClassT::*fptr)(A, B, C, D, E))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E>
+bind(RT(ClassT::*fptr)(A, B, C, D, E) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E>(fptr);
+}
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 6 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f
+ ) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 7 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g
+ ) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 8 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g, H h
+ ) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g, h); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G, H>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G, H>(fptr);
+}
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 9 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g, H h, I i
+ ) const
+ { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g, h, i); }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G, H, I>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 10 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j
+ ) const
+ {
+ return (impl::as_ptr<CT>::get(obj)->*fptr)
+ (a, b, c, d, e, f, g, h, i, j);
+ }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 11 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k
+ ) const
+ {
+ return (impl::as_ptr<CT>::get(obj)->*fptr)
+ (a, b, c, d, e, f, g, h, i, j, k);
+ }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(fptr);
+}
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 12 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, L, nil_t, nil_t, nil_t, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_, typename L_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l
+ ) const
+ {
+ return (impl::as_ptr<CT>::get(obj)->*fptr)
+ (a, b, c, d, e, f, g, h, i, j, k, l);
+ }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 13 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_, typename L_, typename M_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m
+ ) const
+ {
+ return (impl::as_ptr<CT>::get(obj)->*fptr)
+ (a, b, c, d, e, f, g, h, i, j, k, l, m);
+ }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 14 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_, typename L_, typename M_, typename N_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n
+ ) const
+ {
+ return (impl::as_ptr<CT>::get(obj)->*fptr)
+ (a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+ }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Member function pointer binder (specialization for 15 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N,
+ typename O
+>
+struct member_function_ptr_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT,
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_, typename L_, typename M_, typename N_,
+ typename O_
+ >
+ struct result { typedef result_type type; };
+
+ member_function_ptr_action(mem_func_ptr_t fptr_)
+ : fptr(fptr_) {}
+
+ template <typename CT>
+ result_type operator()(CT& obj,
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n, O o
+ ) const
+ {
+ return (impl::as_ptr<CT>::get(obj)->*fptr)
+ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+ }
+
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N,
+ typename O
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
+{
+ return member_function_ptr<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N,
+ typename O
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
+{
+ return member_function_ptr<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
+}
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (main class)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename RT,
+ typename ClassT
+ , typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+ , typename NU = nil_t // Not used
+>
+struct bound_member_action;
+
+//////////////////////////////////
+template <
+ typename RT,
+ typename ClassT
+ , typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+>
+struct bound_member
+: public function<bound_member_action<RT, ClassT
+ , A, B, C
+#if PHOENIX_LIMIT > 3
+ , D, E, F
+#if PHOENIX_LIMIT > 6
+ , G, H, I
+#if PHOENIX_LIMIT > 9
+ , J, K, L
+#if PHOENIX_LIMIT > 12
+ , M, N, O
+#endif
+#endif
+#endif
+#endif
+ > > {
+
+ typedef bound_member_action<RT, ClassT
+ , A, B, C
+#if PHOENIX_LIMIT > 3
+ , D, E, F
+#if PHOENIX_LIMIT > 6
+ , G, H, I
+#if PHOENIX_LIMIT > 9
+ , J, K, L
+#if PHOENIX_LIMIT > 12
+ , M, N, O
+#endif
+#endif
+#endif
+#endif
+ > action_t;
+
+ template <typename CT, typename FPT>
+ bound_member(CT & c, FPT fp)
+ : function<action_t>(action_t(c,fp)) {}
+
+#if !defined(__BORLANDC__)
+ template <typename CT, typename FPT>
+ bound_member(CT * c, FPT fp)
+ : function<action_t>(action_t(c,fp)) {}
+#endif
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 0 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename RT, typename ClassT>
+struct bound_member_action<RT, ClassT,
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)();
+ typedef RT(ClassT::*cmf)() const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename CT>
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()() const
+ { return (obj->*fptr)(); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+
+template <typename RT, typename ClassT>
+inline bound_member<RT,ClassT>
+bind(ClassT & obj, RT(ClassT::*fptr)())
+{
+ return bound_member<RT,ClassT>(obj, fptr);
+}
+
+template <typename RT, typename ClassT>
+inline bound_member<RT,ClassT>
+bind(ClassT * obj, RT(ClassT::*fptr)())
+{
+#if defined(__MWERKS__) && (__MWERKS__ < 0x3003)
+ return bound_member<RT,ClassT>(*obj, fptr);
+#else
+ return bound_member<RT,ClassT>(obj, fptr);
+#endif
+}
+
+template <typename RT, typename ClassT>
+inline bound_member<RT,ClassT const>
+bind(ClassT const& obj, RT(ClassT::*fptr)())
+{
+ return bound_member<RT,ClassT const>(obj, fptr);
+}
+
+template <typename RT, typename ClassT>
+inline bound_member<RT,ClassT const>
+bind(ClassT const* obj, RT(ClassT::*fptr)() const)
+{
+#if defined(__MWERKS__) && (__MWERKS__ < 0x3003)
+ return bound_member<RT,ClassT const>(*obj, fptr);
+#else
+ return bound_member<RT,ClassT const>(obj, fptr);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 1 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+struct bound_member_action<RT, ClassT,
+ A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A);
+ typedef RT(ClassT::*cmf)(A) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename A_>
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(A a) const
+ { return (obj->*fptr)(a); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+inline bound_member<RT, ClassT, A>
+bind(ClassT & obj, RT(ClassT::*fptr)(A))
+{
+ return bound_member<RT, ClassT, A>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A>
+inline bound_member<RT, ClassT, A>
+bind(ClassT * obj, RT(ClassT::*fptr)(A))
+{
+ return bound_member<RT, ClassT, A>(obj,fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+inline bound_member<RT, ClassT const, A>
+bind(ClassT const& obj, RT(ClassT::*fptr)(A) const)
+{
+ return bound_member<RT, ClassT const, A>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A>
+inline bound_member<RT, ClassT const, A>
+bind(ClassT const* obj, RT(ClassT::*fptr)(A) const)
+{
+ return bound_member<RT, ClassT const, A>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 2 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+struct bound_member_action<RT, ClassT,
+ A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B);
+ typedef RT(ClassT::*cmf)(A, B) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename A_, typename B_>
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(A a, B b) const
+ { return (obj->*fptr)(a, b); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+inline bound_member<RT, ClassT, A, B>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B))
+{
+ return bound_member<RT, ClassT, A, B>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B>
+inline bound_member<RT, ClassT, A, B>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B))
+{
+ return bound_member<RT, ClassT, A, B>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B>
+inline bound_member<RT, ClassT const, A, B>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B) const)
+{
+ return bound_member<RT, ClassT const, A, B>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B>
+inline bound_member<RT, ClassT const, A, B>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B) const)
+{
+ return bound_member<RT, ClassT const, A, B>(obj,fptr);
+}
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 3 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+struct bound_member_action<RT, ClassT,
+ A, B, C, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C);
+ typedef RT(ClassT::*cmf)(A, B, C) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename A_, typename B_, typename C_>
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(A a, B b, C c) const
+ { return (obj->*fptr)(a, b, c); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline bound_member<RT, ClassT, A, B, C>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C))
+{
+ return bound_member<RT, ClassT, A, B, C>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline bound_member<RT, ClassT, A, B, C>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C))
+{
+ return bound_member<RT, ClassT, A, B, C>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline bound_member<RT, ClassT const, A, B, C>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C) const)
+{
+ return bound_member<RT, ClassT const, A, B, C>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline bound_member<RT, ClassT const, A, B, C>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C) const)
+{
+ return bound_member<RT, ClassT const, A, B, C>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 4 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D);
+ typedef RT(ClassT::*cmf)(A, B, C, D) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename A_, typename B_, typename C_, typename D_>
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(A a, B b, C c, D d) const
+ { return (obj->*fptr)(a, b, c, d); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D
+>
+inline bound_member<RT, ClassT, A, B, C, D>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D
+>
+inline bound_member<RT, ClassT, A, B, C, D>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D
+>
+inline bound_member<RT, ClassT const, A, B, C, D>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D
+>
+inline bound_member<RT, ClassT const, A, B, C, D>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 5 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <typename A_, typename B_, typename C_, typename D_,
+ typename E_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e
+ ) const
+ { return (obj->*fptr)(a, b, c, d, e); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E
+>
+inline bound_member<RT, ClassT, A, B, C, D, E>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E
+>
+inline bound_member<RT, ClassT, A, B, C, D, E>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E>(obj,fptr);
+}
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 6 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f
+ ) const
+ { return (obj->*fptr)(a, b, c, d, e, f); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 7 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g
+ ) const
+ { return (obj->*fptr)(a, b, c, d, e, f, g); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 8 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g, H h
+ ) const
+ { return (obj->*fptr)(a, b, c, d, e, f, g, h); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H>(obj,fptr);
+}
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 9 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g, H h, I i
+ ) const
+ { return (obj->*fptr)(a, b, c, d, e, f, g, h, i); }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 10 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j
+ ) const
+ {
+ return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j);
+ }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 11 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k
+ ) const
+ {
+ return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k);
+ }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
+}
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 12 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, L, nil_t, nil_t, nil_t, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_, typename L_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l
+ ) const
+ {
+ return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l);
+ }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 13 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_, typename L_, typename M_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m
+ ) const
+ {
+ return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m);
+ }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 14 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_, typename L_, typename M_, typename N_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n
+ ) const
+ {
+ return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+ }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Bound member function binder (specialization for 15 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N,
+ typename O
+>
+struct bound_member_action<RT, ClassT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
+
+ typedef RT result_type;
+ typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
+ typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const;
+ typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
+ mem_func_ptr_t;
+
+ template <
+ typename A_, typename B_, typename C_, typename D_,
+ typename E_, typename F_, typename G_, typename H_, typename I_,
+ typename J_, typename K_, typename L_, typename M_, typename N_,
+ typename O_
+ >
+ struct result { typedef result_type type; };
+
+ template <typename CT>
+ bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+ : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+ result_type operator()(
+ A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n, O o
+ ) const
+ {
+ return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+ }
+
+ typename impl::as_ptr<ClassT>::pointer_type obj;
+ mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N,
+ typename O
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N,
+ typename O
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
+{
+ return bound_member<
+ RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N,
+ typename O
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+ typename A, typename B, typename C, typename D,
+ typename E, typename F, typename G, typename H, typename I,
+ typename J, typename K, typename L, typename M, typename N,
+ typename O
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
+{
+ return bound_member<
+ RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
+}
+
+#endif
+#endif
+#endif
+#endif
+
+} // namespace phoenix
+
+#endif
diff --git a/boost/spirit/home/classic/phoenix/casts.hpp b/boost/spirit/home/classic/phoenix/casts.hpp
new file mode 100644
index 0000000000..84922a7608
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/casts.hpp
@@ -0,0 +1,1470 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Hartmut Kaiser
+
+ Distributed under the 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 PHOENIX_CASTS_HPP
+#define PHOENIX_CASTS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+#include <boost/spirit/home/classic/phoenix/composite.hpp>
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Phoenix predefined maximum construct_ limit. This limit defines the maximum
+// number of parameters supported for calles to the set of construct_ template
+// functions (lazy object construction, see below). This number defaults to 3.
+// The actual maximum is rounded up in multiples of 3. Thus, if this value
+// is 4, the actual limit is 6. The ultimate maximum limit in this
+// implementation is 15.
+// PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT!
+
+#if !defined(PHOENIX_CONSTRUCT_LIMIT)
+#define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT
+#endif
+
+// ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT
+BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);
+
+// ensure PHOENIX_CONSTRUCT_LIMIT <= 15
+BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Lazy C++ casts
+//
+// The set of lazy C++ cast template classes and functions provide a way
+// of lazily casting certain type to another during parsing.
+// The lazy C++ templates are (syntactically) used very much like
+// the well known C++ casts:
+//
+// A *a = static_cast_<A *>(...actor returning a convertible type...);
+//
+// where the given parameter should be an actor, which eval() function
+// returns a convertible type.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename A>
+struct static_cast_l {
+
+ template <typename TupleT>
+ struct result { typedef T type; };
+
+ static_cast_l(A const& a_)
+ : a(a_) {}
+
+ template <typename TupleT>
+ T
+ eval(TupleT const& args) const
+ {
+ return static_cast<T>(a.eval(args));
+ }
+
+ A a;
+};
+
+//////////////////////////////////
+template <typename T, typename BaseAT>
+inline actor<static_cast_l<T, BaseAT> >
+static_cast_(actor<BaseAT> const& a)
+{
+ typedef static_cast_l<T, BaseAT> cast_t;
+ return actor<cast_t>(cast_t(a));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+struct dynamic_cast_l {
+
+ template <typename TupleT>
+ struct result { typedef T type; };
+
+ dynamic_cast_l(A const& a_)
+ : a(a_) {}
+
+ template <typename TupleT>
+ T
+ eval(TupleT const& args) const
+ {
+ return dynamic_cast<T>(a.eval(args));
+ }
+
+ A a;
+};
+
+//////////////////////////////////
+template <typename T, typename BaseAT>
+inline actor<dynamic_cast_l<T, BaseAT> >
+dynamic_cast_(actor<BaseAT> const& a)
+{
+ typedef dynamic_cast_l<T, BaseAT> cast_t;
+ return actor<cast_t>(cast_t(a));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+struct reinterpret_cast_l {
+
+ template <typename TupleT>
+ struct result { typedef T type; };
+
+ reinterpret_cast_l(A const& a_)
+ : a(a_) {}
+
+ template <typename TupleT>
+ T
+ eval(TupleT const& args) const
+ {
+ return reinterpret_cast<T>(a.eval(args));
+ }
+
+ A a;
+};
+
+//////////////////////////////////
+template <typename T, typename BaseAT>
+inline actor<reinterpret_cast_l<T, BaseAT> >
+reinterpret_cast_(actor<BaseAT> const& a)
+{
+ typedef reinterpret_cast_l<T, BaseAT> cast_t;
+ return actor<cast_t>(cast_t(a));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+struct const_cast_l {
+
+ template <typename TupleT>
+ struct result { typedef T type; };
+
+ const_cast_l(A const& a_)
+ : a(a_) {}
+
+ template <typename TupleT>
+ T
+ eval(TupleT const& args) const
+ {
+ return const_cast<T>(a.eval(args));
+ }
+
+ A a;
+};
+
+//////////////////////////////////
+template <typename T, typename BaseAT>
+inline actor<const_cast_l<T, BaseAT> >
+const_cast_(actor<BaseAT> const& a)
+{
+ typedef const_cast_l<T, BaseAT> cast_t;
+ return actor<cast_t>(cast_t(a));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// construct_
+//
+// Lazy object construction
+//
+// The set of construct_<> template classes and functions provide a way
+// of lazily constructing certain object from a arbitrary set of
+// actors during parsing.
+// The construct_ templates are (syntactically) used very much like
+// the well known C++ casts:
+//
+// A a = construct_<A>(...arbitrary list of actors...);
+//
+// where the given parameters are submitted as parameters to the
+// contructor of the object of type A. (This certainly implies, that
+// type A has a constructor with a fitting set of parameter types
+// defined.)
+//
+// The maximum number of needed parameters is controlled through the
+// preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this
+// limit should not be greater than PHOENIX_LIMIT.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct construct_l_0 {
+ typedef T result_type;
+
+ T operator()() const {
+ return T();
+ }
+};
+
+
+template <typename T>
+struct construct_l {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+ , typename D
+ , typename E
+ , typename F
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+ , typename G
+ , typename H
+ , typename I
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+ , typename J
+ , typename K
+ , typename L
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+ , typename M
+ , typename N
+ , typename O
+#endif
+#endif
+#endif
+#endif
+ >
+ struct result { typedef T type; };
+
+ T operator()() const
+ {
+ return T();
+ }
+
+ template <typename A>
+ T operator()(A const& a) const
+ {
+ T t(a);
+ return t;
+ }
+
+ template <typename A, typename B>
+ T operator()(A const& a, B const& b) const
+ {
+ T t(a, b);
+ return t;
+ }
+
+ template <typename A, typename B, typename C>
+ T operator()(A const& a, B const& b, C const& c) const
+ {
+ T t(a, b, c);
+ return t;
+ }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+ template <
+ typename A, typename B, typename C, typename D
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d) const
+ {
+ T t(a, b, c, d);
+ return t;
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e) const
+ {
+ T t(a, b, c, d, e);
+ return t;
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f) const
+ {
+ T t(a, b, c, d, e, f);
+ return t;
+ }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g) const
+ {
+ T t(a, b, c, d, e, f, g);
+ return t;
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h) const
+ {
+ T t(a, b, c, d, e, f, g, h);
+ return t;
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i) const
+ {
+ T t(a, b, c, d, e, f, g, h, i);
+ return t;
+ }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j);
+ return t;
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j, k);
+ return t;
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j, k, l);
+ return t;
+ }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
+ return t;
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+ return t;
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n, O const& o) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+ return t;
+ }
+
+#endif
+#endif
+#endif
+#endif
+};
+
+
+template <typename T>
+struct construct_1 {
+
+ template <
+ typename A
+ >
+ struct result { typedef T type; };
+
+ template <typename A>
+ T operator()(A const& a) const
+ {
+ T t(a);
+ return t;
+ }
+
+};
+
+template <typename T>
+struct construct_2 {
+
+ template <
+ typename A
+ , typename B
+ >
+ struct result { typedef T type; };
+
+ template <typename A, typename B>
+ T operator()(A const& a, B const& b) const
+ {
+ T t(a, b);
+ return t;
+ }
+
+};
+
+template <typename T>
+struct construct_3 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ >
+ struct result { typedef T type; };
+
+ template <typename A, typename B, typename C>
+ T operator()(A const& a, B const& b, C const& c) const
+ {
+ T t(a, b, c);
+ return t;
+ }
+};
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+template <typename T>
+struct construct_4 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d) const
+ {
+ T t(a, b, c, d);
+ return t;
+ }
+};
+
+
+template <typename T>
+struct construct_5 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e) const
+ {
+ T t(a, b, c, d, e);
+ return t;
+ }
+};
+
+
+template <typename T>
+struct construct_6 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f) const
+ {
+ T t(a, b, c, d, e, f);
+ return t;
+ }
+};
+#endif
+
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+template <typename T>
+struct construct_7 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g) const
+ {
+ T t(a, b, c, d, e, f, g);
+ return t;
+ }
+};
+
+template <typename T>
+struct construct_8 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h) const
+ {
+ T t(a, b, c, d, e, f, g, h);
+ return t;
+ }
+};
+
+template <typename T>
+struct construct_9 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i) const
+ {
+ T t(a, b, c, d, e, f, g, h, i);
+ return t;
+ }
+};
+#endif
+
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+template <typename T>
+struct construct_10 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j);
+ return t;
+ }
+};
+
+template <typename T>
+struct construct_11 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j, k);
+ return t;
+ }
+};
+
+template <typename T>
+struct construct_12 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ , typename L
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l) const
+ {
+ T t(a, b, c, d, f, e, g, h, i, j, k, l);
+ return t;
+ }
+};
+#endif
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+template <typename T>
+struct construct_13 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ , typename L
+ , typename M
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
+ return t;
+ }
+};
+
+template <typename T>
+struct construct_14 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ , typename L
+ , typename M
+ , typename N
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n) const
+ {
+ T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+ return t;
+ }
+};
+
+template <typename T>
+struct construct_15 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ , typename L
+ , typename M
+ , typename N
+ , typename O
+ >
+ struct result { typedef T type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+ >
+ T operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n, O const& o) const
+ {
+ T t(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o);
+ return t;
+ }
+};
+#endif
+
+
+#if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The following specializations are needed because Borland and CodeWarrior
+// does not accept default template arguments in nested template classes in
+// classes (i.e construct_l::result)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename TupleT>
+struct composite0_result<construct_l_0<T>, TupleT> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A>
+struct composite1_result<construct_l<T>, TupleT, A> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B>
+struct composite2_result<construct_l<T>, TupleT, A, B> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C>
+struct composite3_result<construct_l<T>, TupleT, A, B, C> {
+
+ typedef T type;
+};
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D>
+struct composite4_result<construct_l<T>, TupleT,
+ A, B, C, D> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E>
+struct composite5_result<construct_l<T>, TupleT,
+ A, B, C, D, E> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F>
+struct composite6_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F> {
+
+ typedef T type;
+};
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G>
+struct composite7_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H>
+struct composite8_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G, H> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I>
+struct composite9_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I> {
+
+ typedef T type;
+};
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J>
+struct composite10_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K>
+struct composite11_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L>
+struct composite12_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L> {
+
+ typedef T type;
+};
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M>
+struct composite13_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N>
+struct composite14_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
+
+ typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O>
+struct composite15_result<construct_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
+
+ typedef T type;
+};
+
+#endif
+#endif
+#endif
+#endif
+#endif
+
+//////////////////////////////////
+template <typename T>
+inline typename impl::make_composite<construct_l_0<T> >::type
+construct_()
+{
+ typedef impl::make_composite<construct_l_0<T> > make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_l_0<T>()));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+inline typename impl::make_composite<construct_1<T>, A>::type
+construct_(A const& a)
+{
+ typedef impl::make_composite<construct_1<T>, A> make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_1<T>(),
+ as_actor<A>::convert(a)
+ ));
+}
+
+//////////////////////////////////
+template <typename T, typename A, typename B>
+inline typename impl::make_composite<construct_2<T>, A, B>::type
+construct_(A const& a, B const& b)
+{
+ typedef impl::make_composite<construct_2<T>, A, B> make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_2<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b)
+ ));
+}
+
+//////////////////////////////////
+template <typename T, typename A, typename B, typename C>
+inline typename impl::make_composite<construct_3<T>, A, B, C>::type
+construct_(A const& a, B const& b, C const& c)
+{
+ typedef impl::make_composite<construct_3<T>, A, B, C> make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_3<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c)
+ ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D
+>
+inline typename impl::make_composite<construct_4<T>, A, B, C, D>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d)
+{
+ typedef
+ impl::make_composite<construct_4<T>, A, B, C, D>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_4<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E
+>
+inline typename impl::make_composite<construct_5<T>, A, B, C, D, E>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e)
+{
+ typedef
+ impl::make_composite<construct_5<T>, A, B, C, D, E>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_5<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F
+>
+inline typename impl::make_composite<construct_6<T>, A, B, C, D, E, F>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f)
+{
+ typedef
+ impl::make_composite<construct_6<T>, A, B, C, D, E, F>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_6<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f)
+ ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+>
+inline typename impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g)
+{
+ typedef
+ impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_7<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+>
+inline typename impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h)
+{
+ typedef
+ impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_8<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+>
+inline typename impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i)
+{
+ typedef
+ impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_9<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i)
+ ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+>
+inline typename impl::make_composite<
+ construct_10<T>, A, B, C, D, E, F, G, H, I, J>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j)
+{
+ typedef
+ impl::make_composite<
+ construct_10<T>, A, B, C, D, E, F, G, H, I, J
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_10<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K
+>
+inline typename impl::make_composite<
+ construct_11<T>, A, B, C, D, E, F, G, H, I, J, K>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k)
+{
+ typedef
+ impl::make_composite<
+ construct_11<T>, A, B, C, D, E, F, G, H, I, J, K
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_11<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K,
+ typename L
+>
+inline typename impl::make_composite<
+ construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l)
+{
+ typedef
+ impl::make_composite<
+ construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_12<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l)
+ ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K,
+ typename L, typename M
+>
+inline typename impl::make_composite<
+ construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m)
+{
+ typedef
+ impl::make_composite<
+ construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_13<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K,
+ typename L, typename M, typename N
+>
+inline typename impl::make_composite<
+ construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n)
+{
+ typedef
+ impl::make_composite<
+ construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_14<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m),
+ as_actor<N>::convert(n)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K,
+ typename L, typename M, typename N, typename O
+>
+inline typename impl::make_composite<
+ construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, O>::type
+construct_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n, O const& o)
+{
+ typedef
+ impl::make_composite<
+ construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(construct_15<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m),
+ as_actor<N>::convert(n),
+ as_actor<O>::convert(o)
+ ));
+}
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace phoenix
+
+#endif // PHOENIX_CASTS_HPP
diff --git a/boost/spirit/home/classic/phoenix/closures.hpp b/boost/spirit/home/classic/phoenix/closures.hpp
new file mode 100644
index 0000000000..6493e387a3
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/closures.hpp
@@ -0,0 +1,446 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+ MT code Copyright (c) 2002-2003 Martin Wille
+
+ Distributed under the 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 CLASSIC_PHOENIX_CLOSURES_HPP
+#define CLASSIC_PHOENIX_CLOSURES_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+#include <boost/assert.hpp>
+
+#ifdef PHOENIX_THREADSAFE
+#include <boost/thread/tss.hpp>
+#include <boost/thread/once.hpp>
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Adaptable closures
+//
+// The framework will not be complete without some form of closures
+// support. Closures encapsulate a stack frame where local
+// variables are created upon entering a function and destructed
+// upon exiting. Closures provide an environment for local
+// variables to reside. Closures can hold heterogeneous types.
+//
+// Phoenix closures are true hardware stack based closures. At the
+// very least, closures enable true reentrancy in lambda functions.
+// A closure provides access to a function stack frame where local
+// variables reside. Modeled after Pascal nested stack frames,
+// closures can be nested just like nested functions where code in
+// inner closures may access local variables from in-scope outer
+// closures (accessing inner scopes from outer scopes is an error
+// and will cause a run-time assertion failure).
+//
+// There are three (3) interacting classes:
+//
+// 1) closure:
+//
+// At the point of declaration, a closure does not yet create a
+// stack frame nor instantiate any variables. A closure declaration
+// declares the types and names[note] of the local variables. The
+// closure class is meant to be subclassed. It is the
+// responsibility of a closure subclass to supply the names for
+// each of the local variable in the closure. Example:
+//
+// struct my_closure : closure<int, string, double> {
+//
+// member1 num; // names the 1st (int) local variable
+// member2 message; // names the 2nd (string) local variable
+// member3 real; // names the 3rd (double) local variable
+// };
+//
+// my_closure clos;
+//
+// Now that we have a closure 'clos', its local variables can be
+// accessed lazily using the dot notation. Each qualified local
+// variable can be used just like any primitive actor (see
+// primitives.hpp). Examples:
+//
+// clos.num = 30
+// clos.message = arg1
+// clos.real = clos.num * 1e6
+//
+// The examples above are lazily evaluated. As usual, these
+// expressions return composite actors that will be evaluated
+// through a second function call invocation (see operators.hpp).
+// Each of the members (clos.xxx) is an actor. As such, applying
+// the operator() will reveal its identity:
+//
+// clos.num() // will return the current value of clos.num
+//
+// *** [note] Acknowledgement: Juan Carlos Arevalo-Baeza (JCAB)
+// introduced and initilally implemented the closure member names
+// that uses the dot notation.
+//
+// 2) closure_member
+//
+// The named local variables of closure 'clos' above are actually
+// closure members. The closure_member class is an actor and
+// conforms to its conceptual interface. member1..memberN are
+// predefined typedefs that correspond to each of the listed types
+// in the closure template parameters.
+//
+// 3) closure_frame
+//
+// When a closure member is finally evaluated, it should refer to
+// an actual instance of the variable in the hardware stack.
+// Without doing so, the process is not complete and the evaluated
+// member will result to an assertion failure. Remember that the
+// closure is just a declaration. The local variables that a
+// closure refers to must still be instantiated.
+//
+// The closure_frame class does the actual instantiation of the
+// local variables and links these variables with the closure and
+// all its members. There can be multiple instances of
+// closure_frames typically situated in the stack inside a
+// function. Each closure_frame instance initiates a stack frame
+// with a new set of closure local variables. Example:
+//
+// void foo()
+// {
+// closure_frame<my_closure> frame(clos);
+// /* do something */
+// }
+//
+// where 'clos' is an instance of our closure 'my_closure' above.
+// Take note that the usage above precludes locally declared
+// classes. If my_closure is a locally declared type, we can still
+// use its self_type as a paramater to closure_frame:
+//
+// closure_frame<my_closure::self_type> frame(clos);
+//
+// Upon instantiation, the closure_frame links the local variables
+// to the closure. The previous link to another closure_frame
+// instance created before is saved. Upon destruction, the
+// closure_frame unlinks itself from the closure and relinks the
+// preceding closure_frame prior to this instance.
+//
+// The local variables in the closure 'clos' above is default
+// constructed in the stack inside function 'foo'. Once 'foo' is
+// exited, all of these local variables are destructed. In some
+// cases, default construction is not desirable and we need to
+// initialize the local closure variables with some values. This
+// can be done by passing in the initializers in a compatible
+// tuple. A compatible tuple is one with the same number of
+// elements as the destination and where each element from the
+// destination can be constructed from each corresponding element
+// in the source. Example:
+//
+// tuple<int, char const*, int> init(123, "Hello", 1000);
+// closure_frame<my_closure> frame(clos, init);
+//
+// Here now, our closure_frame's variables are initialized with
+// int: 123, char const*: "Hello" and int: 1000.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+namespace impl
+{
+ ///////////////////////////////////////////////////////////////////////
+ // closure_frame_holder is a simple class that encapsulates the
+ // storage for a frame pointer. It uses thread specific data in
+ // case when multithreading is enabled, an ordinary pointer otherwise
+ //
+ // it has get() and set() member functions. set() has to be used
+ // _after_ get(). get() contains intialisation code in the multi
+ // threading case
+ //
+ // closure_frame_holder is used by the closure<> class to store
+ // the pointer to the current frame.
+ //
+#ifndef PHOENIX_THREADSAFE
+ template <typename FrameT>
+ struct closure_frame_holder
+ {
+ typedef FrameT frame_t;
+ typedef frame_t *frame_ptr;
+
+ closure_frame_holder() : frame(0) {}
+
+ frame_ptr &get() { return frame; }
+ void set(frame_t *f) { frame = f; }
+
+ private:
+ frame_ptr frame;
+
+ // no copies, no assignments
+ closure_frame_holder(closure_frame_holder const &);
+ closure_frame_holder &operator=(closure_frame_holder const &);
+ };
+#else
+ template <typename FrameT>
+ struct closure_frame_holder
+ {
+ typedef FrameT frame_t;
+ typedef frame_t *frame_ptr;
+
+ closure_frame_holder() : tsp_frame() {}
+
+ frame_ptr &get()
+ {
+ if (!tsp_frame.get())
+ tsp_frame.reset(new frame_ptr(0));
+ return *tsp_frame;
+ }
+ void set(frame_ptr f)
+ {
+ *tsp_frame = f;
+ }
+
+ private:
+ boost::thread_specific_ptr<frame_ptr> tsp_frame;
+
+ // no copies, no assignments
+ closure_frame_holder(closure_frame_holder const &);
+ closure_frame_holder &operator=(closure_frame_holder const &);
+ };
+#endif
+} // namespace phoenix::impl
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// closure_frame class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ClosureT>
+class closure_frame : public ClosureT::tuple_t {
+
+public:
+
+ closure_frame(ClosureT const& clos)
+ : ClosureT::tuple_t(), save(clos.frame.get()), frame(clos.frame)
+ { clos.frame.set(this); }
+
+ template <typename TupleT>
+ closure_frame(ClosureT const& clos, TupleT const& init)
+ : ClosureT::tuple_t(init), save(clos.frame.get()), frame(clos.frame)
+ { clos.frame.set(this); }
+
+ ~closure_frame()
+ { frame.set(save); }
+
+private:
+
+ closure_frame(closure_frame const&); // no copy
+ closure_frame& operator=(closure_frame const&); // no assign
+
+ closure_frame* save;
+ impl::closure_frame_holder<closure_frame>& frame;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// closure_member class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <int N, typename ClosureT>
+class closure_member {
+
+public:
+
+ typedef typename ClosureT::tuple_t tuple_t;
+
+ closure_member()
+ : frame(ClosureT::closure_frame_holder_ref()) {}
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename tuple_element<
+ N, typename ClosureT::tuple_t
+ >::rtype type;
+ };
+
+ template <typename TupleT>
+ typename tuple_element<N, typename ClosureT::tuple_t>::rtype
+ eval(TupleT const& /*args*/) const
+ {
+ using namespace std;
+ BOOST_ASSERT(frame.get() != 0);
+ return (*frame.get())[tuple_index<N>()];
+ }
+
+private:
+ impl::closure_frame_holder<typename ClosureT::closure_frame_t> &frame;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// closure class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename T0 = nil_t
+ , typename T1 = nil_t
+ , typename T2 = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename T3 = nil_t
+ , typename T4 = nil_t
+ , typename T5 = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename T6 = nil_t
+ , typename T7 = nil_t
+ , typename T8 = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename T9 = nil_t
+ , typename T10 = nil_t
+ , typename T11 = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename T12 = nil_t
+ , typename T13 = nil_t
+ , typename T14 = nil_t
+
+#endif
+#endif
+#endif
+#endif
+>
+class closure {
+
+public:
+
+ typedef tuple<
+ T0, T1, T2
+#if PHOENIX_LIMIT > 3
+ , T3, T4, T5
+#if PHOENIX_LIMIT > 6
+ , T6, T7, T8
+#if PHOENIX_LIMIT > 9
+ , T9, T10, T11
+#if PHOENIX_LIMIT > 12
+ , T12, T13, T14
+#endif
+#endif
+#endif
+#endif
+ > tuple_t;
+
+ typedef closure<
+ T0, T1, T2
+#if PHOENIX_LIMIT > 3
+ , T3, T4, T5
+#if PHOENIX_LIMIT > 6
+ , T6, T7, T8
+#if PHOENIX_LIMIT > 9
+ , T9, T10, T11
+#if PHOENIX_LIMIT > 12
+ , T12, T13, T14
+#endif
+#endif
+#endif
+#endif
+ > self_t;
+
+ typedef closure_frame<self_t> closure_frame_t;
+
+ closure()
+ : frame() { closure_frame_holder_ref(&frame); }
+
+ typedef actor<closure_member<0, self_t> > member1;
+ typedef actor<closure_member<1, self_t> > member2;
+ typedef actor<closure_member<2, self_t> > member3;
+
+#if PHOENIX_LIMIT > 3
+ typedef actor<closure_member<3, self_t> > member4;
+ typedef actor<closure_member<4, self_t> > member5;
+ typedef actor<closure_member<5, self_t> > member6;
+
+#if PHOENIX_LIMIT > 6
+ typedef actor<closure_member<6, self_t> > member7;
+ typedef actor<closure_member<7, self_t> > member8;
+ typedef actor<closure_member<8, self_t> > member9;
+
+#if PHOENIX_LIMIT > 9
+ typedef actor<closure_member<9, self_t> > member10;
+ typedef actor<closure_member<10, self_t> > member11;
+ typedef actor<closure_member<11, self_t> > member12;
+
+#if PHOENIX_LIMIT > 12
+ typedef actor<closure_member<12, self_t> > member13;
+ typedef actor<closure_member<13, self_t> > member14;
+ typedef actor<closure_member<14, self_t> > member15;
+
+#endif
+#endif
+#endif
+#endif
+
+#if !defined(__MWERKS__) || (__MWERKS__ > 0x3002)
+private:
+#endif
+
+ closure(closure const&); // no copy
+ closure& operator=(closure const&); // no assign
+
+#if !defined(__MWERKS__) || (__MWERKS__ > 0x3002)
+ template <int N, typename ClosureT>
+ friend class closure_member;
+
+ template <typename ClosureT>
+ friend class closure_frame;
+#endif
+
+ typedef impl::closure_frame_holder<closure_frame_t> holder_t;
+
+#ifdef PHOENIX_THREADSAFE
+ static boost::thread_specific_ptr<holder_t*> &
+ tsp_frame_instance()
+ {
+ static boost::thread_specific_ptr<holder_t*> the_instance;
+ return the_instance;
+ }
+
+ static void
+ tsp_frame_instance_init()
+ {
+ tsp_frame_instance();
+ }
+#endif
+
+ static holder_t &
+ closure_frame_holder_ref(holder_t* holder_ = 0)
+ {
+#ifdef PHOENIX_THREADSAFE
+ static boost::once_flag been_here = BOOST_ONCE_INIT;
+ boost::call_once(been_here, tsp_frame_instance_init);
+ boost::thread_specific_ptr<holder_t*> &tsp_frame = tsp_frame_instance();
+ if (!tsp_frame.get())
+ tsp_frame.reset(new holder_t *(0));
+ holder_t *& holder = *tsp_frame;
+#else
+ static holder_t* holder = 0;
+#endif
+ if (holder_ != 0)
+ holder = holder_;
+ return *holder;
+ }
+
+ mutable holder_t frame;
+};
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+}
+ // namespace phoenix
+
+#endif
diff --git a/boost/spirit/home/classic/phoenix/composite.hpp b/boost/spirit/home/classic/phoenix/composite.hpp
new file mode 100644
index 0000000000..3fed61de30
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/composite.hpp
@@ -0,0 +1,1431 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_COMPOSITE_HPP
+#define PHOENIX_COMPOSITE_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite class
+//
+// A composite is an actor base class composed of zero or more
+// actors (see actor.hpp) and an operation. A composite is itself
+// an actor superclass and conforms to its conceptual interface.
+// Its eval member function un-funnels the tupled actual arguments
+// from the tuple by invoking each of the actors' eval member
+// function. The results of each are then passed on as arguments to
+// the operation. Specializations are provided to handle different
+// numbers of actors.
+//
+// Schematically:
+//
+// actor0.eval(tupled_args) --> arg0 --> |
+// actor1.eval(tupled_args) --> arg1 --> |
+// actor2.eval(tupled_args) --> arg3 --> | --> operation(arg0...argN)
+// ... |
+// actorN.eval(tupled_args) --> argN --> |
+//
+// The operation can be any suitable functor that can accept the
+// arguments passed in by the composite. The operation is expected
+// to have a member operator() that carries out the actual
+// operation. There should be a one to one correspondence between
+// actors of the composite and the arguments of the operation's
+// member operator().
+//
+// The operation is also expected to have a nested template class
+// result<T0...TN>. The nested template class result should have a
+// typedef 'type' that reflects the return type of its member
+// operator(). This is essentially a type computer that answers the
+// metaprogramming question "Given arguments of type T0...TN, what
+// will be its operator()'s return type?".
+//
+// There is a special case for operations that accept no arguments.
+// Such nullary operations are only required to define a typedef
+// result_type that reflects the return type of its operator().
+//
+// Here's an example of a simple operation that squares a number:
+//
+// struct square {
+//
+// template <typename ArgT>
+// struct result { typedef ArgT type; };
+//
+// template <typename ArgT>
+// ArgT operator()(ArgT n) const { return n * n; }
+// };
+//
+// As can be seen, operations can be polymorphic. Its arguments and
+// return type are not fixed to a particular type. The example
+// above for example, can handle any ArgT type as long as it has a
+// multiplication operator.
+//
+// Composites are not created directly. Instead, there are meta-
+// programs provided that indirectly create composites. See
+// operators.hpp, binders.hpp and functions.hpp for examples.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename OperationT
+ , typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+ , typename NU = nil_t // Not used
+>
+struct composite;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <0 actor> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT>
+struct composite0_result {
+
+ typedef typename OperationT::result_type type;
+};
+
+//////////////////////////////////
+template <typename OperationT>
+struct composite<OperationT,
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite0_result<
+ OperationT, TupleT
+ >::type type;
+ };
+
+ composite(OperationT const& op_)
+ : op(op_) {}
+
+ template <typename TupleT>
+ typename OperationT::result_type
+ eval(TupleT const& /*args*/) const
+ {
+ return op();
+ }
+
+ mutable OperationT op; // operation
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <1 actor> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A>
+struct composite1_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A>
+struct composite<OperationT,
+ A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite1_result<
+ OperationT, TupleT, A
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_)
+ : op(op_), a(a_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ return op(ra);
+ }
+
+ mutable OperationT op; // operation
+ A a; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <2 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B>
+struct composite2_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B>
+struct composite<OperationT,
+ A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite2_result<
+ OperationT, TupleT, A, B
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_)
+ : op(op_), a(a_), b(b_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ return op(ra, rb);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <3 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C>
+struct composite3_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C>
+struct composite<OperationT,
+ A, B, C,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B, C> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite3_result<
+ OperationT, TupleT, A, B, C
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_)
+ : op(op_), a(a_), b(b_), c(c_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ return op(ra, rb, rc);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; // actors
+};
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <4 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D>
+struct composite4_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D>
+struct composite<OperationT,
+ A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B, C, D> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite4_result<
+ OperationT, TupleT, A, B, C, D
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ return op(ra, rb, rc, rd);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <5 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E>
+struct composite5_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E>
+struct composite<OperationT,
+ A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B, C, D, E> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite5_result<
+ OperationT, TupleT, A, B, C, D, E
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ return op(ra, rb, rc, rd, re);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <6 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F>
+struct composite6_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F>
+struct composite<OperationT,
+ A, B, C, D, E, F,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B, C, D, E, F> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite6_result<
+ OperationT, TupleT, A, B, C, D, E, F
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ return op(ra, rb, rc, rd, re, rf);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; // actors
+};
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <7 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G>
+struct composite7_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B, C, D, E, F, G> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite7_result<
+ OperationT, TupleT, A, B, C, D, E, F, G
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <8 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H>
+struct composite8_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type,
+ typename actor_result<H, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B, C, D, E, F, G, H> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite8_result<
+ OperationT, TupleT, A, B, C, D, E, F, G, H
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_, H const& h_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ typename actor_result<H, TupleT>::type rh = h.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg, rh);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; H h; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <9 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I>
+struct composite9_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type,
+ typename actor_result<H, TupleT>::plain_type,
+ typename actor_result<I, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, H, I,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B, C, D, E, F, G, H, I> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite9_result<
+ OperationT, TupleT, A, B, C, D, E, F, G, H, I
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_, H const& h_, I const& i_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ typename actor_result<H, TupleT>::type rh = h.eval(args);
+ typename actor_result<I, TupleT>::type ri = i.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg, rh, ri);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; H h; I i; // actors
+};
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <10 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J>
+struct composite10_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type,
+ typename actor_result<H, TupleT>::plain_type,
+ typename actor_result<I, TupleT>::plain_type,
+ typename actor_result<J, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT, A, B, C, D, E, F, G, H, I, J> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite10_result<
+ OperationT, TupleT, A, B, C, D, E, F, G, H, I, J
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_, H const& h_, I const& i_, J const& j_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ typename actor_result<H, TupleT>::type rh = h.eval(args);
+ typename actor_result<I, TupleT>::type ri = i.eval(args);
+ typename actor_result<J, TupleT>::type rj = j.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <11 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K>
+struct composite11_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type,
+ typename actor_result<H, TupleT>::plain_type,
+ typename actor_result<I, TupleT>::plain_type,
+ typename actor_result<J, TupleT>::plain_type,
+ typename actor_result<K, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite11_result<
+ OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+ K const& k_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ typename actor_result<H, TupleT>::type rh = h.eval(args);
+ typename actor_result<I, TupleT>::type ri = i.eval(args);
+ typename actor_result<J, TupleT>::type rj = j.eval(args);
+ typename actor_result<K, TupleT>::type rk = k.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+ K k;// actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <12 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L>
+struct composite12_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type,
+ typename actor_result<H, TupleT>::plain_type,
+ typename actor_result<I, TupleT>::plain_type,
+ typename actor_result<J, TupleT>::plain_type,
+ typename actor_result<K, TupleT>::plain_type,
+ typename actor_result<L, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, L,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+> {
+
+ typedef composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, L> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite12_result<
+ OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+ K const& k_, L const& l_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_), l(l_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ typename actor_result<H, TupleT>::type rh = h.eval(args);
+ typename actor_result<I, TupleT>::type ri = i.eval(args);
+ typename actor_result<J, TupleT>::type rj = j.eval(args);
+ typename actor_result<K, TupleT>::type rk = k.eval(args);
+ typename actor_result<L, TupleT>::type rl = l.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+ K k; L l;// actors
+};
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <13 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M>
+struct composite13_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type,
+ typename actor_result<H, TupleT>::plain_type,
+ typename actor_result<I, TupleT>::plain_type,
+ typename actor_result<J, TupleT>::plain_type,
+ typename actor_result<K, TupleT>::plain_type,
+ typename actor_result<L, TupleT>::plain_type,
+ typename actor_result<M, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t
+> {
+
+ typedef composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite13_result<
+ OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+ K const& k_, L const& l_, M const& m_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_), l(l_), m(m_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ typename actor_result<H, TupleT>::type rh = h.eval(args);
+ typename actor_result<I, TupleT>::type ri = i.eval(args);
+ typename actor_result<J, TupleT>::type rj = j.eval(args);
+ typename actor_result<K, TupleT>::type rk = k.eval(args);
+ typename actor_result<L, TupleT>::type rl = l.eval(args);
+ typename actor_result<M, TupleT>::type rm = m.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+ K k; L l; M m; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <14 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N>
+struct composite14_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type,
+ typename actor_result<H, TupleT>::plain_type,
+ typename actor_result<I, TupleT>::plain_type,
+ typename actor_result<J, TupleT>::plain_type,
+ typename actor_result<K, TupleT>::plain_type,
+ typename actor_result<L, TupleT>::plain_type,
+ typename actor_result<M, TupleT>::plain_type,
+ typename actor_result<N, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t
+> {
+
+ typedef composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite14_result<
+ OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+ K const& k_, L const& l_, M const& m_, N const& n_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_), l(l_), m(m_), n(n_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ typename actor_result<H, TupleT>::type rh = h.eval(args);
+ typename actor_result<I, TupleT>::type ri = i.eval(args);
+ typename actor_result<J, TupleT>::type rj = j.eval(args);
+ typename actor_result<K, TupleT>::type rk = k.eval(args);
+ typename actor_result<L, TupleT>::type rl = l.eval(args);
+ typename actor_result<M, TupleT>::type rm = m.eval(args);
+ typename actor_result<N, TupleT>::type rn = n.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+ K k; L l; M m; N n; // actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// composite <15 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O>
+struct composite15_result {
+
+ typedef typename OperationT::template result<
+ typename actor_result<A, TupleT>::plain_type,
+ typename actor_result<B, TupleT>::plain_type,
+ typename actor_result<C, TupleT>::plain_type,
+ typename actor_result<D, TupleT>::plain_type,
+ typename actor_result<E, TupleT>::plain_type,
+ typename actor_result<F, TupleT>::plain_type,
+ typename actor_result<G, TupleT>::plain_type,
+ typename actor_result<H, TupleT>::plain_type,
+ typename actor_result<I, TupleT>::plain_type,
+ typename actor_result<J, TupleT>::plain_type,
+ typename actor_result<K, TupleT>::plain_type,
+ typename actor_result<L, TupleT>::plain_type,
+ typename actor_result<M, TupleT>::plain_type,
+ typename actor_result<N, TupleT>::plain_type,
+ typename actor_result<O, TupleT>::plain_type
+ >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O>
+struct composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t
+> {
+
+ typedef composite<OperationT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename composite15_result<
+ OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+ >::type type;
+ };
+
+ composite(OperationT const& op_,
+ A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+ F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+ K const& k_, L const& l_, M const& m_, N const& n_, O const& o_)
+ : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_), l(l_), m(m_), n(n_), o(o_) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ typename actor_result<A, TupleT>::type ra = a.eval(args);
+ typename actor_result<B, TupleT>::type rb = b.eval(args);
+ typename actor_result<C, TupleT>::type rc = c.eval(args);
+ typename actor_result<D, TupleT>::type rd = d.eval(args);
+ typename actor_result<E, TupleT>::type re = e.eval(args);
+ typename actor_result<F, TupleT>::type rf = f.eval(args);
+ typename actor_result<G, TupleT>::type rg = g.eval(args);
+ typename actor_result<H, TupleT>::type rh = h.eval(args);
+ typename actor_result<I, TupleT>::type ri = i.eval(args);
+ typename actor_result<J, TupleT>::type rj = j.eval(args);
+ typename actor_result<K, TupleT>::type rk = k.eval(args);
+ typename actor_result<L, TupleT>::type rl = l.eval(args);
+ typename actor_result<M, TupleT>::type rm = m.eval(args);
+ typename actor_result<N, TupleT>::type rn = n.eval(args);
+ typename actor_result<O, TupleT>::type ro = o.eval(args);
+ return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn, ro);
+ }
+
+ mutable OperationT op; // operation
+ A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+ K k; L l; M m; N n; O o; // actors
+};
+
+#endif
+#endif
+#endif
+#endif
+
+namespace impl {
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // make_composite is basically a type computer that answers the
+ // question "Given types T0..TN, what composite type should I
+ // create <composite_type> and if I were to generate an actual
+ // composite, what type <type> should I return?"
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename OperationT
+ , typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+ >
+ struct make_composite {
+
+ typedef composite<OperationT
+ , typename as_actor<A>::type
+ , typename as_actor<B>::type
+ , typename as_actor<C>::type
+
+#if PHOENIX_LIMIT > 3
+ , typename as_actor<D>::type
+ , typename as_actor<E>::type
+ , typename as_actor<F>::type
+
+#if PHOENIX_LIMIT > 6
+ , typename as_actor<G>::type
+ , typename as_actor<H>::type
+ , typename as_actor<I>::type
+
+#if PHOENIX_LIMIT > 9
+ , typename as_actor<J>::type
+ , typename as_actor<K>::type
+ , typename as_actor<L>::type
+
+#if PHOENIX_LIMIT > 12
+ , typename as_actor<M>::type
+ , typename as_actor<N>::type
+ , typename as_actor<O>::type
+
+#endif
+#endif
+#endif
+#endif
+ > composite_type;
+
+ typedef actor<composite_type> type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // make_unary, make_binary, make_binary1, make_binary2 and
+ // make_binary3 utilities are provided here for easy creation of
+ // unary and binary composites.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ ////////////////////////////////// input is an actor
+ template <typename OperationT, typename BaseT>
+ struct make_unary {
+
+ typedef typename make_composite
+ <OperationT, actor<BaseT> >::type type;
+
+ static type
+ construct(actor<BaseT> const& _0)
+ {
+ typedef typename make_composite
+ <OperationT, actor<BaseT> >::composite_type
+ ret_t;
+
+ return ret_t(OperationT(), _0);
+ }
+ };
+
+ ////////////////////////////////// LHS is an actor, RHS is unknown
+ template <typename OperationT, typename BaseT, typename B>
+ struct make_binary1 {
+
+ typedef typename make_composite
+ <OperationT, actor<BaseT>, B>::type type;
+
+ static type
+ construct(actor<BaseT> const& _0, B const& _1)
+ {
+ typedef typename make_composite
+ <OperationT, actor<BaseT>, B>::composite_type
+ ret_t;
+
+ return ret_t(OperationT(), _0, as_actor<B>::convert(_1));
+ }
+ };
+
+ ////////////////////////////////// LHS is unknown, RHS is an actor
+ template <typename OperationT, typename A, typename BaseT>
+ struct make_binary2 {
+
+ typedef typename make_composite
+ <OperationT, A, actor<BaseT> >::type type;
+
+ static type
+ construct(A const& _0, actor<BaseT> const& _1)
+ {
+ typedef typename make_composite
+ <OperationT, A, actor<BaseT> >::composite_type
+ ret_t;
+
+ return ret_t(OperationT(), as_actor<A>::convert(_0), _1);
+ }
+ };
+
+ ////////////////////////////////// Both LHS and RHS are actors
+ template <typename OperationT, typename BaseA, typename BaseB>
+ struct make_binary3 {
+
+ typedef typename make_composite
+ <OperationT, actor<BaseA>, actor<BaseB> >::type type;
+
+ static type
+ construct(actor<BaseA> const& _0, actor<BaseB> const& _1)
+ {
+ typedef typename make_composite
+ <OperationT, actor<BaseA>, actor<BaseB> >::composite_type
+ ret_t;
+
+ return ret_t(OperationT(), _0, _1);
+ }
+ };
+
+} // namespace impl
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+} // namespace phoenix
+
+#endif
diff --git a/boost/spirit/home/classic/phoenix/functions.hpp b/boost/spirit/home/classic/phoenix/functions.hpp
new file mode 100644
index 0000000000..7e40ce958c
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/functions.hpp
@@ -0,0 +1,760 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_FUNCTIONS_HPP
+#define PHOENIX_FUNCTIONS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+#include <boost/spirit/home/classic/phoenix/composite.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// function class
+//
+// Lazy functions
+//
+// This class provides a mechanism for lazily evaluating functions.
+// Syntactically, a lazy function looks like an ordinary C/C++
+// function. The function call looks the same. However, unlike
+// ordinary functions, the actual function execution is deferred.
+// (see actor.hpp, primitives.hpp and composite.hpp for an
+// overview). For example here are sample factorial function calls:
+//
+// factorial(4)
+// factorial(arg1)
+// factorial(arg1 * 6)
+//
+// These functions are automatically lazily bound unlike ordinary
+// function pointers or functor objects that need to be explicitly
+// bound through the bind function (see binders.hpp).
+//
+// A lazy function works in conjunction with a user defined functor
+// (as usual with a member operator()). Only special forms of
+// functor objects are allowed. This is required to enable true
+// polymorphism (STL style monomorphic functors and function
+// pointers can still be used through the bind facility in
+// binders.hpp).
+//
+// This special functor is expected to have a nested template class
+// result<A...TN> (where N is the number of arguments of its
+// member operator()). The nested template class result should have
+// a typedef 'type' that reflects the return type of its member
+// operator(). This is essentially a type computer that answers the
+// metaprogramming question "Given arguments of type A...TN, what
+// will be the operator()'s return type?".
+//
+// There is a special case for functors that accept no arguments.
+// Such nullary functors are only required to define a typedef
+// result_type that reflects the return type of its operator().
+//
+// Here's an example of a simple functor that computes the
+// factorial of a number:
+//
+// struct factorial_impl {
+//
+// template <typename Arg>
+// struct result { typedef Arg type; };
+//
+// template <typename Arg>
+// Arg operator()(Arg n) const
+// { return (n <= 0) ? 1 : n * this->operator()(n-1); }
+// };
+//
+// As can be seen, the functor can be polymorphic. Its arguments
+// and return type are not fixed to a particular type. The example
+// above for example, can handle any type as long as it can carry
+// out the required operations (i.e. <=, * and -).
+//
+// We can now declare and instantiate a lazy 'factorial' function:
+//
+// function<factorial_impl> factorial;
+//
+// Invoking a lazy function 'factorial' does not immediately
+// execute the functor factorial_impl. Instead, a composite (see
+// composite.hpp) object is created and returned to the caller.
+// Example:
+//
+// factorial(arg1)
+//
+// does nothing more than return a composite. A second function
+// call will invoke the actual factorial function. Example:
+//
+// int i = 4;
+// cout << factorial(arg1)(i);
+//
+// will print out "24".
+//
+// Take note that in certain cases (e.g. for functors with state),
+// an instance may be passed on to the constructor. Example:
+//
+// function<factorial_impl> factorial(ftor);
+//
+// where ftor is an instance of factorial_impl (this is not
+// necessary in this case since factorial is a simple stateless
+// functor). Take care though when using functors with state
+// because the functors are taken in by value. It is best to keep
+// the data manipulated by a functor outside the functor itself and
+// keep a reference to this data inside the functor. Also, it is
+// best to keep functors as small as possible.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT>
+struct function {
+
+ function() : op() {}
+ function(OperationT const& op_) : op(op_) {}
+
+ actor<composite<OperationT> >
+ operator()() const;
+
+ template <typename A>
+ typename impl::make_composite<OperationT, A>::type
+ operator()(A const& a) const;
+
+ template <typename A, typename B>
+ typename impl::make_composite<OperationT, A, B>::type
+ operator()(A const& a, B const& b) const;
+
+ template <typename A, typename B, typename C>
+ typename impl::make_composite<OperationT, A, B, C>::type
+ operator()(A const& a, B const& b, C const& c) const;
+
+#if PHOENIX_LIMIT > 3
+
+ template <typename A, typename B, typename C, typename D>
+ typename impl::make_composite<OperationT, A, B, C, D>::type
+ operator()(A const& a, B const& b, C const& c, D const& d) const;
+
+ template <typename A, typename B, typename C, typename D, typename E>
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e
+ ) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f
+ ) const;
+
+#if PHOENIX_LIMIT > 6
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g
+ ) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h
+ ) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i
+ ) const;
+
+#if PHOENIX_LIMIT > 9
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j
+ ) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k
+ ) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l
+ ) const;
+
+#if PHOENIX_LIMIT > 12
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m
+ ) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n
+ ) const;
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+ >
+ typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+ >::type
+ operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n, O const& o
+ ) const;
+
+#endif
+#endif
+#endif
+#endif
+
+ OperationT op;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// function class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT>
+inline actor<composite<OperationT> >
+function<OperationT>::operator()() const
+{
+ return actor<composite<OperationT> >(op);
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <typename A>
+inline typename impl::make_composite<OperationT, A>::type
+function<OperationT>::operator()(A const& a) const
+{
+ typedef typename impl::make_composite<OperationT, A>::composite_type ret_t;
+ return ret_t
+ (
+ op,
+ as_actor<A>::convert(a)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <typename A, typename B>
+inline typename impl::make_composite<OperationT, A, B>::type
+function<OperationT>::operator()(A const& a, B const& b) const
+{
+ typedef
+ typename impl::make_composite<OperationT, A, B>::composite_type
+ ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <typename A, typename B, typename C>
+inline typename impl::make_composite<OperationT, A, B, C>::type
+function<OperationT>::operator()(A const& a, B const& b, C const& c) const
+{
+ typedef
+ typename impl::make_composite<OperationT, A, B, C>::composite_type
+ ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c)
+ );
+}
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f)
+ );
+}
+
+#if PHOENIX_LIMIT > 6
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i)
+ );
+}
+
+#if PHOENIX_LIMIT > 9
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l)
+ );
+}
+
+#if PHOENIX_LIMIT > 12
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m),
+ as_actor<N>::convert(n)
+ );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+>
+inline typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+>::type
+function<OperationT>::operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n, O const& o
+) const
+{
+ typedef typename impl::make_composite<
+ OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+ >::composite_type ret_t;
+
+ return ret_t(
+ op,
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m),
+ as_actor<N>::convert(n),
+ as_actor<O>::convert(o)
+ );
+}
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace phoenix
+
+#endif
diff --git a/boost/spirit/home/classic/phoenix/new.hpp b/boost/spirit/home/classic/phoenix/new.hpp
new file mode 100644
index 0000000000..f1a46366b0
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/new.hpp
@@ -0,0 +1,1315 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Hartmut Kaiser
+ Copyright (c) 2003 Vaclav Vesely
+
+ Distributed under the 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 PHOENIX_NEW_HPP
+#define PHOENIX_NEW_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+#include <boost/spirit/home/classic/phoenix/composite.hpp>
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Phoenix predefined maximum new_ limit. This limit defines the maximum
+// number of parameters supported for calles to the set of new_ template
+// functions (lazy object construction, see below). This number defaults to 3.
+// The actual maximum is rounded up in multiples of 3. Thus, if this value
+// is 4, the actual limit is 6. The ultimate maximum limit in this
+// implementation is 15.
+// PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT!
+
+#if !defined(PHOENIX_CONSTRUCT_LIMIT)
+#define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT
+#endif
+
+// ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT
+BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);
+
+// ensure PHOENIX_CONSTRUCT_LIMIT <= 15
+BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// new_
+//
+// Lazy object construction
+//
+// The set of new_<> template classes and functions provide a way
+// of lazily constructing certain object from a arbitrary set of
+// actors during parsing.
+// The new_ templates are (syntactically) used very much like
+// the well known C++ casts:
+//
+// A *a = new_<A>(...arbitrary list of actors...);
+//
+// where the given parameters are submitted as parameters to the
+// contructor of the object of type A. (This certainly implies, that
+// type A has a constructor with a fitting set of parameter types
+// defined.)
+//
+// The maximum number of needed parameters is controlled through the
+// preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this
+// limit should not be greater than PHOENIX_LIMIT.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename T>
+struct new_l_0
+{
+ typedef T* result_type;
+
+ T* operator()() const
+ {
+ return new T();
+ }
+};
+
+template <typename T>
+struct new_l {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+ , typename D
+ , typename E
+ , typename F
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+ , typename G
+ , typename H
+ , typename I
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+ , typename J
+ , typename K
+ , typename L
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+ , typename M
+ , typename N
+ , typename O
+#endif
+#endif
+#endif
+#endif
+ >
+ struct result { typedef T* type; };
+
+ T* operator()() const {
+ return new T();
+ }
+
+ template <typename A>
+ T* operator()(A const& a) const {
+ return new T(a);
+ }
+
+ template <typename A, typename B>
+ T* operator()(A const& a, B const& b) const {
+ return new T(a, b);
+ }
+
+ template <typename A, typename B, typename C>
+ T* operator()(A const& a, B const& b, C const& c) const {
+ return new T(a, b, c);
+ }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+ template <
+ typename A, typename B, typename C, typename D
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d) const
+ {
+ return new T(a, b, c, d);
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e) const
+ {
+ return new T(a, b, c, d, e);
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f) const
+ {
+ return new T(a, b, c, d, e, f);
+ }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g) const
+ {
+ return new T(a, b, c, d, e, f, g);
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h) const
+ {
+ return new T(a, b, c, d, e, f, g, h);
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i);
+ }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j);
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j, k);
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j, k, l);
+ }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j, k, l, m);
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+ }
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n, O const& o) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+ }
+
+#endif
+#endif
+#endif
+#endif
+};
+
+template <typename T>
+struct new_1 {
+
+ template <
+ typename A
+ >
+ struct result { typedef T* type; };
+
+ template <typename A>
+ T* operator()(A const& a) const {
+ return new T(a);
+ }
+
+};
+
+template <typename T>
+struct new_2 {
+
+ template <
+ typename A
+ , typename B
+ >
+ struct result { typedef T* type; };
+
+ template <typename A, typename B>
+ T* operator()(A const& a, B const& b) const {
+ return new T(a, b);
+ }
+
+};
+
+template <typename T>
+struct new_3 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ >
+ struct result { typedef T* type; };
+
+ template <typename A, typename B, typename C>
+ T* operator()(A const& a, B const& b, C const& c) const {
+ return new T(a, b, c);
+ }
+};
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+template <typename T>
+struct new_4 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ >
+ struct result { typedef T* type; };
+
+
+ template <
+ typename A, typename B, typename C, typename D
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d) const
+ {
+ return new T(a, b, c, d);
+ }
+};
+
+
+template <typename T>
+struct new_5 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ >
+ struct result { typedef T* type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e) const
+ {
+ return new T(a, b, c, d, e);
+ }
+};
+
+
+template <typename T>
+struct new_6 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ >
+ struct result { typedef T* type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f) const
+ {
+ return new T(a, b, c, d, e, f);
+ }
+};
+#endif
+
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+template <typename T>
+struct new_7 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ >
+ struct result { typedef T* type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g) const
+ {
+ return new T(a, b, c, d, e, f, g);
+ }
+};
+
+template <typename T>
+struct new_8 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ >
+ struct result { typedef T* type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h) const
+ {
+ return new T(a, b, c, d, e, f, g, h);
+ }
+};
+
+template <typename T>
+struct new_9 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ >
+ struct result { typedef T* type; };
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i);
+ }
+};
+#endif
+
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+template <typename T>
+struct new_10 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ >
+ struct result { typedef T* type; };
+
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j);
+ }
+};
+
+template <typename T>
+struct new_11 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ >
+ struct result { typedef T* type; };
+
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j, k);
+ }
+
+};
+
+template <typename T>
+struct new_12 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ , typename L
+ >
+ struct result { typedef T* type; };
+
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l) const
+ {
+ return new T(a, b, c, d, f, e, g, h, i, j, k, l);
+ }
+};
+#endif
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+template <typename T>
+struct new_13 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ , typename L
+ , typename M
+ >
+ struct result { typedef T* type; };
+
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j, k, l, m);
+ }
+};
+
+template <typename T>
+struct new_14 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ , typename L
+ , typename M
+ , typename N
+ >
+ struct result { typedef T* type; };
+
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n) const
+ {
+ return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+ }
+
+};
+
+template <typename T>
+struct new_15 {
+
+ template <
+ typename A
+ , typename B
+ , typename C
+ , typename D
+ , typename E
+ , typename F
+ , typename G
+ , typename H
+ , typename I
+ , typename J
+ , typename K
+ , typename L
+ , typename M
+ , typename N
+ , typename O
+ >
+ struct result { typedef T* type; };
+
+
+ template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O
+ >
+ T* operator()(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n, O const& o) const
+ {
+ return new T(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o);
+ }
+
+};
+#endif
+
+
+#if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The following specializations are needed because Borland and CodeWarrior
+// does not accept default template arguments in nested template classes in
+// classes (i.e new_l::result)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename TupleT>
+struct composite0_result<new_l_0<T>, TupleT> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A>
+struct composite1_result<new_l<T>, TupleT, A> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B>
+struct composite2_result<new_l<T>, TupleT, A, B> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C>
+struct composite3_result<new_l<T>, TupleT, A, B, C> {
+
+ typedef T* type;
+};
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D>
+struct composite4_result<new_l<T>, TupleT,
+ A, B, C, D> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E>
+struct composite5_result<new_l<T>, TupleT,
+ A, B, C, D, E> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F>
+struct composite6_result<new_l<T>, TupleT,
+ A, B, C, D, E, F> {
+
+ typedef T* type;
+};
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G>
+struct composite7_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H>
+struct composite8_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G, H> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I>
+struct composite9_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I> {
+
+ typedef T* type;
+};
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J>
+struct composite10_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K>
+struct composite11_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L>
+struct composite12_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L> {
+
+ typedef T* type;
+};
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M>
+struct composite13_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N>
+struct composite14_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
+
+ typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O>
+struct composite15_result<new_l<T>, TupleT,
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
+
+ typedef T* type;
+};
+
+#endif
+#endif
+#endif
+#endif
+#endif
+
+//////////////////////////////////
+template <typename T>
+inline typename impl::make_composite<new_l_0<T> >::type
+new_()
+{
+ typedef impl::make_composite<new_l_0<T> > make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_l_0<T>()));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+inline typename impl::make_composite<new_1<T>, A>::type
+new_(A const& a)
+{
+ typedef impl::make_composite<new_1<T>, A> make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_1<T>(),
+ as_actor<A>::convert(a)
+ ));
+}
+
+//////////////////////////////////
+template <typename T, typename A, typename B>
+inline typename impl::make_composite<new_2<T>, A, B>::type
+new_(A const& a, B const& b)
+{
+ typedef impl::make_composite<new_2<T>, A, B> make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_2<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b)
+ ));
+}
+
+//////////////////////////////////
+template <typename T, typename A, typename B, typename C>
+inline typename impl::make_composite<new_3<T>, A, B, C>::type
+new_(A const& a, B const& b, C const& c)
+{
+ typedef impl::make_composite<new_3<T>, A, B, C> make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_3<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c)
+ ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D
+>
+inline typename impl::make_composite<new_4<T>, A, B, C, D>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d)
+{
+ typedef
+ impl::make_composite<new_4<T>, A, B, C, D>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_4<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E
+>
+inline typename impl::make_composite<new_5<T>, A, B, C, D, E>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e)
+{
+ typedef
+ impl::make_composite<new_5<T>, A, B, C, D, E>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_5<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F
+>
+inline typename impl::make_composite<new_6<T>, A, B, C, D, E, F>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f)
+{
+ typedef
+ impl::make_composite<new_6<T>, A, B, C, D, E, F>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_6<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f)
+ ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G
+>
+inline typename impl::make_composite<new_7<T>, A, B, C, D, E, F, G>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g)
+{
+ typedef
+ impl::make_composite<new_7<T>, A, B, C, D, E, F, G>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_7<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H
+>
+inline typename impl::make_composite<new_8<T>, A, B, C, D, E, F, G, H>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h)
+{
+ typedef
+ impl::make_composite<new_8<T>, A, B, C, D, E, F, G, H>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_8<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I
+>
+inline typename impl::make_composite<new_9<T>, A, B, C, D, E, F, G, H, I>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i)
+{
+ typedef
+ impl::make_composite<new_9<T>, A, B, C, D, E, F, G, H, I>
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_9<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i)
+ ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J
+>
+inline typename impl::make_composite<
+ new_10<T>, A, B, C, D, E, F, G, H, I, J>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j)
+{
+ typedef
+ impl::make_composite<
+ new_10<T>, A, B, C, D, E, F, G, H, I, J
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_10<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K
+>
+inline typename impl::make_composite<
+ new_11<T>, A, B, C, D, E, F, G, H, I, J, K>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k)
+{
+ typedef
+ impl::make_composite<
+ new_11<T>, A, B, C, D, E, F, G, H, I, J, K
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_11<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K,
+ typename L
+>
+inline typename impl::make_composite<
+ new_12<T>, A, B, C, D, E, F, G, H, I, J, K, L>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l)
+{
+ typedef
+ impl::make_composite<
+ new_12<T>, A, B, C, D, E, F, G, H, I, J, K, L
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_12<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l)
+ ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K,
+ typename L, typename M
+>
+inline typename impl::make_composite<
+ new_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m)
+{
+ typedef
+ impl::make_composite<
+ new_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_13<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K,
+ typename L, typename M, typename N
+>
+inline typename impl::make_composite<
+ new_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n)
+{
+ typedef
+ impl::make_composite<
+ new_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_14<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m),
+ as_actor<N>::convert(n)
+ ));
+}
+
+//////////////////////////////////
+template <
+ typename T, typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J, typename K,
+ typename L, typename M, typename N, typename O
+>
+inline typename impl::make_composite<
+ new_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, O>::type
+new_(
+ A const& a, B const& b, C const& c, D const& d, E const& e,
+ F const& f, G const& g, H const& h, I const& i, J const& j,
+ K const& k, L const& l, M const& m, N const& n, O const& o)
+{
+ typedef
+ impl::make_composite<
+ new_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+ >
+ make_composite_t;
+ typedef typename make_composite_t::type type_t;
+ typedef typename make_composite_t::composite_type composite_type_t;
+
+ return type_t(composite_type_t(new_15<T>(),
+ as_actor<A>::convert(a),
+ as_actor<B>::convert(b),
+ as_actor<C>::convert(c),
+ as_actor<D>::convert(d),
+ as_actor<E>::convert(e),
+ as_actor<F>::convert(f),
+ as_actor<G>::convert(g),
+ as_actor<H>::convert(h),
+ as_actor<I>::convert(i),
+ as_actor<J>::convert(j),
+ as_actor<K>::convert(k),
+ as_actor<L>::convert(l),
+ as_actor<M>::convert(m),
+ as_actor<N>::convert(n),
+ as_actor<O>::convert(o)
+ ));
+}
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace phoenix
+
+#endif // PHOENIX_NEW_HPP
diff --git a/boost/spirit/home/classic/phoenix/operators.hpp b/boost/spirit/home/classic/phoenix/operators.hpp
new file mode 100644
index 0000000000..fa4676ceca
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/operators.hpp
@@ -0,0 +1,2203 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATORS_HPP
+#define PHOENIX_OPERATORS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_NO_CWCTYPE)
+ #include <cwctype>
+#endif
+
+#if defined(__BORLANDC__) || (defined(__ICL) && __ICL >= 700)
+#define CREF const&
+#else
+#define CREF
+#endif
+
+#include <climits>
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+#include <boost/spirit/home/classic/phoenix/composite.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/if.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Operators
+//
+// Lazy operators
+//
+// This class provides a mechanism for lazily evaluating operators.
+// Syntactically, a lazy operator looks like an ordinary C/C++
+// infix, prefix or postfix operator. The operator application
+// looks the same. However, unlike ordinary operators, the actual
+// operator execution is deferred. (see actor.hpp, primitives.hpp
+// and composite.hpp for an overview). Samples:
+//
+// arg1 + arg2
+// 1 + arg1 * arg2
+// 1 / -arg1
+// arg1 < 150
+//
+// T1 set of classes implement all the C++ free operators. Like
+// lazy functions (see functions.hpp), lazy operators are not
+// immediately executed when invoked. Instead, a composite (see
+// composite.hpp) object is created and returned to the caller.
+// Example:
+//
+// (arg1 + arg2) * arg3
+//
+// does nothing more than return a composite. T1 second function
+// call will evaluate the actual operators. Example:
+//
+// int i = 4, j = 5, k = 6;
+// cout << ((arg1 + arg2) * arg3)(i, j, k);
+//
+// will print out "54".
+//
+// Arbitrarily complex expressions can be lazily evaluated
+// following three simple rules:
+//
+// 1) Lazy evaluated binary operators apply when at least one
+// of the operands is an actor object (see actor.hpp and
+// primitives.hpp). Consequently, if an operand is not an actor
+// object, it is implicitly converted to an object of type
+// actor<value<T> > (where T is the original type of the
+// operand).
+//
+// 2) Lazy evaluated unary operators apply only to operands
+// which are actor objects.
+//
+// 3) The result of a lazy operator is a composite actor object
+// that can in turn apply to rule 1.
+//
+// Example:
+//
+// arg1 + 3
+//
+// is a lazy expression involving the operator+. Following rule 1,
+// lazy evaluation is triggered since arg1 is an instance of an
+// actor<argument<N> > class (see primitives.hpp). The right
+// operand <3> is implicitly converted to an actor<value<int> >.
+// The result of this binary + expression is a composite object,
+// following rule 3.
+//
+// Take note that although at least one of the operands must be a
+// valid actor class in order for lazy evaluation to take effect,
+// if this is not the case and we still want to lazily evaluate an
+// expression, we can use var(x), val(x) or cref(x) to transform
+// the operand into a valid action object (see primitives.hpp).
+// Example:
+//
+// val(1) << 3;
+//
+// Supported operators:
+//
+// Unary operators:
+//
+// prefix: ~, !, -, +, ++, --, & (reference), * (dereference)
+// postfix: ++, --
+//
+// Binary operators:
+//
+// =, [], +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
+// +, -, *, /, %, &, |, ^, <<, >>
+// ==, !=, <, >, <=, >=
+// &&, ||
+//
+// Each operator has a special tag type associated with it. For
+// example the binary + operator has a plus_op tag type associated
+// with it. This is used to specialize either the unary_operator or
+// binary_operator template classes (see unary_operator and
+// binary_operator below). Specializations of these unary_operator
+// and binary_operator are the actual workhorses that implement the
+// operations. The behavior of each lazy operator depends on these
+// unary_operator and binary_operator specializations. 'preset'
+// specializations conform to the canonical operator rules modeled
+// by the behavior of integers and pointers:
+//
+// Prefix -, + and ~ accept constant arguments and return an
+// object by value.
+//
+// The ! accept constant arguments and returns a boolean
+// result.
+//
+// The & (address-of), * (dereference) both return a reference
+// to an object.
+//
+// Prefix ++ returns a reference to its mutable argument after
+// it is incremented.
+//
+// Postfix ++ returns the mutable argument by value before it
+// is incremented.
+//
+// The += and its family accept mutable right hand side (rhs)
+// operand and return a reference to the rhs operand.
+//
+// Infix + and its family accept constant arguments and return
+// an object by value.
+//
+// The == and its family accept constant arguments and return a
+// boolean result.
+//
+// Operators && and || accept constant arguments and return a
+// boolean result and are short circuit evaluated as expected.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Operator tags
+//
+// Each C++ operator has a corresponding tag type. This is
+// used as a means for specializing the unary_operator and
+// binary_operator (see below). The tag also serves as the
+// lazy operator type compatible as a composite operation
+// see (composite.hpp).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// Unary operator tags
+
+struct negative_op; struct positive_op;
+struct logical_not_op; struct invert_op;
+struct reference_op; struct dereference_op;
+struct pre_incr_op; struct pre_decr_op;
+struct post_incr_op; struct post_decr_op;
+
+// Binary operator tags
+
+struct assign_op; struct index_op;
+struct plus_assign_op; struct minus_assign_op;
+struct times_assign_op; struct divide_assign_op; struct mod_assign_op;
+struct and_assign_op; struct or_assign_op; struct xor_assign_op;
+struct shift_l_assign_op; struct shift_r_assign_op;
+
+struct plus_op; struct minus_op;
+struct times_op; struct divide_op; struct mod_op;
+struct and_op; struct or_op; struct xor_op;
+struct shift_l_op; struct shift_r_op;
+
+struct eq_op; struct not_eq_op;
+struct lt_op; struct lt_eq_op;
+struct gt_op; struct gt_eq_op;
+struct logical_and_op; struct logical_or_op;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// unary_operator<TagT, T>
+//
+// The unary_operator class implements most of the C++ unary
+// operators. Each specialization is basically a simple static eval
+// function plus a result_type typedef that determines the return
+// type of the eval function.
+//
+// TagT is one of the unary operator tags above and T is the data
+// type (argument) involved in the operation.
+//
+// Only the behavior of C/C++ built-in types are taken into account
+// in the specializations provided below. For user-defined types,
+// these specializations may still be used provided that the
+// operator overloads of such types adhere to the standard behavior
+// of built-in types.
+//
+// T1 separate special_ops.hpp file implements more stl savvy
+// specializations. Other more specialized unary_operator
+// implementations may be defined by the client for specific
+// unary operator tags/data types.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TagT, typename T>
+struct unary_operator;
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<negative_op, T> {
+
+ typedef T const result_type;
+ static result_type eval(T const& v)
+ { return -v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<positive_op, T> {
+
+ typedef T const result_type;
+ static result_type eval(T const& v)
+ { return +v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<logical_not_op, T> {
+
+ typedef T const result_type;
+ static result_type eval(T const& v)
+ { return !v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<invert_op, T> {
+
+ typedef T const result_type;
+ static result_type eval(T const& v)
+ { return ~v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<reference_op, T> {
+
+ typedef T* result_type;
+ static result_type eval(T& v)
+ { return &v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<dereference_op, T*> {
+
+ typedef T& result_type;
+ static result_type eval(T* v)
+ { return *v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<dereference_op, T* const> {
+
+ typedef T& result_type;
+ static result_type eval(T* const v)
+ { return *v; }
+};
+
+//////////////////////////////////
+template <>
+struct unary_operator<dereference_op, nil_t> {
+
+ // G++ eager template instantiation
+ // somehow requires this.
+ typedef nil_t result_type;
+};
+
+//////////////////////////////////
+#ifndef __BORLANDC__
+template <>
+struct unary_operator<dereference_op, nil_t const> {
+
+ // G++ eager template instantiation
+ // somehow requires this.
+ typedef nil_t result_type;
+};
+#endif
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<pre_incr_op, T> {
+
+ typedef T& result_type;
+ static result_type eval(T& v)
+ { return ++v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<pre_decr_op, T> {
+
+ typedef T& result_type;
+ static result_type eval(T& v)
+ { return --v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<post_incr_op, T> {
+
+ typedef T const result_type;
+ static result_type eval(T& v)
+ { T t(v); ++v; return t; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<post_decr_op, T> {
+
+ typedef T const result_type;
+ static result_type eval(T& v)
+ { T t(v); --v; return t; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// rank<T>
+//
+// rank<T> class has a static int constant 'value' that defines the
+// absolute rank of a type. rank<T> is used to choose the result
+// type of binary operators such as +. The type with the higher
+// rank wins and is used as the operator's return type. T1 generic
+// user defined type has a very high rank and always wins when
+// compared against a user defined type. If this is not desireable,
+// one can write a rank specialization for the type.
+//
+// Take note that ranks 0..9999 are reserved for the framework.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct rank { static int const value = INT_MAX; };
+
+template <> struct rank<void> { static int const value = 0; };
+template <> struct rank<bool> { static int const value = 10; };
+
+template <> struct rank<char> { static int const value = 20; };
+template <> struct rank<signed char> { static int const value = 20; };
+template <> struct rank<unsigned char> { static int const value = 30; };
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+template <> struct rank<wchar_t> { static int const value = 40; };
+#endif // !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+
+template <> struct rank<short> { static int const value = 50; };
+template <> struct rank<unsigned short> { static int const value = 60; };
+
+template <> struct rank<int> { static int const value = 70; };
+template <> struct rank<unsigned int> { static int const value = 80; };
+
+template <> struct rank<long> { static int const value = 90; };
+template <> struct rank<unsigned long> { static int const value = 100; };
+
+#ifdef BOOST_HAS_LONG_LONG
+template <> struct rank< ::boost::long_long_type> { static int const value = 110; };
+template <> struct rank< ::boost::ulong_long_type> { static int const value = 120; };
+#endif
+
+template <> struct rank<float> { static int const value = 130; };
+template <> struct rank<double> { static int const value = 140; };
+template <> struct rank<long double> { static int const value = 150; };
+
+template <typename T> struct rank<T*>
+{ static int const value = 160; };
+
+template <typename T> struct rank<T* const>
+{ static int const value = 160; };
+
+template <typename T, int N> struct rank<T[N]>
+{ static int const value = 160; };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// higher_rank<T0, T1>
+//
+// Chooses the type (T0 or T1) with the higher rank.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T0, typename T1>
+struct higher_rank {
+ typedef typename boost::mpl::if_c<
+ rank<T0>::value < rank<T1>::value,
+ T1, T0>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// binary_operator<TagT, T0, T1>
+//
+// The binary_operator class implements most of the C++ binary
+// operators. Each specialization is basically a simple static eval
+// function plus a result_type typedef that determines the return
+// type of the eval function.
+//
+// TagT is one of the binary operator tags above T0 and T1 are the
+// (arguments') data types involved in the operation.
+//
+// Only the behavior of C/C++ built-in types are taken into account
+// in the specializations provided below. For user-defined types,
+// these specializations may still be used provided that the
+// operator overloads of such types adhere to the standard behavior
+// of built-in types.
+//
+// T1 separate special_ops.hpp file implements more stl savvy
+// specializations. Other more specialized unary_operator
+// implementations may be defined by the client for specific
+// unary operator tags/data types.
+//
+// All binary_operator except the logical_and_op and logical_or_op
+// have an eval static function that carries out the actual operation.
+// The logical_and_op and logical_or_op d are special because these
+// two operators are short-circuit evaluated.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TagT, typename T0, typename T1>
+struct binary_operator;
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs = rhs; }
+};
+
+//////////////////////////////////
+template <typename T1>
+struct binary_operator<index_op, nil_t, T1> {
+
+ // G++ eager template instantiation
+ // somehow requires this.
+ typedef nil_t result_type;
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<index_op, T0*, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0* ptr, T1 const& index)
+ { return ptr[index]; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<index_op, T0* const, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0* const ptr, T1 const& index)
+ { return ptr[index]; }
+};
+
+//////////////////////////////////
+template <typename T0, int N, typename T1>
+struct binary_operator<index_op, T0[N], T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0* ptr, T1 const& index)
+ { return ptr[index]; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<plus_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs += rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<minus_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs -= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<times_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs *= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<divide_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs /= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<mod_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs %= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<and_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs &= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<or_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs |= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<xor_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs ^= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<shift_l_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs <<= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<shift_r_assign_op, T0, T1> {
+
+ typedef T0& result_type;
+ static result_type eval(T0& lhs, T1 const& rhs)
+ { return lhs >>= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<plus_op, T0, T1> {
+
+ typedef typename higher_rank<T0, T1>::type const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs + rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<minus_op, T0, T1> {
+
+ typedef typename higher_rank<T0, T1>::type const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs - rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<times_op, T0, T1> {
+
+ typedef typename higher_rank<T0, T1>::type const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs * rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<divide_op, T0, T1> {
+
+ typedef typename higher_rank<T0, T1>::type const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs / rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<mod_op, T0, T1> {
+
+ typedef typename higher_rank<T0, T1>::type const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs % rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<and_op, T0, T1> {
+
+ typedef typename higher_rank<T0, T1>::type const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs & rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<or_op, T0, T1> {
+
+ typedef typename higher_rank<T0, T1>::type const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs | rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<xor_op, T0, T1> {
+
+ typedef typename higher_rank<T0, T1>::type const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs ^ rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<shift_l_op, T0, T1> {
+
+ typedef T0 const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs << rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<shift_r_op, T0, T1> {
+
+ typedef T0 const result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs >> rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<eq_op, T0, T1> {
+
+ typedef bool result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs == rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<not_eq_op, T0, T1> {
+
+ typedef bool result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs != rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<lt_op, T0, T1> {
+
+ typedef bool result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs < rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<lt_eq_op, T0, T1> {
+
+ typedef bool result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs <= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<gt_op, T0, T1> {
+
+ typedef bool result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs > rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<gt_eq_op, T0, T1> {
+
+ typedef bool result_type;
+ static result_type eval(T0 const& lhs, T1 const& rhs)
+ { return lhs >= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<logical_and_op, T0, T1> {
+
+ typedef bool result_type;
+ // no eval function, see comment above.
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<logical_or_op, T0, T1> {
+
+ typedef bool result_type;
+ // no eval function, see comment above.
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// negative lazy operator (prefix -)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct negative_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<negative_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<negative_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<negative_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<negative_op, BaseT>::type
+operator-(actor<BaseT> const& _0)
+{
+ return impl::make_unary<negative_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// positive lazy operator (prefix +)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct positive_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<positive_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<positive_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<positive_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<positive_op, BaseT>::type
+operator+(actor<BaseT> const& _0)
+{
+ return impl::make_unary<positive_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// logical not lazy operator (prefix !)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct logical_not_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<logical_not_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<logical_not_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<logical_not_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<logical_not_op, BaseT>::type
+operator!(actor<BaseT> const& _0)
+{
+ return impl::make_unary<logical_not_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// invert lazy operator (prefix ~)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct invert_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<invert_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<invert_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<invert_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<invert_op, BaseT>::type
+operator~(actor<BaseT> const& _0)
+{
+ return impl::make_unary<invert_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// reference lazy operator (prefix &)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct reference_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<reference_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<reference_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<reference_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<reference_op, BaseT>::type
+operator&(actor<BaseT> const& _0)
+{
+ return impl::make_unary<reference_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// dereference lazy operator (prefix *)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct dereference_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<dereference_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<dereference_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<dereference_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<dereference_op, BaseT>::type
+operator*(actor<BaseT> const& _0)
+{
+ return impl::make_unary<dereference_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// pre increment lazy operator (prefix ++)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct pre_incr_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<pre_incr_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<pre_incr_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<pre_incr_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<pre_incr_op, BaseT>::type
+operator++(actor<BaseT> const& _0)
+{
+ return impl::make_unary<pre_incr_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// pre decrement lazy operator (prefix --)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct pre_decr_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<pre_decr_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<pre_decr_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<pre_decr_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<pre_decr_op, BaseT>::type
+operator--(actor<BaseT> const& _0)
+{
+ return impl::make_unary<pre_decr_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// post increment lazy operator (postfix ++)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct post_incr_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<post_incr_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<post_incr_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<post_incr_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<post_incr_op, BaseT>::type
+operator++(actor<BaseT> const& _0, int)
+{
+ return impl::make_unary<post_incr_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// post decrement lazy operator (postfix --)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct post_decr_op {
+
+ template <typename T0>
+ struct result {
+
+ typedef typename unary_operator<post_decr_op, T0>::result_type type;
+ };
+
+ template <typename T0>
+ typename unary_operator<post_decr_op, T0>::result_type
+ operator()(T0& _0) const
+ { return unary_operator<post_decr_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<post_decr_op, BaseT>::type
+operator--(actor<BaseT> const& _0, int)
+{
+ return impl::make_unary<post_decr_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// assignment lazy operator (infix =)
+// The acual lazy operator is a member of the actor class.
+//
+///////////////////////////////////////////////////////////////////////////////
+struct assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename B>
+inline typename impl::make_binary1<assign_op, BaseT, B>::type
+actor<BaseT>::operator=(B const& _1) const
+{
+ return impl::make_binary1<assign_op, BaseT, B>::construct(*this, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// index lazy operator (array index [])
+// The acual lazy operator is a member of the actor class.
+//
+///////////////////////////////////////////////////////////////////////////////
+struct index_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<index_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<index_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<index_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename B>
+inline typename impl::make_binary1<index_op, BaseT, B>::type
+actor<BaseT>::operator[](B const& _1) const
+{
+ return impl::make_binary1<index_op, BaseT, B>::construct(*this, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// plus assign lazy operator (infix +=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct plus_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<plus_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<plus_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<plus_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<plus_assign_op, BaseT, T1>::type
+operator+=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<plus_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// minus assign lazy operator (infix -=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct minus_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<minus_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<minus_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<minus_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<minus_assign_op, BaseT, T1>::type
+operator-=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<minus_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// times assign lazy operator (infix *=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct times_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<times_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<times_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<times_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<times_assign_op, BaseT, T1>::type
+operator*=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<times_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// divide assign lazy operator (infix /=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct divide_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<divide_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<divide_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<divide_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<divide_assign_op, BaseT, T1>::type
+operator/=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<divide_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// mod assign lazy operator (infix %=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct mod_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<mod_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<mod_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<mod_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<mod_assign_op, BaseT, T1>::type
+operator%=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<mod_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// and assign lazy operator (infix &=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct and_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<and_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<and_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<and_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<and_assign_op, BaseT, T1>::type
+operator&=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<and_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// or assign lazy operator (infix |=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct or_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<or_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<or_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<or_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<or_assign_op, BaseT, T1>::type
+operator|=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<or_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// xor assign lazy operator (infix ^=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct xor_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<xor_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<xor_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<xor_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<xor_assign_op, BaseT, T1>::type
+operator^=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<xor_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// shift left assign lazy operator (infix <<=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct shift_l_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<shift_l_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<shift_l_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<shift_l_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<shift_l_assign_op, BaseT, T1>::type
+operator<<=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<shift_l_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// shift right assign lazy operator (infix >>=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct shift_r_assign_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<shift_r_assign_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<shift_r_assign_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<shift_r_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<shift_r_assign_op, BaseT, T1>::type
+operator>>=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<shift_r_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// plus lazy operator (infix +)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct plus_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<plus_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<plus_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<plus_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<plus_op, BaseT, T1>::type
+operator+(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<plus_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<plus_op, T0, BaseT>::type
+operator+(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<plus_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<plus_op, BaseT0, BaseT1>::type
+operator+(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<plus_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// minus lazy operator (infix -)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct minus_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<minus_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<minus_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<minus_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<minus_op, BaseT, T1>::type
+operator-(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<minus_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<minus_op, T0, BaseT>::type
+operator-(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<minus_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<minus_op, BaseT0, BaseT1>::type
+operator-(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<minus_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// times lazy operator (infix *)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct times_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<times_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<times_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<times_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<times_op, BaseT, T1>::type
+operator*(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<times_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<times_op, T0, BaseT>::type
+operator*(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<times_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<times_op, BaseT0, BaseT1>::type
+operator*(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<times_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// divide lazy operator (infix /)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct divide_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<divide_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<divide_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<divide_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<divide_op, BaseT, T1>::type
+operator/(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<divide_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<divide_op, T0, BaseT>::type
+operator/(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<divide_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<divide_op, BaseT0, BaseT1>::type
+operator/(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<divide_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// mod lazy operator (infix %)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct mod_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<mod_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<mod_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<mod_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<mod_op, BaseT, T1>::type
+operator%(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<mod_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<mod_op, T0, BaseT>::type
+operator%(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<mod_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<mod_op, BaseT0, BaseT1>::type
+operator%(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<mod_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// and lazy operator (infix &)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct and_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<and_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<and_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<and_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<and_op, BaseT, T1>::type
+operator&(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<and_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<and_op, T0, BaseT>::type
+operator&(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<and_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<and_op, BaseT0, BaseT1>::type
+operator&(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<and_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// or lazy operator (infix |)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct or_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<or_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<or_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<or_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<or_op, BaseT, T1>::type
+operator|(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<or_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<or_op, T0, BaseT>::type
+operator|(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<or_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<or_op, BaseT0, BaseT1>::type
+operator|(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<or_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// xor lazy operator (infix ^)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct xor_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<xor_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<xor_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<xor_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<xor_op, BaseT, T1>::type
+operator^(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<xor_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<xor_op, T0, BaseT>::type
+operator^(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<xor_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<xor_op, BaseT0, BaseT1>::type
+operator^(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<xor_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// shift left lazy operator (infix <<)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct shift_l_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<shift_l_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<shift_l_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<shift_l_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<shift_l_op, BaseT, T1>::type
+operator<<(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<shift_l_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<shift_l_op, T0, BaseT>::type
+operator<<(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<shift_l_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<shift_l_op, BaseT0, BaseT1>::type
+operator<<(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<shift_l_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// shift right lazy operator (infix >>)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct shift_r_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<shift_r_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<shift_r_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<shift_r_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<shift_r_op, BaseT, T1>::type
+operator>>(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<shift_r_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<shift_r_op, T0, BaseT>::type
+operator>>(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<shift_r_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<shift_r_op, BaseT0, BaseT1>::type
+operator>>(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<shift_r_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// equal lazy operator (infix ==)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct eq_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<eq_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<eq_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<eq_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<eq_op, BaseT, T1>::type
+operator==(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<eq_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<eq_op, T0, BaseT>::type
+operator==(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<eq_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<eq_op, BaseT0, BaseT1>::type
+operator==(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<eq_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// not equal lazy operator (infix !=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct not_eq_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<not_eq_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<not_eq_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<not_eq_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<not_eq_op, BaseT, T1>::type
+operator!=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<not_eq_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<not_eq_op, T0, BaseT>::type
+operator!=(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<not_eq_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<not_eq_op, BaseT0, BaseT1>::type
+operator!=(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<not_eq_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// less than lazy operator (infix <)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct lt_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<lt_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<lt_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<lt_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<lt_op, BaseT, T1>::type
+operator<(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<lt_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<lt_op, T0, BaseT>::type
+operator<(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<lt_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<lt_op, BaseT0, BaseT1>::type
+operator<(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<lt_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// less than equal lazy operator (infix <=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct lt_eq_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<lt_eq_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<lt_eq_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<lt_eq_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<lt_eq_op, BaseT, T1>::type
+operator<=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<lt_eq_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<lt_eq_op, T0, BaseT>::type
+operator<=(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<lt_eq_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<lt_eq_op, BaseT0, BaseT1>::type
+operator<=(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<lt_eq_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// greater than lazy operator (infix >)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct gt_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<gt_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<gt_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<gt_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<gt_op, BaseT, T1>::type
+operator>(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<gt_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<gt_op, T0, BaseT>::type
+operator>(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<gt_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<gt_op, BaseT0, BaseT1>::type
+operator>(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<gt_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// greater than equal lazy operator (infix >=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct gt_eq_op {
+
+ template <typename T0, typename T1>
+ struct result {
+
+ typedef typename binary_operator<gt_eq_op, T0, T1>
+ ::result_type type;
+ };
+
+ template <typename T0, typename T1>
+ typename binary_operator<gt_eq_op, T0, T1>::result_type
+ operator()(T0& _0, T1& _1) const
+ { return binary_operator<gt_eq_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<gt_eq_op, BaseT, T1>::type
+operator>=(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return impl::make_binary1<gt_eq_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<gt_eq_op, T0, BaseT>::type
+operator>=(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary2<gt_eq_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<gt_eq_op, BaseT0, BaseT1>::type
+operator>=(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return impl::make_binary3<gt_eq_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// logical and lazy operator (infix &&)
+//
+// The logical_and_composite class and its corresponding generators are
+// provided to allow short-circuit evaluation of the operator's
+// operands.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A0, typename A1>
+struct logical_and_composite {
+
+ typedef logical_and_composite<A0, A1> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename binary_operator<logical_and_op,
+ typename actor_result<A0, TupleT>::plain_type,
+ typename actor_result<A1, TupleT>::plain_type
+ >::result_type type;
+ };
+
+ logical_and_composite(A0 const& _0, A1 const& _1)
+ : a0(_0), a1(_1) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ return a0.eval(args) && a1.eval(args);
+ }
+
+ A0 a0; A1 a1; // actors
+};
+
+#if !(defined(__ICL) && __ICL <= 500)
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline actor<logical_and_composite
+<actor<BaseT>, typename as_actor<T1>::type> >
+operator&&(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return logical_and_composite
+ <actor<BaseT>, typename as_actor<T1>::type>
+ (_0, as_actor<T1>::convert(_1));
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline actor<logical_and_composite
+<typename as_actor<T0>::type, actor<BaseT> > >
+operator&&(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return logical_and_composite
+ <typename as_actor<T0>::type, actor<BaseT> >
+ (as_actor<T0>::convert(_0), _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline actor<logical_and_composite
+<actor<BaseT0>, actor<BaseT1> > >
+operator&&(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return logical_and_composite
+ <actor<BaseT0>, actor<BaseT1> >
+ (_0, _1);
+}
+#else
+//////////////////////////////////
+template <typename T0, typename T1>
+inline actor<logical_and_composite
+<typename as_actor<T0>::type, typename as_actor<T1>::type> >
+operator&&(T0 CREF _0, T1 CREF _1)
+{
+ return logical_and_composite
+ <typename as_actor<T0>::type, typename as_actor<T1>::type>
+ (as_actor<T0>::convert(_0), as_actor<T1>::convert(_1));
+}
+#endif // !(__ICL && __ICL <= 500)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// logical or lazy operator (infix ||)
+//
+// The logical_or_composite class and its corresponding generators are
+// provided to allow short-circuit evaluation of the operator's
+// operands.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A0, typename A1>
+struct logical_or_composite {
+
+ typedef logical_or_composite<A0, A1> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef typename binary_operator<logical_or_op,
+ typename actor_result<A0, TupleT>::plain_type,
+ typename actor_result<A1, TupleT>::plain_type
+ >::result_type type;
+ };
+
+ logical_or_composite(A0 const& _0, A1 const& _1)
+ : a0(_0), a1(_1) {}
+
+ template <typename TupleT>
+ typename actor_result<self_t, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ return a0.eval(args) || a1.eval(args);
+ }
+
+ A0 a0; A1 a1; // actors
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline actor<logical_or_composite
+<actor<BaseT>, typename as_actor<T1>::type> >
+operator||(actor<BaseT> const& _0, T1 CREF _1)
+{
+ return logical_or_composite
+ <actor<BaseT>, typename as_actor<T1>::type>
+ (_0, as_actor<T1>::convert(_1));
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline actor<logical_or_composite
+<typename as_actor<T0>::type, actor<BaseT> > >
+operator||(T0 CREF _0, actor<BaseT> const& _1)
+{
+ return logical_or_composite
+ <typename as_actor<T0>::type, actor<BaseT> >
+ (as_actor<T0>::convert(_0), _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline actor<logical_or_composite
+<actor<BaseT0>, actor<BaseT1> > >
+operator||(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return logical_or_composite
+ <actor<BaseT0>, actor<BaseT1> >
+ (_0, _1);
+}
+
+} // namespace phoenix
+
+#undef CREF
+#endif
diff --git a/boost/spirit/home/classic/phoenix/primitives.hpp b/boost/spirit/home/classic/phoenix/primitives.hpp
new file mode 100644
index 0000000000..32dd5b96e3
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/primitives.hpp
@@ -0,0 +1,256 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_PRIMITIVES_HPP
+#define PHOENIX_PRIMITIVES_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// argument class
+//
+// Lazy arguments
+//
+// An actor base class that extracts and returns the Nth argument
+// from the argument list passed in the 'args' tuple in the eval
+// member function (see actor.hpp). There are some predefined
+// argument constants that can be used as actors (arg1..argN).
+//
+// The argument actor is a place-holder for the actual arguments
+// passed by the client. For example, wherever arg1 is seen placed
+// in a lazy function (see functions.hpp) or lazy operator (see
+// operators.hpp), this will be replaced by the actual first
+// argument in the actual function evaluation. Argument actors are
+// essentially lazy arguments. A lazy argument is a full actor in
+// its own right and can be evaluated through the actor's operator().
+//
+// Example:
+//
+// char c = 'A';
+// int i = 123;
+// const char* s = "Hello World";
+//
+// cout << arg1(c) << ' ';
+// cout << arg1(i, s) << ' ';
+// cout << arg2(i, s) << ' ';
+//
+// will print out "A 123 Hello World"
+//
+///////////////////////////////////////////////////////////////////////////////
+template <int N>
+struct argument {
+
+ template <typename TupleT>
+ struct result { typedef typename tuple_element<N, TupleT>::type type; };
+
+ template <typename TupleT>
+ typename tuple_element<N, TupleT>::type
+ eval(TupleT const& args) const
+ {
+ return args[tuple_index<N>()];
+ }
+};
+
+//////////////////////////////////
+actor<argument<0> > const arg1 = argument<0>();
+actor<argument<1> > const arg2 = argument<1>();
+actor<argument<2> > const arg3 = argument<2>();
+
+#if PHOENIX_LIMIT > 3
+actor<argument<3> > const arg4 = argument<3>();
+actor<argument<4> > const arg5 = argument<4>();
+actor<argument<5> > const arg6 = argument<5>();
+
+#if PHOENIX_LIMIT > 6
+actor<argument<6> > const arg7 = argument<6>();
+actor<argument<7> > const arg8 = argument<7>();
+actor<argument<8> > const arg9 = argument<8>();
+
+#if PHOENIX_LIMIT > 9
+actor<argument<9> > const arg10 = argument<9>();
+actor<argument<10> > const arg11 = argument<10>();
+actor<argument<11> > const arg12 = argument<11>();
+
+#if PHOENIX_LIMIT > 12
+actor<argument<12> > const arg13 = argument<12>();
+actor<argument<13> > const arg14 = argument<13>();
+actor<argument<14> > const arg15 = argument<14>();
+
+#endif
+#endif
+#endif
+#endif
+///////////////////////////////////////////////////////////////////////////////
+//
+// value class
+//
+// Lazy values
+//
+// A bound actual parameter is kept in a value class for deferred
+// access later when needed. A value object is immutable. Value
+// objects are typically created through the val(x) free function
+// which returns a value<T> with T deduced from the type of x. x is
+// held in the value<T> object by value.
+//
+// Lazy values are actors. As such, lazy values can be evaluated
+// through the actor's operator(). Such invocation gives the value's
+// identity. Example:
+//
+// cout << val(3)() << val("Hello World")();
+//
+// prints out "3 Hello World"
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct value {
+
+ typedef typename boost::remove_reference<T>::type plain_t;
+
+ template <typename TupleT>
+ struct result { typedef plain_t const type; };
+
+ value(plain_t val_)
+ : val(val_) {}
+
+ template <typename TupleT>
+ plain_t const
+ eval(TupleT const& /*args*/) const
+ {
+ return val;
+ }
+
+ plain_t val;
+};
+
+//////////////////////////////////
+template <typename T>
+inline actor<value<T> > const
+val(T v)
+{
+ return value<T>(v);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+void
+val(actor<BaseT> const& v); // This is undefined and not allowed.
+
+///////////////////////////////////////////////////////////////////////////
+//
+// Arbitrary types T are typically converted to a actor<value<T> >
+// (see as_actor<T> in actor.hpp). A specialization is also provided
+// for arrays. T[N] arrays are converted to actor<value<T const*> >.
+//
+///////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct as_actor {
+
+ typedef actor<value<T> > type;
+ static type convert(T const& x)
+ { return value<T>(x); }
+};
+
+//////////////////////////////////
+template <typename T, int N>
+struct as_actor<T[N]> {
+
+ typedef actor<value<T const*> > type;
+ static type convert(T const x[N])
+ { return value<T const*>(x); }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// variable class
+//
+// Lazy variables
+//
+// A bound actual parameter may also be held by non-const reference
+// in a variable class for deferred access later when needed. A
+// variable object is mutable, i.e. its referenced variable can be
+// modified. Variable objects are typically created through the
+// var(x) free function which returns a variable<T> with T deduced
+// from the type of x. x is held in the value<T> object by
+// reference.
+//
+// Lazy variables are actors. As such, lazy variables can be
+// evaluated through the actor's operator(). Such invocation gives
+// the variables's identity. Example:
+//
+// int i = 3;
+// char const* s = "Hello World";
+// cout << var(i)() << var(s)();
+//
+// prints out "3 Hello World"
+//
+// Another free function const_(x) may also be used. const_(x) creates
+// a variable<T const&> object using a constant reference.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+template <typename T>
+struct variable {
+
+ template <typename TupleT>
+ struct result { typedef T& type; };
+
+ variable(T& var_)
+ : var(var_) {}
+
+ template <typename TupleT>
+ T&
+ eval(TupleT const& /*args*/) const
+ {
+ return var;
+ }
+
+ T& var;
+};
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+//////////////////////////////////
+template <typename T>
+inline actor<variable<T> > const
+var(T& v)
+{
+ return variable<T>(v);
+}
+
+//////////////////////////////////
+template <typename T>
+inline actor<variable<T const> > const
+const_(T const& v)
+{
+ return variable<T const>(v);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+void
+var(actor<BaseT> const& v); // This is undefined and not allowed.
+
+//////////////////////////////////
+template <typename BaseT>
+void
+const_(actor<BaseT> const& v); // This is undefined and not allowed.
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace phoenix
+
+#endif
diff --git a/boost/spirit/home/classic/phoenix/special_ops.hpp b/boost/spirit/home/classic/phoenix/special_ops.hpp
new file mode 100644
index 0000000000..7fc2f6d78d
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/special_ops.hpp
@@ -0,0 +1,341 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_SPECIAL_OPS_HPP
+#define PHOENIX_SPECIAL_OPS_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STRINGSTREAM
+#include <strstream>
+#define PHOENIX_SSTREAM strstream
+#else
+#include <sstream>
+#define PHOENIX_SSTREAM stringstream
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/operators.hpp>
+#include <iosfwd>
+
+///////////////////////////////////////////////////////////////////////////////
+#if defined(_STLPORT_VERSION) && defined(__STL_USE_OWN_NAMESPACE)
+#define PHOENIX_STD _STLP_STD
+#define PHOENIX_NO_STD_NAMESPACE
+#else
+#define PHOENIX_STD std
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//#if !defined(PHOENIX_NO_STD_NAMESPACE)
+namespace PHOENIX_STD
+{
+//#endif
+
+ template<typename T> class complex;
+
+//#if !defined(PHOENIX_NO_STD_NAMESPACE)
+}
+//#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix
+{
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The following specializations take into account the C++ standard
+// library components. There are a couple of issues that have to be
+// dealt with to enable lazy operator overloads for the standard
+// library classes.
+//
+// *iostream (e.g. cout, cin, strstream/ stringstream) uses non-
+// canonical shift operator overloads where the lhs is taken in
+// by reference.
+//
+// *I/O manipulators overloads for the RHS of the << and >>
+// operators.
+//
+// *STL iterators can be objects that conform to pointer semantics.
+// Some operators need to be specialized for these.
+//
+// *std::complex is given a rank (see rank class in operators.hpp)
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// specialization for rank<std::complex>
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T> struct rank<PHOENIX_STD::complex<T> >
+{ static int const value = 170 + rank<T>::value; };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// specializations for std::istream
+//
+///////////////////////////////////////////////////////////////////////////////
+#if defined(__GNUC__) && (__GNUC__ < 3)
+ #if defined(_STLPORT_VERSION)
+ #define PHOENIX_ISTREAM _IO_istream_withassign
+ #else
+ #define PHOENIX_ISTREAM PHOENIX_STD::_IO_istream_withassign
+ #endif
+#else
+// #if (defined(__ICL) && defined(_STLPORT_VERSION))
+// #define PHOENIX_ISTREAM istream_withassign
+// #else
+ #define PHOENIX_ISTREAM PHOENIX_STD::istream
+// #endif
+#endif
+
+//////////////////////////////////
+#if defined(__GNUC__) && (__GNUC__ < 3)
+// || (defined(__ICL) && defined(_STLPORT_VERSION))
+template <typename T1>
+struct binary_operator<shift_r_op, PHOENIX_ISTREAM, T1>
+{
+ typedef PHOENIX_STD::istream& result_type;
+ static result_type eval(PHOENIX_STD::istream& out, T1& rhs)
+ { return out >> rhs; }
+};
+#endif
+
+//////////////////////////////////
+template <typename T1>
+struct binary_operator<shift_r_op, PHOENIX_STD::istream, T1>
+{
+ typedef PHOENIX_STD::istream& result_type;
+ static result_type eval(PHOENIX_STD::istream& out, T1& rhs)
+ { return out >> rhs; }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary3
+ <shift_r_op, variable<PHOENIX_ISTREAM>, BaseT>::type
+operator>>(PHOENIX_ISTREAM& _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary3
+ <shift_r_op, variable<PHOENIX_ISTREAM>, BaseT>
+ ::construct(var(_0), _1);
+}
+
+#undef PHOENIX_ISTREAM
+///////////////////////////////////////////////////////////////////////////////
+//
+// specializations for std::ostream
+//
+///////////////////////////////////////////////////////////////////////////////
+#if defined(__GNUC__) && (__GNUC__ < 3)
+ #if defined(_STLPORT_VERSION)
+ #define PHOENIX_OSTREAM _IO_ostream_withassign
+ #else
+ #define PHOENIX_OSTREAM PHOENIX_STD::_IO_ostream_withassign
+ #endif
+#else
+// #if (defined(__ICL) && defined(_STLPORT_VERSION))
+// #define PHOENIX_OSTREAM ostream_withassign
+// #else
+ #define PHOENIX_OSTREAM PHOENIX_STD::ostream
+// #endif
+#endif
+
+//////////////////////////////////
+#if defined(__GNUC__) && (__GNUC__ < 3)
+// || (defined(__ICL) && defined(_STLPORT_VERSION))
+template <typename T1>
+struct binary_operator<shift_l_op, PHOENIX_OSTREAM, T1>
+{
+ typedef PHOENIX_STD::ostream& result_type;
+ static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs)
+ { return out << rhs; }
+};
+#endif
+
+//////////////////////////////////
+template <typename T1>
+struct binary_operator<shift_l_op, PHOENIX_STD::ostream, T1>
+{
+ typedef PHOENIX_STD::ostream& result_type;
+ static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs)
+ { return out << rhs; }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary3
+ <shift_l_op, variable<PHOENIX_OSTREAM>, BaseT>::type
+operator<<(PHOENIX_OSTREAM& _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary3
+ <shift_l_op, variable<PHOENIX_OSTREAM>, BaseT>
+ ::construct(var(_0), _1);
+}
+
+#undef PHOENIX_OSTREAM
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// specializations for std::strstream / stringstream
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T1>
+struct binary_operator<shift_r_op, PHOENIX_STD::PHOENIX_SSTREAM, T1>
+{
+ typedef PHOENIX_STD::istream& result_type;
+ static result_type eval(PHOENIX_STD::istream& out, T1& rhs)
+ { return out >> rhs; }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary3
+ <shift_r_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>::type
+operator>>(PHOENIX_STD::PHOENIX_SSTREAM& _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary3
+ <shift_r_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>
+ ::construct(var(_0), _1);
+}
+
+//////////////////////////////////
+template <typename T1>
+struct binary_operator<shift_l_op, PHOENIX_STD::PHOENIX_SSTREAM, T1>
+{
+ typedef PHOENIX_STD::ostream& result_type;
+ static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs)
+ { return out << rhs; }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary3
+ <shift_l_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>::type
+operator<<(PHOENIX_STD::PHOENIX_SSTREAM& _0, actor<BaseT> const& _1)
+{
+ return impl::make_binary3
+ <shift_l_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>
+ ::construct(var(_0), _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// I/O manipulator specializations
+//
+///////////////////////////////////////////////////////////////////////////////
+#if (!defined(__GNUC__) || (__GNUC__ > 2))
+// && !(defined(__ICL) && defined(_STLPORT_VERSION))
+
+typedef PHOENIX_STD::ios_base& (*iomanip_t)(PHOENIX_STD::ios_base&);
+typedef PHOENIX_STD::istream& (*imanip_t)(PHOENIX_STD::istream&);
+typedef PHOENIX_STD::ostream& (*omanip_t)(PHOENIX_STD::ostream&);
+
+#if defined(__BORLANDC__)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Borland does not like i/o manipulators functions such as endl to
+// be the rhs of a lazy << operator (Borland incorrectly reports
+// ambiguity). To get around the problem, we provide function
+// pointer versions of the same name with a single trailing
+// underscore.
+//
+// You can use the same trick for other i/o manipulators.
+// Alternatively, you can prefix the manipulator with a '&'
+// operator. Example:
+//
+// cout << arg1 << &endl
+//
+///////////////////////////////////////////////////////////////////////////////
+
+imanip_t ws_ = &PHOENIX_STD::ws;
+iomanip_t dec_ = &PHOENIX_STD::dec;
+iomanip_t hex_ = &PHOENIX_STD::hex;
+iomanip_t oct_ = &PHOENIX_STD::oct;
+omanip_t endl_ = &PHOENIX_STD::endl;
+omanip_t ends_ = &PHOENIX_STD::ends;
+omanip_t flush_ = &PHOENIX_STD::flush;
+
+#else // __BORLANDC__
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The following are overloads for I/O manipulators.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary1<shift_l_op, BaseT, imanip_t>::type
+operator>>(actor<BaseT> const& _0, imanip_t _1)
+{
+ return impl::make_binary1<shift_l_op, BaseT, imanip_t>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary1<shift_l_op, BaseT, iomanip_t>::type
+operator>>(actor<BaseT> const& _0, iomanip_t _1)
+{
+ return impl::make_binary1<shift_l_op, BaseT, iomanip_t>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary1<shift_l_op, BaseT, omanip_t>::type
+operator<<(actor<BaseT> const& _0, omanip_t _1)
+{
+ return impl::make_binary1<shift_l_op, BaseT, omanip_t>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary1<shift_l_op, BaseT, iomanip_t>::type
+operator<<(actor<BaseT> const& _0, iomanip_t _1)
+{
+ return impl::make_binary1<shift_l_op, BaseT, iomanip_t>::construct(_0, _1);
+}
+
+#endif // __BORLANDC__
+#endif // !defined(__GNUC__) || (__GNUC__ > 2)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// specializations for stl iterators and containers
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct unary_operator<dereference_op, T>
+{
+ typedef typename T::reference result_type;
+ static result_type eval(T const& iter)
+ { return *iter; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<index_op, T0, T1>
+{
+ typedef typename T0::reference result_type;
+ static result_type eval(T0& container, T1 const& index)
+ { return container[index]; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<index_op, T0 const, T1>
+{
+ typedef typename T0::const_reference result_type;
+ static result_type eval(T0 const& container, T1 const& index)
+ { return container[index]; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace phoenix
+
+#undef PHOENIX_SSTREAM
+#undef PHOENIX_STD
+#endif
diff --git a/boost/spirit/home/classic/phoenix/statements.hpp b/boost/spirit/home/classic/phoenix/statements.hpp
new file mode 100644
index 0000000000..25e6b1dd45
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/statements.hpp
@@ -0,0 +1,443 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENTS_HPP
+#define PHOENIX_STATEMENTS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/phoenix/composite.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// sequential_composite
+//
+// Two or more actors separated by the comma generates a
+// sequential_composite which is a composite actor. Example:
+//
+// actor,
+// actor,
+// actor
+//
+// The actors are evaluated sequentially. The result type of this
+// is void. Note that the last actor should not have a trailing
+// comma.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A0, typename A1>
+struct sequential_composite {
+
+ typedef sequential_composite<A0, A1> self_t;
+
+ template <typename TupleT>
+ struct result { typedef void type; };
+
+ sequential_composite(A0 const& _0, A1 const& _1)
+ : a0(_0), a1(_1) {}
+
+ template <typename TupleT>
+ void
+ eval(TupleT const& args) const
+ {
+ a0.eval(args);
+ a1.eval(args);
+ }
+
+ A0 a0; A1 a1; // actors
+};
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline actor<sequential_composite<actor<BaseT0>, actor<BaseT1> > >
+operator,(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+ return sequential_composite<actor<BaseT0>, actor<BaseT1> >(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// if_then_else_composite
+//
+// This composite has two (2) forms:
+//
+// if_(condition)
+// [
+// statement
+// ]
+//
+// and
+//
+// if_(condition)
+// [
+// true_statement
+// ]
+// .else_
+// [
+// false_statement
+// ]
+//
+// where condition is an actor that evaluates to bool. If condition
+// is true, the true_statement (again an actor) is executed
+// otherwise, the false_statement (another actor) is executed. The
+// result type of this is void. Note the trailing underscore after
+// if_ and the the leading dot and the trailing underscore before
+// and after .else_.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CondT, typename ThenT, typename ElseT>
+struct if_then_else_composite {
+
+ typedef if_then_else_composite<CondT, ThenT, ElseT> self_t;
+
+ template <typename TupleT>
+ struct result {
+
+ typedef void type;
+ };
+
+ if_then_else_composite(
+ CondT const& cond_,
+ ThenT const& then_,
+ ElseT const& else__)
+ : cond(cond_), then(then_), else_(else__) {}
+
+ template <typename TupleT>
+ void eval(TupleT const& args) const
+ {
+ if (cond.eval(args))
+ then.eval(args);
+ else
+ else_.eval(args);
+ }
+
+ CondT cond; ThenT then; ElseT else_; // actors
+};
+
+//////////////////////////////////
+template <typename CondT, typename ThenT>
+struct else_gen {
+
+ else_gen(CondT const& cond_, ThenT const& then_)
+ : cond(cond_), then(then_) {}
+
+ template <typename ElseT>
+ actor<if_then_else_composite<CondT, ThenT,
+ typename as_actor<ElseT>::type> >
+ operator[](ElseT const& else_)
+ {
+ typedef if_then_else_composite<CondT, ThenT,
+ typename as_actor<ElseT>::type>
+ result;
+
+ return result(cond, then, as_actor<ElseT>::convert(else_));
+ }
+
+ CondT cond; ThenT then;
+};
+
+//////////////////////////////////
+template <typename CondT, typename ThenT>
+struct if_then_composite {
+
+ typedef if_then_composite<CondT, ThenT> self_t;
+
+ template <typename TupleT>
+ struct result { typedef void type; };
+
+ if_then_composite(CondT const& cond_, ThenT const& then_)
+ : cond(cond_), then(then_), else_(cond, then) {}
+
+ template <typename TupleT>
+ void eval(TupleT const& args) const
+ {
+ if (cond.eval(args))
+ then.eval(args);
+ }
+
+ CondT cond; ThenT then; // actors
+ else_gen<CondT, ThenT> else_;
+};
+
+//////////////////////////////////
+template <typename CondT>
+struct if_gen {
+
+ if_gen(CondT const& cond_)
+ : cond(cond_) {}
+
+ template <typename ThenT>
+ actor<if_then_composite<
+ typename as_actor<CondT>::type,
+ typename as_actor<ThenT>::type> >
+ operator[](ThenT const& then) const
+ {
+ typedef if_then_composite<
+ typename as_actor<CondT>::type,
+ typename as_actor<ThenT>::type>
+ result;
+
+ return result(
+ as_actor<CondT>::convert(cond),
+ as_actor<ThenT>::convert(then));
+ }
+
+ CondT cond;
+};
+
+//////////////////////////////////
+template <typename CondT>
+inline if_gen<CondT>
+if_(CondT const& cond)
+{
+ return if_gen<CondT>(cond);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// while_composite
+//
+// This composite has the form:
+//
+// while_(condition)
+// [
+// statement
+// ]
+//
+// While the condition (an actor) evaluates to true, statement
+// (another actor) is executed. The result type of this is void.
+// Note the trailing underscore after while_.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CondT, typename DoT>
+struct while_composite {
+
+ typedef while_composite<CondT, DoT> self_t;
+
+ template <typename TupleT>
+ struct result { typedef void type; };
+
+ while_composite(CondT const& cond_, DoT const& do__)
+ : cond(cond_), do_(do__) {}
+
+ template <typename TupleT>
+ void eval(TupleT const& args) const
+ {
+ while (cond.eval(args))
+ do_.eval(args);
+ }
+
+ CondT cond;
+ DoT do_;
+};
+
+//////////////////////////////////
+template <typename CondT>
+struct while_gen {
+
+ while_gen(CondT const& cond_)
+ : cond(cond_) {}
+
+ template <typename DoT>
+ actor<while_composite<
+ typename as_actor<CondT>::type,
+ typename as_actor<DoT>::type> >
+ operator[](DoT const& do_) const
+ {
+ typedef while_composite<
+ typename as_actor<CondT>::type,
+ typename as_actor<DoT>::type>
+ result;
+
+ return result(
+ as_actor<CondT>::convert(cond),
+ as_actor<DoT>::convert(do_));
+ }
+
+ CondT cond;
+};
+
+//////////////////////////////////
+template <typename CondT>
+inline while_gen<CondT>
+while_(CondT const& cond)
+{
+ return while_gen<CondT>(cond);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// do_composite
+//
+// This composite has the form:
+//
+// do_
+// [
+// statement
+// ]
+// .while_(condition)
+//
+// While the condition (an actor) evaluates to true, statement
+// (another actor) is executed. The statement is executed at least
+// once. The result type of this is void. Note the trailing
+// underscore after do_ and the the leading dot and the trailing
+// underscore before and after .while_.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename DoT, typename CondT>
+struct do_composite {
+
+ typedef do_composite<DoT, CondT> self_t;
+
+ template <typename TupleT>
+ struct result { typedef void type; };
+
+ do_composite(DoT const& do__, CondT const& cond_)
+ : do_(do__), cond(cond_) {}
+
+ template <typename TupleT>
+ void eval(TupleT const& args) const
+ {
+ do
+ do_.eval(args);
+ while (cond.eval(args));
+ }
+
+ DoT do_;
+ CondT cond;
+};
+
+////////////////////////////////////
+template <typename DoT>
+struct do_gen2 {
+
+ do_gen2(DoT const& do__)
+ : do_(do__) {}
+
+ template <typename CondT>
+ actor<do_composite<
+ typename as_actor<DoT>::type,
+ typename as_actor<CondT>::type> >
+ while_(CondT const& cond) const
+ {
+ typedef do_composite<
+ typename as_actor<DoT>::type,
+ typename as_actor<CondT>::type>
+ result;
+
+ return result(
+ as_actor<DoT>::convert(do_),
+ as_actor<CondT>::convert(cond));
+ }
+
+ DoT do_;
+};
+
+////////////////////////////////////
+struct do_gen {
+
+ template <typename DoT>
+ do_gen2<DoT>
+ operator[](DoT const& do_) const
+ {
+ return do_gen2<DoT>(do_);
+ }
+};
+
+do_gen const do_ = do_gen();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// for_composite
+//
+// This statement has the form:
+//
+// for_(init, condition, step)
+// [
+// statement
+// ]
+//
+// Where init, condition, step and statement are all actors. init
+// is executed once before entering the for-loop. The for-loop
+// exits once condition evaluates to false. At each loop iteration,
+// step and statement is called. The result of this statement is
+// void. Note the trailing underscore after for_.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename InitT, typename CondT, typename StepT, typename DoT>
+struct for_composite {
+
+ typedef composite<InitT, CondT, StepT, DoT> self_t;
+
+ template <typename TupleT>
+ struct result { typedef void type; };
+
+ for_composite(
+ InitT const& init_,
+ CondT const& cond_,
+ StepT const& step_,
+ DoT const& do__)
+ : init(init_), cond(cond_), step(step_), do_(do__) {}
+
+ template <typename TupleT>
+ void
+ eval(TupleT const& args) const
+ {
+ for (init.eval(args); cond.eval(args); step.eval(args))
+ do_.eval(args);
+ }
+
+ InitT init; CondT cond; StepT step; DoT do_; // actors
+};
+
+//////////////////////////////////
+template <typename InitT, typename CondT, typename StepT>
+struct for_gen {
+
+ for_gen(
+ InitT const& init_,
+ CondT const& cond_,
+ StepT const& step_)
+ : init(init_), cond(cond_), step(step_) {}
+
+ template <typename DoT>
+ actor<for_composite<
+ typename as_actor<InitT>::type,
+ typename as_actor<CondT>::type,
+ typename as_actor<StepT>::type,
+ typename as_actor<DoT>::type> >
+ operator[](DoT const& do_) const
+ {
+ typedef for_composite<
+ typename as_actor<InitT>::type,
+ typename as_actor<CondT>::type,
+ typename as_actor<StepT>::type,
+ typename as_actor<DoT>::type>
+ result;
+
+ return result(
+ as_actor<InitT>::convert(init),
+ as_actor<CondT>::convert(cond),
+ as_actor<StepT>::convert(step),
+ as_actor<DoT>::convert(do_));
+ }
+
+ InitT init; CondT cond; StepT step;
+};
+
+//////////////////////////////////
+template <typename InitT, typename CondT, typename StepT>
+inline for_gen<InitT, CondT, StepT>
+for_(InitT const& init, CondT const& cond, StepT const& step)
+{
+ return for_gen<InitT, CondT, StepT>(init, cond, step);
+}
+
+} // namespace phoenix
+
+#endif
diff --git a/boost/spirit/home/classic/phoenix/tuple_helpers.hpp b/boost/spirit/home/classic/phoenix/tuple_helpers.hpp
new file mode 100644
index 0000000000..003d018f6c
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/tuple_helpers.hpp
@@ -0,0 +1,1075 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2002 Joel de Guzman
+ Copyright (c) 2002-2003 Hartmut Kaiser
+
+ Distributed under the 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 PHOENIX_TUPLEHELPERS_HPP
+#define PHOENIX_TUPLEHELPERS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <cassert>
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix
+{
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// make_tuple template class
+//
+// This template class is used to calculate a tuple type required to hold
+// the given template parameter type
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// normal (non-tuple types are wrapped into a tuple)
+template <typename ResultT>
+struct make_tuple {
+
+ typedef tuple<ResultT> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// nil_t is converted to an empty tuple type
+template <>
+struct make_tuple<nil_t> {
+
+ typedef tuple<> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// tuple types are left alone without any refactoring
+template <
+ typename A, typename B, typename C
+#if PHOENIX_LIMIT > 3
+ , typename D, typename E, typename F
+#if PHOENIX_LIMIT > 6
+ , typename G, typename H, typename I
+#if PHOENIX_LIMIT > 9
+ , typename J, typename K, typename L
+#if PHOENIX_LIMIT > 12
+ , typename M, typename N, typename O
+#endif
+#endif
+#endif
+#endif
+>
+struct make_tuple<tuple<A, B, C
+#if PHOENIX_LIMIT > 3
+ , D, E, F
+#if PHOENIX_LIMIT > 6
+ , G, H, I
+#if PHOENIX_LIMIT > 9
+ , J, K, L
+#if PHOENIX_LIMIT > 12
+ , M, N, O
+#endif
+#endif
+#endif
+#endif
+ > > {
+
+// the tuple parameter itself is the required tuple type
+ typedef tuple<A, B, C
+#if PHOENIX_LIMIT > 3
+ , D, E, F
+#if PHOENIX_LIMIT > 6
+ , G, H, I
+#if PHOENIX_LIMIT > 9
+ , J, K, L
+#if PHOENIX_LIMIT > 12
+ , M, N, O
+#endif
+#endif
+#endif
+#endif
+ > type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat_tuple type computer
+//
+// This class returns the type of a tuple, which is constructed by
+// concatenating a tuple with a given type
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TupleT, typename AppendT>
+struct concat_tuple;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <0 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename AppendT>
+struct concat_tuple<tuple<>, AppendT> {
+
+ typedef tuple<AppendT> type;
+};
+
+template <>
+struct concat_tuple<tuple<>, nil_t> {
+
+ typedef tuple<> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <1 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename AppendT>
+struct concat_tuple<tuple<A>, AppendT> {
+
+ typedef tuple<A, AppendT> type;
+};
+
+template <typename A>
+struct concat_tuple<tuple<A>, nil_t> {
+
+ typedef tuple<A> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <2 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B, typename AppendT>
+struct concat_tuple<tuple<A, B>, AppendT> {
+
+ typedef tuple<A, B, AppendT> type;
+};
+
+template <typename A, typename B>
+struct concat_tuple<tuple<A, B>, nil_t> {
+
+ typedef tuple<A, B> type;
+};
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <3 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C>, AppendT> {
+
+ typedef tuple<A, B, C, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C
+>
+struct concat_tuple<tuple<A, B, C>, nil_t> {
+
+ typedef tuple<A, B, C> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <4 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D>, AppendT> {
+
+ typedef tuple<A, B, C, D, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D
+>
+struct concat_tuple<tuple<A, B, C, D>, nil_t> {
+
+ typedef tuple<A, B, C, D> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <5 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E
+>
+struct concat_tuple<tuple<A, B, C, D, E>, nil_t> {
+
+ typedef tuple<A, B, C, D, E> type;
+};
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <6 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F
+>
+struct concat_tuple<tuple<A, B, C, D, E, F>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <7 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, G, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F, G> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <8 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F, G, H> type;
+};
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <9 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <10 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <11 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J, typename K,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, K, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J, typename K
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, K> type;
+};
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <12 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J, typename K, typename L,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J, typename K, typename L
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <13 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J, typename K, typename L,
+ typename M,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J, typename K, typename L,
+ typename M
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat tuple <14 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J, typename K, typename L,
+ typename M, typename N,
+ typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N>, AppendT> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, AppendT> type;
+};
+
+template <
+ typename A, typename B, typename C, typename D, typename E, typename F,
+ typename G, typename H, typename I, typename J, typename K, typename L,
+ typename M, typename N
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N>, nil_t> {
+
+ typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> type;
+};
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// concat_tuples type computer
+//
+// This template class returns the type of a tuple built from the
+// concatenation of two given tuples.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TupleT1, typename TupleT2, int N, typename AppendT>
+struct concat_tuple_element {
+
+ typedef
+ typename concat_tuple_element<
+ typename concat_tuple<TupleT1, AppendT>::type, TupleT2, N+1,
+ typename tuple_element<N+1, TupleT2>::type
+ >::type
+ type;
+};
+
+template <typename TupleT1, typename TupleT2, int N>
+struct concat_tuple_element<TupleT1, TupleT2, N, nil_t> {
+
+ typedef TupleT1 type;
+};
+
+template <typename TupleT1, typename TupleT2>
+struct concat_tuples {
+
+ typedef
+ typename concat_tuple_element<
+ TupleT1, TupleT2, 0,
+ typename tuple_element<0, TupleT2>::type
+ >::type
+ type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// convert_actors template function
+//
+// The convert_actors template functions constructs a new tuple object
+// composed of the elements returned by the actors contained in the
+// input tuple. (i.e. the given tuple type 'actor_tuple' contains a set
+// of actors to evaluate and the resulting tuple contains the results of
+// evaluating the actors.)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActorT, typename TupleT>
+struct actor_result; // forward declaration
+
+namespace impl
+{
+ template <unsigned N>
+ struct convert_actors_ {};
+}
+
+template <typename TupleResultT, typename ActorTupleT>
+TupleResultT
+convert_actors(ActorTupleT const& actor_tuple)
+{
+ BOOST_STATIC_ASSERT(ActorTupleT::length <= TupleResultT::length);
+ BOOST_STATIC_CONSTANT(int, length = TupleResultT::length);
+ return impl::convert_actors_<length>
+ ::template apply<TupleResultT, ActorTupleT>::do_(actor_tuple);
+}
+
+namespace impl
+{
+ template <int N, typename TupleResultT, typename ActorTupleT>
+ struct convert_actor
+ {
+ typedef typename tuple_element<N, TupleResultT>::type type;
+
+ template <bool C>
+ struct is_default_t {};
+ typedef is_default_t<true> is_default;
+ typedef is_default_t<false> is_not_default;
+
+ static type
+ actor_element(ActorTupleT const& /*actor_tuple*/, is_default)
+ {
+ return type(); // default construct
+ }
+
+ static type
+ actor_element(ActorTupleT const& actor_tuple, is_not_default)
+ {
+ BOOST_STATIC_ASSERT(ActorTupleT::length <= TupleResultT::length);
+ return actor_tuple[tuple_index<N>()](); // apply the actor
+ }
+
+ static type
+ do_(ActorTupleT const& actor_tuple)
+ {
+ return actor_element(
+ actor_tuple, is_default_t<(N >= ActorTupleT::length)>());
+ }
+ };
+
+ ///////////////////////////////////////
+ template <>
+ struct convert_actors_<1>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ ///////////////////////////////////////
+ template <>
+ struct convert_actors_<2>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ ///////////////////////////////////////
+ template <>
+ struct convert_actors_<3>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ #if PHOENIX_LIMIT > 3
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<4>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<5>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<6>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ #if PHOENIX_LIMIT > 6
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<7>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<8>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+ typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ , converter7::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<9>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+ typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+ typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ , converter7::do_(actor_tuple)
+ , converter8::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ #if PHOENIX_LIMIT > 9
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<10>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+ typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+ typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+ typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ , converter7::do_(actor_tuple)
+ , converter8::do_(actor_tuple)
+ , converter9::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<11>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+ typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+ typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+ typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+ typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ , converter7::do_(actor_tuple)
+ , converter8::do_(actor_tuple)
+ , converter9::do_(actor_tuple)
+ , converter10::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<12>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+ typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+ typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+ typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+ typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+ typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ , converter7::do_(actor_tuple)
+ , converter8::do_(actor_tuple)
+ , converter9::do_(actor_tuple)
+ , converter10::do_(actor_tuple)
+ , converter11::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ #if PHOENIX_LIMIT > 12
+
+ /////////////////////////////////////
+ template <>
+ struct convert_actors_<13>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+ typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+ typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+ typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+ typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+ typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
+ typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ , converter7::do_(actor_tuple)
+ , converter8::do_(actor_tuple)
+ , converter9::do_(actor_tuple)
+ , converter10::do_(actor_tuple)
+ , converter11::do_(actor_tuple)
+ , converter12::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ ///////////////////////////////////////
+ template <>
+ struct convert_actors_<14>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+ typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+ typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+ typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+ typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+ typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
+ typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
+ typedef impl::convert_actor<13, TupleResultT, ActorTupleT> converter13;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ , converter7::do_(actor_tuple)
+ , converter8::do_(actor_tuple)
+ , converter9::do_(actor_tuple)
+ , converter10::do_(actor_tuple)
+ , converter11::do_(actor_tuple)
+ , converter12::do_(actor_tuple)
+ , converter13::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ ///////////////////////////////////////
+ template <>
+ struct convert_actors_<15>
+ {
+ template <typename TupleResultT, typename ActorTupleT>
+ struct apply
+ {
+ static TupleResultT
+ do_(ActorTupleT const& actor_tuple)
+ {
+ typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+ typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+ typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+ typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+ typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+ typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+ typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+ typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+ typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+ typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+ typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+ typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
+ typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
+ typedef impl::convert_actor<13, TupleResultT, ActorTupleT> converter13;
+ typedef impl::convert_actor<14, TupleResultT, ActorTupleT> converter14;
+
+ using namespace tuple_index_names;
+ return TupleResultT(
+ converter0::do_(actor_tuple)
+ , converter1::do_(actor_tuple)
+ , converter2::do_(actor_tuple)
+ , converter3::do_(actor_tuple)
+ , converter4::do_(actor_tuple)
+ , converter5::do_(actor_tuple)
+ , converter6::do_(actor_tuple)
+ , converter7::do_(actor_tuple)
+ , converter8::do_(actor_tuple)
+ , converter9::do_(actor_tuple)
+ , converter10::do_(actor_tuple)
+ , converter11::do_(actor_tuple)
+ , converter12::do_(actor_tuple)
+ , converter13::do_(actor_tuple)
+ , converter14::do_(actor_tuple)
+ );
+ }
+ };
+ };
+
+ #endif
+ #endif
+ #endif
+ #endif
+} // namespace impl
+
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace phoenix
+
+#endif // PHOENIX_TUPLEHELPERS_HPP
diff --git a/boost/spirit/home/classic/phoenix/tuples.hpp b/boost/spirit/home/classic/phoenix/tuples.hpp
new file mode 100644
index 0000000000..50cec6bf3f
--- /dev/null
+++ b/boost/spirit/home/classic/phoenix/tuples.hpp
@@ -0,0 +1,1338 @@
+/*=============================================================================
+ Phoenix V1.2.1
+ Copyright (c) 2001-2002 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_TUPLES_HPP
+#define PHOENIX_TUPLES_HPP
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+#error "Sorry, Phoenix does not support VC6 and VC7. Please upgrade to at least VC7.1"
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Phoenix predefined maximum limit. This limit defines the maximum
+// number of elements a tuple can hold. This number defaults to 3. The
+// actual maximum is rounded up in multiples of 3. Thus, if this value
+// is 4, the actual limit is 6. The ultimate maximum limit in this
+// implementation is 15.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef PHOENIX_LIMIT
+#define PHOENIX_LIMIT 3
+#endif
+
+#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x561)
+namespace phoenix { namespace borland_only
+{
+ namespace ftors
+ {
+ // We define these dummy template functions. Borland complains when
+ // a template class has the same name as a template function,
+ // regardless if they are in different namespaces.
+
+ template <typename T> void if_(T) {}
+ template <typename T> void for_(T) {}
+ template <typename T> void while_(T) {}
+ template <typename T> void do_(T) {}
+ }
+
+ namespace tmpls
+ {
+ // We define these dummy template functions. Borland complains when
+ // a template class has the same name as a template function,
+ // regardless if they are in different namespaces.
+
+ template <typename T> struct if_ {};
+ template <typename T> struct for_ {};
+ template <typename T> struct while_ {};
+ template <typename T> struct do_ {};
+ }
+
+}} // namespace phoenix::borland_only
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/static_assert.hpp>
+#include <boost/call_traits.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple
+//
+// Tuples hold heterogeneous types up to a predefined maximum. Only
+// the most basic functionality needed is provided. Unlike other
+// recursive list-like tuple implementations, this tuple
+// implementation uses simple structs similar to std::pair with
+// specialization for 0 to N tuple elements.
+//
+// 1) Construction
+// Here are examples on how to construct tuples:
+//
+// typedef tuple<int, char> t1_t;
+// typedef tuple<int, std::string, double> t2_t;
+//
+// // this tuple has an int and char members
+// t1_t t1(3, 'c');
+//
+// // this tuple has an int, std::string and double members
+// t2_t t2(3, "hello", 3.14);
+//
+// Tuples can also be constructed from other tuples. The
+// source and destination tuples need not have exactly the
+// same element types. The only requirement is that the
+// source tuple have the same number of elements as the
+// destination and that each element slot in the
+// destination can be copy constructed from the source
+// element. For example:
+//
+// tuple<double, double> t3(t1); // OK. Compatible tuples
+// tuple<double, double> t4(t2); // Error! Incompatible tuples
+//
+// 2) Member access
+// A member in a tuple can be accessed using the
+// tuple's [] operator by specifying the Nth
+// tuple_index. Here are some examples:
+//
+// tuple_index<0> ix0; // 0th index == 1st item
+// tuple_index<1> ix1; // 1st index == 2nd item
+// tuple_index<2> ix2; // 2nd index == 3rd item
+//
+// t1[ix0] = 33; // sets the int member of the tuple t1
+// t2[ix2] = 6e6; // sets the double member of the tuple t2
+// t1[ix1] = 'a'; // sets the char member of the tuple t1
+//
+// There are some predefined names are provided in sub-
+// namespace tuple_index_names:
+//
+// tuple_index<0> _1;
+// tuple_index<1> _2;
+// ...
+// tuple_index<N> _N;
+//
+// These indexes may be used by 'using' namespace
+// phoenix::tuple_index_names.
+//
+// Access to out of bound indexes returns a nil_t value.
+//
+// 3) Member type inquiry
+// The type of an individual member can be queried.
+// Example:
+//
+// tuple_element<1, t2_t>::type
+//
+// Refers to the type of the second member (note zero based,
+// thus 0 = 1st item, 1 = 2nd item) of the tuple.
+//
+// Aside from tuple_element<N, T>::type, there are two
+// more types that tuple_element provides: rtype and
+// crtype. While 'type' is the plain underlying type,
+// 'rtype' is the reference type, or type& and 'crtype'
+// is the constant reference type or type const&. The
+// latter two are provided to make it easy for the
+// client in dealing with the possibility of reference
+// to reference when type is already a reference, which
+// is illegal in C++.
+//
+// Access to out of bound indexes returns a nil_t type.
+//
+// 4) Tuple length
+// The number of elements in a tuple can be queried.
+// Example:
+//
+// int n = t1.length;
+//
+// gets the number of elements in tuple t1.
+//
+// length is a static constant. Thus, TupleT::length
+// also works. Example:
+//
+// int n = t1_t::length;
+//
+///////////////////////////////////////////////////////////////////////////////
+struct nil_t {};
+using boost::remove_reference;
+using boost::call_traits;
+
+//////////////////////////////////
+namespace impl {
+
+ template <typename T>
+ struct access {
+
+ typedef const T& ctype;
+ typedef T& type;
+ };
+
+ template <typename T>
+ struct access<T&> {
+
+ typedef T& ctype;
+ typedef T& type;
+ };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple_element
+//
+// A query class that gets the Nth element inside a tuple.
+// Examples:
+//
+// tuple_element<1, tuple<int, char, void*> >::type // plain
+// tuple_element<1, tuple<int, char, void*> >::rtype // ref
+// tuple_element<1, tuple<int, char, void*> >::crtype // const ref
+//
+// Has type char which is the 2nd type in the tuple
+// (note zero based, thus 0 = 1st item, 1 = 2nd item).
+//
+// Given a tuple object, the static function tuple_element<N,
+// TupleT>::get(tuple) gets the Nth element in the tuple. The
+// tuple class' tuple::operator[] uses this to get its Nth
+// element.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <int N, typename TupleT>
+struct tuple_element
+{
+ typedef nil_t type;
+ typedef nil_t& rtype;
+ typedef nil_t const& crtype;
+
+ static nil_t get(TupleT const& t) { return nil_t(); }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<0, TupleT>
+{
+ typedef typename TupleT::a_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.a; }
+ static crtype get(TupleT const& t) { return t.a; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<1, TupleT>
+{
+ typedef typename TupleT::b_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.b; }
+ static crtype get(TupleT const& t) { return t.b; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<2, TupleT>
+{
+ typedef typename TupleT::c_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.c; }
+ static crtype get(TupleT const& t) { return t.c; }
+};
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<3, TupleT>
+{
+ typedef typename TupleT::d_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.d; }
+ static crtype get(TupleT const& t) { return t.d; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<4, TupleT>
+{
+ typedef typename TupleT::e_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.e; }
+ static crtype get(TupleT const& t) { return t.e; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<5, TupleT>
+{
+ typedef typename TupleT::f_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.f; }
+ static crtype get(TupleT const& t) { return t.f; }
+};
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<6, TupleT>
+{
+ typedef typename TupleT::g_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.g; }
+ static crtype get(TupleT const& t) { return t.g; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<7, TupleT>
+{
+ typedef typename TupleT::h_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.h; }
+ static crtype get(TupleT const& t) { return t.h; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<8, TupleT>
+{
+ typedef typename TupleT::i_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.i; }
+ static crtype get(TupleT const& t) { return t.i; }
+};
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<9, TupleT>
+{
+ typedef typename TupleT::j_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.j; }
+ static crtype get(TupleT const& t) { return t.j; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<10, TupleT>
+{
+ typedef typename TupleT::k_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.k; }
+ static crtype get(TupleT const& t) { return t.k; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<11, TupleT>
+{
+ typedef typename TupleT::l_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.l; }
+ static crtype get(TupleT const& t) { return t.l; }
+};
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<12, TupleT>
+{
+ typedef typename TupleT::m_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.m; }
+ static crtype get(TupleT const& t) { return t.m; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<13, TupleT>
+{
+ typedef typename TupleT::n_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.n; }
+ static crtype get(TupleT const& t) { return t.n; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<14, TupleT>
+{
+ typedef typename TupleT::o_type type;
+ typedef typename impl::access<type>::type rtype;
+ typedef typename impl::access<type>::ctype crtype;
+
+ static rtype get(TupleT& t) { return t.o; }
+ static crtype get(TupleT const& t) { return t.o; }
+};
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple forward declaration.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A = nil_t
+ , typename B = nil_t
+ , typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+ , typename D = nil_t
+ , typename E = nil_t
+ , typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+ , typename G = nil_t
+ , typename H = nil_t
+ , typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+ , typename J = nil_t
+ , typename K = nil_t
+ , typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+ , typename M = nil_t
+ , typename N = nil_t
+ , typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+ , typename NU = nil_t // Not used
+>
+struct tuple;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple_index
+//
+// This class wraps an integer in a type to be used for indexing
+// the Nth element in a tuple. See tuple operator[]. Some
+// predefined names are provided in sub-namespace
+// tuple_index_names.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <int N>
+struct tuple_index {};
+
+//////////////////////////////////
+namespace tuple_index_names {
+
+ tuple_index<0> const _1 = tuple_index<0>();
+ tuple_index<1> const _2 = tuple_index<1>();
+ tuple_index<2> const _3 = tuple_index<2>();
+
+#if PHOENIX_LIMIT > 3
+ tuple_index<3> const _4 = tuple_index<3>();
+ tuple_index<4> const _5 = tuple_index<4>();
+ tuple_index<5> const _6 = tuple_index<5>();
+
+#if PHOENIX_LIMIT > 6
+ tuple_index<6> const _7 = tuple_index<6>();
+ tuple_index<7> const _8 = tuple_index<7>();
+ tuple_index<8> const _9 = tuple_index<8>();
+
+#if PHOENIX_LIMIT > 9
+ tuple_index<9> const _10 = tuple_index<9>();
+ tuple_index<10> const _11 = tuple_index<10>();
+ tuple_index<11> const _12 = tuple_index<11>();
+
+#if PHOENIX_LIMIT > 12
+ tuple_index<12> const _13 = tuple_index<12>();
+ tuple_index<13> const _14 = tuple_index<13>();
+ tuple_index<14> const _15 = tuple_index<14>();
+
+#endif
+#endif
+#endif
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple_common class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename DerivedT>
+struct tuple_base {
+
+ typedef nil_t a_type;
+ typedef nil_t b_type;
+ typedef nil_t c_type;
+
+#if PHOENIX_LIMIT > 3
+ typedef nil_t d_type;
+ typedef nil_t e_type;
+ typedef nil_t f_type;
+
+#if PHOENIX_LIMIT > 6
+ typedef nil_t g_type;
+ typedef nil_t h_type;
+ typedef nil_t i_type;
+
+#if PHOENIX_LIMIT > 9
+ typedef nil_t j_type;
+ typedef nil_t k_type;
+ typedef nil_t l_type;
+
+#if PHOENIX_LIMIT > 12
+ typedef nil_t m_type;
+ typedef nil_t n_type;
+ typedef nil_t o_type;
+
+#endif
+#endif
+#endif
+#endif
+
+ template <int N>
+ typename tuple_element<N, DerivedT>::crtype
+ operator[](tuple_index<N>) const
+ {
+ return tuple_element<N, DerivedT>
+ ::get(*static_cast<DerivedT const*>(this));
+ }
+
+ template <int N>
+ typename tuple_element<N, DerivedT>::rtype
+ operator[](tuple_index<N>)
+ {
+ return tuple_element<N, DerivedT>
+ ::get(*static_cast<DerivedT*>(this));
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <0 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <>
+struct tuple<>
+: public tuple_base<tuple<> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 0);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <1 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A>
+struct tuple<A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 1);
+ typedef A a_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_
+ ): a(a_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <2 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B>
+struct tuple<A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 2);
+ typedef A a_type; typedef B b_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_
+ ): a(a_), b(b_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <3 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B, typename C>
+struct tuple<A, B, C,
+#if PHOENIX_LIMIT > 3
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 3);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_
+ ): a(a_), b(b_), c(c_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c;
+};
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <4 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B, typename C, typename D>
+struct tuple<A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 4);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_
+ ): a(a_), b(b_), c(c_), d(d_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <5 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B, typename C, typename D, typename E>
+struct tuple<A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D, E> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 5);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <6 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F>
+struct tuple<A, B, C, D, E, F,
+#if PHOENIX_LIMIT > 6
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D, E, F> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 6);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f;
+};
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <7 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G>
+struct tuple<A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D, E, F, G> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 7);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <8 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H>
+struct tuple<A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D, E, F, G, H> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 8);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type; typedef H h_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_,
+ typename call_traits<H>::param_type h_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()]), h(init[tuple_index<7>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g; H h;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <9 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I>
+struct tuple<A, B, C, D, E, F, G, H, I,
+#if PHOENIX_LIMIT > 9
+ nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D, E, F, G, H, I> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 9);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type; typedef H h_type;
+ typedef I i_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_,
+ typename call_traits<H>::param_type h_,
+ typename call_traits<I>::param_type i_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+ i(init[tuple_index<8>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g; H h; I i;
+};
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <10 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J>
+struct tuple<A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 10);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type; typedef H h_type;
+ typedef I i_type; typedef J j_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_,
+ typename call_traits<H>::param_type h_,
+ typename call_traits<I>::param_type i_,
+ typename call_traits<J>::param_type j_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+ i(init[tuple_index<8>()]), j(init[tuple_index<9>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g; H h; I i; J j;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <11 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 11);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type; typedef H h_type;
+ typedef I i_type; typedef J j_type;
+ typedef K k_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_,
+ typename call_traits<H>::param_type h_,
+ typename call_traits<I>::param_type i_,
+ typename call_traits<J>::param_type j_,
+ typename call_traits<K>::param_type k_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+ i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+ k(init[tuple_index<10>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g; H h; I i; J j;
+ K k;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <12 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, L,
+#if PHOENIX_LIMIT > 12
+ nil_t, nil_t, nil_t,
+#endif
+ nil_t // Unused
+>
+: public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K, L> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 12);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type; typedef H h_type;
+ typedef I i_type; typedef J j_type;
+ typedef K k_type; typedef L l_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_,
+ typename call_traits<H>::param_type h_,
+ typename call_traits<I>::param_type i_,
+ typename call_traits<J>::param_type j_,
+ typename call_traits<K>::param_type k_,
+ typename call_traits<L>::param_type l_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_), l(l_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+ i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+ k(init[tuple_index<10>()]), l(init[tuple_index<11>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g; H h; I i; J j;
+ K k; L l;
+};
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <13 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t>
+: public tuple_base<
+ tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 13);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type; typedef H h_type;
+ typedef I i_type; typedef J j_type;
+ typedef K k_type; typedef L l_type;
+ typedef M m_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_,
+ typename call_traits<H>::param_type h_,
+ typename call_traits<I>::param_type i_,
+ typename call_traits<J>::param_type j_,
+ typename call_traits<K>::param_type k_,
+ typename call_traits<L>::param_type l_,
+ typename call_traits<M>::param_type m_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_), l(l_), m(m_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+ i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+ k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
+ m(init[tuple_index<12>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g; H h; I i; J j;
+ K k; L l; M m;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <14 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t>
+: public tuple_base<
+ tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 14);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type; typedef H h_type;
+ typedef I i_type; typedef J j_type;
+ typedef K k_type; typedef L l_type;
+ typedef M m_type; typedef N n_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_,
+ typename call_traits<H>::param_type h_,
+ typename call_traits<I>::param_type i_,
+ typename call_traits<J>::param_type j_,
+ typename call_traits<K>::param_type k_,
+ typename call_traits<L>::param_type l_,
+ typename call_traits<M>::param_type m_,
+ typename call_traits<N>::param_type n_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_), l(l_), m(m_), n(n_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+ i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+ k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
+ m(init[tuple_index<12>()]), n(init[tuple_index<13>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g; H h; I i; J j;
+ K k; L l; M m; N n;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tuple <15 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename A, typename B, typename C, typename D, typename E,
+ typename F, typename G, typename H, typename I, typename J,
+ typename K, typename L, typename M, typename N, typename O>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t>
+: public tuple_base<
+ tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> > {
+
+ BOOST_STATIC_CONSTANT(int, length = 15);
+ typedef A a_type; typedef B b_type;
+ typedef C c_type; typedef D d_type;
+ typedef E e_type; typedef F f_type;
+ typedef G g_type; typedef H h_type;
+ typedef I i_type; typedef J j_type;
+ typedef K k_type; typedef L l_type;
+ typedef M m_type; typedef N n_type;
+ typedef O o_type;
+
+ tuple() {}
+
+ tuple(
+ typename call_traits<A>::param_type a_,
+ typename call_traits<B>::param_type b_,
+ typename call_traits<C>::param_type c_,
+ typename call_traits<D>::param_type d_,
+ typename call_traits<E>::param_type e_,
+ typename call_traits<F>::param_type f_,
+ typename call_traits<G>::param_type g_,
+ typename call_traits<H>::param_type h_,
+ typename call_traits<I>::param_type i_,
+ typename call_traits<J>::param_type j_,
+ typename call_traits<K>::param_type k_,
+ typename call_traits<L>::param_type l_,
+ typename call_traits<M>::param_type m_,
+ typename call_traits<N>::param_type n_,
+ typename call_traits<O>::param_type o_
+ ): a(a_), b(b_), c(c_), d(d_), e(e_),
+ f(f_), g(g_), h(h_), i(i_), j(j_),
+ k(k_), l(l_), m(m_), n(n_), o(o_) {}
+
+ template <typename TupleT>
+ tuple(TupleT const& init)
+ : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+ c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+ e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+ g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+ i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+ k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
+ m(init[tuple_index<12>()]), n(init[tuple_index<13>()]),
+ o(init[tuple_index<14>()])
+ { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+ A a; B b; C c; D d; E e;
+ F f; G g; H h; I i; J j;
+ K k; L l; M m; N n; O o;
+};
+
+#endif
+#endif
+#endif
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace phoenix
+
+#endif
diff --git a/boost/spirit/home/classic/symbols.hpp b/boost/spirit/home/classic/symbols.hpp
new file mode 100644
index 0000000000..d65d70b2a7
--- /dev/null
+++ b/boost/spirit/home/classic/symbols.hpp
@@ -0,0 +1,21 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SYMBOLS_MAIN_HPP)
+#define BOOST_SPIRIT_SYMBOLS_MAIN_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Master header for Spirit.Symbols
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/home/classic/symbols/symbols.hpp>
+
+#endif // !defined(BOOST_SPIRIT_SYMBOLS_MAIN_HPP)
diff --git a/boost/spirit/home/classic/symbols/impl/symbols.ipp b/boost/spirit/home/classic/symbols/impl/symbols.ipp
new file mode 100644
index 0000000000..561341a16c
--- /dev/null
+++ b/boost/spirit/home/classic/symbols/impl/symbols.ipp
@@ -0,0 +1,118 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_SYMBOLS_IPP
+#define BOOST_SPIRIT_SYMBOLS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/symbols/impl/tst.ipp>
+#include <boost/detail/workaround.hpp>
+
+// MSVC: void warning about the use of 'this' pointer in constructors
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable : 4355)
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// symbols class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline symbols<T, CharT, SetT>::symbols()
+: SetT()
+, add(*this)
+{
+}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+symbols<T, CharT, SetT>::symbols(symbols const& other)
+: SetT(other)
+// Tru64 CXX seems to be confused by the explicit call of the default
+// constructor and generates wrong code which invalidates the just contructed
+// first base class in the line above.
+#if !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590041))
+, parser<symbols<T, CharT, SetT> >()
+#endif
+, add(*this)
+{
+}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline symbols<T, CharT, SetT>::~symbols()
+{}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline symbols<T, CharT, SetT>&
+symbols<T, CharT, SetT>::operator=(symbols const& other)
+{
+ SetT::operator=(other);
+ return *this;
+}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline symbol_inserter<T, SetT> const&
+symbols<T, CharT, SetT>::operator=(CharT const* str)
+{
+ return add, str;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Symbol table utilities
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline T*
+find(symbols<T, CharT, SetT> const& table, CharT const* sym)
+{
+ CharT const* last = sym;
+ while (*last)
+ last++;
+ scanner<CharT const *> scan(sym, last);
+ T* result = table.find(scan);
+ return scan.at_end()? result: 0;
+}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline T*
+add(symbols<T, CharT, SetT>& table, CharT const* sym, T const& data)
+{
+ CharT const* first = sym;
+ CharT const* last = sym;
+ while (*last)
+ last++;
+ scanner<CharT const *> scan(first, last);
+ if (table.find(scan) && scan.at_end())
+ return 0; // symbol already contained in symbol table
+ table.add(sym, last, data);
+ first = sym;
+ return table.find(scan); // refind the inserted symbol
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/classic/symbols/impl/tst.ipp b/boost/spirit/home/classic/symbols/impl/tst.ipp
new file mode 100644
index 0000000000..1a4a0c1052
--- /dev/null
+++ b/boost/spirit/home/classic/symbols/impl/tst.ipp
@@ -0,0 +1,281 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_TST_IPP
+#define BOOST_SPIRIT_TST_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <memory> // for std::auto_ptr
+#include <boost/spirit/home/classic/core/assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl
+ {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tst class
+//
+// Ternary Search Tree implementation. The data structure is faster than
+// hashing for many typical search problems especially when the search
+// interface is iterator based. Searching for a string of length k in a
+// ternary search tree with n strings will require at most O(log n+k)
+// character comparisons. TSTs are many times faster than hash tables
+// for unsuccessful searches since mismatches are discovered earlier
+// after examining only a few characters. Hash tables always examine an
+// entire key when searching.
+//
+// For details see http://www.cs.princeton.edu/~rs/strings/.
+//
+// *** This is a low level class and is
+// not meant for public consumption ***
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <typename T, typename CharT>
+ struct tst_node
+ {
+ tst_node(CharT value_)
+ : value(value_)
+ , left(0)
+ , right(0)
+ { middle.link = 0; }
+
+ ~tst_node()
+ {
+ delete left;
+ delete right;
+ if (value)
+ delete middle.link;
+ else
+ delete middle.data;
+ }
+
+ tst_node*
+ clone() const
+ {
+ std::auto_ptr<tst_node> copy(new tst_node(value));
+
+ if (left)
+ copy->left = left->clone();
+ if (right)
+ copy->right = right->clone();
+
+ if (value && middle.link)
+ {
+ copy->middle.link = middle.link->clone();
+ }
+ else
+ {
+ std::auto_ptr<T> mid_data(new T(*middle.data));
+ copy->middle.data = mid_data.release();
+ }
+
+ return copy.release();
+ }
+
+ union center {
+
+ tst_node* link;
+ T* data;
+ };
+
+ CharT value;
+ tst_node* left;
+ center middle;
+ tst_node* right;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename CharT>
+ class tst
+ {
+ public:
+
+ struct search_info
+ {
+ T* data;
+ std::size_t length;
+ };
+
+ tst()
+ : root(0) {}
+
+ tst(tst const& other)
+ : root(other.root ? other.root->clone() : 0) {}
+
+ ~tst()
+ { delete root; }
+
+ tst&
+ operator=(tst const& other)
+ {
+ if (this != &other)
+ {
+ node_t* new_root = other.root ? other.root->clone() : 0;
+ delete root;
+ root = new_root;
+ }
+ return *this;
+ }
+
+ template <typename IteratorT>
+ T* add(IteratorT first, IteratorT const& last, T const& data)
+ {
+ if (first == last)
+ return 0;
+
+ node_t** np = &root;
+ CharT ch = *first;
+
+ BOOST_SPIRIT_ASSERT((first == last || ch != 0)
+ && "Won't add string containing null character");
+
+ for (;;)
+ {
+ if (*np == 0 || ch == 0)
+ {
+ node_t* right = 0;
+ if (np != 0)
+ right = *np;
+ *np = new node_t(ch);
+ if (right)
+ (**np).right = right;
+ }
+
+ if (ch < (**np).value)
+ {
+ np = &(**np).left;
+ }
+ else
+ {
+ if (ch == (**np).value)
+ {
+ if (ch == 0)
+ {
+ if ((**np).middle.data == 0)
+ {
+ (**np).middle.data = new T(data);
+ return (**np).middle.data;
+ }
+ else
+ {
+ // re-addition is disallowed
+ return 0;
+ }
+ }
+ ++first;
+ ch = (first == last) ? CharT(0) : *first;
+ BOOST_SPIRIT_ASSERT((first == last || ch != 0)
+ && "Won't add string containing null character");
+ np = &(**np).middle.link;
+ }
+ else
+ {
+ np = &(**np).right;
+ }
+ }
+ }
+ }
+
+ template <typename ScannerT>
+ search_info find(ScannerT const& scan) const
+ {
+ search_info result = { 0, 0 };
+ if (scan.at_end()) {
+ return result;
+ }
+
+ typedef typename ScannerT::iterator_t iterator_t;
+ node_t* np = root;
+ CharT ch = *scan;
+ iterator_t save = scan.first;
+ iterator_t latest = scan.first;
+ std::size_t latest_len = 0;
+
+ while (np)
+ {
+
+ if (ch < np->value) // => go left!
+ {
+ if (np->value == 0)
+ {
+ result.data = np->middle.data;
+ if (result.data)
+ {
+ latest = scan.first;
+ latest_len = result.length;
+ }
+ }
+
+ np = np->left;
+ }
+ else if (ch == np->value) // => go middle!
+ {
+ // Matching the null character is not allowed.
+ if (np->value == 0)
+ {
+ result.data = np->middle.data;
+ if (result.data)
+ {
+ latest = scan.first;
+ latest_len = result.length;
+ }
+ break;
+ }
+
+ ++scan;
+ ch = scan.at_end() ? CharT(0) : *scan;
+ np = np->middle.link;
+ ++result.length;
+ }
+ else // (ch > np->value) => go right!
+ {
+ if (np->value == 0)
+ {
+ result.data = np->middle.data;
+ if (result.data)
+ {
+ latest = scan.first;
+ latest_len = result.length;
+ }
+ }
+
+ np = np->right;
+ }
+ }
+
+ if (result.data == 0)
+ {
+ scan.first = save;
+ }
+ else
+ {
+ scan.first = latest;
+ result.length = latest_len;
+ }
+ return result;
+ }
+
+ private:
+
+ typedef tst_node<T, CharT> node_t;
+ node_t* root;
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+ } // namespace impl
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/symbols/symbols.hpp b/boost/spirit/home/classic/symbols/symbols.hpp
new file mode 100644
index 0000000000..8605585685
--- /dev/null
+++ b/boost/spirit/home/classic/symbols/symbols.hpp
@@ -0,0 +1,229 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SYMBOLS_HPP
+#define BOOST_SPIRIT_SYMBOLS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <string>
+
+#include <boost/ref.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/directives.hpp>
+
+#include <boost/spirit/home/classic/symbols/symbols_fwd.hpp>
+
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// symbols class
+//
+// This class implements a symbol table. The symbol table holds a
+// dictionary of symbols where each symbol is a sequence of CharTs.
+// The template class can work efficiently with 8, 16 and 32 bit
+// characters. Mutable data of type T is associated with each
+// symbol.
+//
+// The class is a parser. The parse member function returns
+// additional information in the symbol_match class (see below).
+// The additional data is a pointer to some data associated with
+// the matching symbol.
+//
+// The actual set implementation is supplied by the SetT template
+// parameter. By default, this uses the tst class (see tst.ipp).
+//
+// Symbols are added into the symbol table statically using the
+// construct:
+//
+// sym = a, b, c, d ...;
+//
+// where sym is a symbol table and a..d are strings. Example:
+//
+// sym = "pineapple", "orange", "banana", "apple";
+//
+// Alternatively, symbols may be added dynamically through the
+// member functor 'add' (see symbol_inserter below). The member
+// functor 'add' may be attached to a parser as a semantic action
+// taking in a begin/end pair:
+//
+// p[sym.add]
+//
+// where p is a parser (and sym is a symbol table). On success,
+// the matching portion of the input is added to the symbol table.
+//
+// 'add' may also be used to directly initialize data. Examples:
+//
+// sym.add("hello", 1)("crazy", 2)("world", 3);
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+class symbols
+: private SetT
+, public parser<symbols<T, CharT, SetT> >
+{
+public:
+
+ typedef parser<symbols<T, CharT, SetT> > parser_base_t;
+ typedef symbols<T, CharT, SetT> self_t;
+ typedef self_t const& embed_t;
+ typedef T symbol_data_t;
+ typedef boost::reference_wrapper<T> symbol_ref_t;
+
+ symbols();
+ symbols(symbols const& other);
+ ~symbols();
+
+ symbols&
+ operator=(symbols const& other);
+
+ symbol_inserter<T, SetT> const&
+ operator=(CharT const* str);
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, symbol_ref_t>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse_main(ScannerT const& scan) const
+ {
+ typedef typename ScannerT::iterator_t iterator_t;
+ iterator_t first = scan.first;
+ typename SetT::search_info result = SetT::find(scan);
+
+ if (result.data)
+ return scan.
+ create_match(
+ result.length,
+ symbol_ref_t(*result.data),
+ first,
+ scan.first);
+ else
+ return scan.no_match();
+ }
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::implicit_lexeme_parse<result_t>
+ (*this, scan, scan);
+ }
+
+ template < typename ScannerT >
+ T* find(ScannerT const& scan) const
+ { return SetT::find(scan).data; }
+
+ symbol_inserter<T, SetT> const add;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Symbol table utilities
+//
+// add
+//
+// adds a symbol 'sym' (string) to a symbol table 'table' plus an
+// optional data 'data' associated with the symbol. Returns a pointer to
+// the data associated with the symbol or NULL if add failed (e.g. when
+// the symbol is already added before).
+//
+// find
+//
+// finds a symbol 'sym' (string) from a symbol table 'table'. Returns a
+// pointer to the data associated with the symbol or NULL if not found
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+T* add(symbols<T, CharT, SetT>& table, CharT const* sym, T const& data = T());
+
+template <typename T, typename CharT, typename SetT>
+T* find(symbols<T, CharT, SetT> const& table, CharT const* sym);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// symbol_inserter class
+//
+// The symbols class holds an instance of this class named 'add'.
+// This can be called directly just like a member function,
+// passing in a first/last iterator and optional data:
+//
+// sym.add(first, last, data);
+//
+// Or, passing in a C string and optional data:
+//
+// sym.add(c_string, data);
+//
+// where sym is a symbol table. The 'data' argument is optional.
+// This may also be used as a semantic action since it conforms
+// to the action interface (see action.hpp):
+//
+// p[sym.add]
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename SetT>
+class symbol_inserter
+{
+public:
+
+ symbol_inserter(SetT& set_)
+ : set(set_) {}
+
+ typedef symbol_inserter const & result_type;
+
+ template <typename IteratorT>
+ symbol_inserter const&
+ operator()(IteratorT first, IteratorT const& last, T const& data = T()) const
+ {
+ set.add(first, last, data);
+ return *this;
+ }
+
+ template <typename CharT>
+ symbol_inserter const&
+ operator()(CharT const* str, T const& data = T()) const
+ {
+ CharT const* last = str;
+ while (*last)
+ last++;
+ set.add(str, last, data);
+ return *this;
+ }
+
+ template <typename CharT>
+ symbol_inserter const&
+ operator,(CharT const* str) const
+ {
+ CharT const* last = str;
+ while (*last)
+ last++;
+ set.add(str, last, T());
+ return *this;
+ }
+
+private:
+
+ SetT& set;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#include <boost/spirit/home/classic/symbols/impl/symbols.ipp>
+#endif
diff --git a/boost/spirit/home/classic/symbols/symbols_fwd.hpp b/boost/spirit/home/classic/symbols/symbols_fwd.hpp
new file mode 100644
index 0000000000..402c319aed
--- /dev/null
+++ b/boost/spirit/home/classic/symbols/symbols_fwd.hpp
@@ -0,0 +1,39 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SYMBOLS_FWD_HPP)
+#define BOOST_SPIRIT_SYMBOLS_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl
+ {
+ template <typename CharT, typename T>
+ class tst;
+ }
+
+ template
+ <
+ typename T = int,
+ typename CharT = char,
+ typename SetT = impl::tst<T, CharT>
+ >
+ class symbols;
+
+ template <typename T, typename SetT>
+ class symbol_inserter;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/symbols/typeof.hpp b/boost/spirit/home/classic/symbols/typeof.hpp
new file mode 100644
index 0000000000..c1631102a9
--- /dev/null
+++ b/boost/spirit/home/classic/symbols/typeof.hpp
@@ -0,0 +1,25 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_SYMBOLS_TYPEOF_HPP)
+#define BOOST_SPIRIT_SYMBOLS_TYPEOF_HPP
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/spirit/home/classic/symbols/symbols_fwd.hpp>
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::symbols,3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::symbol_inserter,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::impl::tst,2)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::symbols,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::symbols,1)
+
+#endif
+
diff --git a/boost/spirit/home/classic/tree/ast.hpp b/boost/spirit/home/classic/tree/ast.hpp
new file mode 100644
index 0000000000..0aa59f6dc7
--- /dev/null
+++ b/boost/spirit/home/classic/tree/ast.hpp
@@ -0,0 +1,387 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2001-2007 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_TREE_AST_HPP
+#define BOOST_SPIRIT_TREE_AST_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/tree/common.hpp>
+#include <boost/spirit/home/classic/core/scanner/scanner.hpp>
+
+#include <boost/spirit/home/classic/tree/ast_fwd.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+//////////////////////////////////
+// ast_match_policy is simply an id so the correct specialization of
+// tree_policy can be found.
+template <
+ typename IteratorT,
+ typename NodeFactoryT,
+ typename T
+>
+struct ast_match_policy :
+ public common_tree_match_policy<
+ ast_match_policy<IteratorT, NodeFactoryT, T>,
+ IteratorT,
+ NodeFactoryT,
+ ast_tree_policy<
+ ast_match_policy<IteratorT, NodeFactoryT, T>,
+ NodeFactoryT,
+ T
+ >,
+ T
+ >
+{
+ typedef
+ common_tree_match_policy<
+ ast_match_policy<IteratorT, NodeFactoryT, T>,
+ IteratorT,
+ NodeFactoryT,
+ ast_tree_policy<
+ ast_match_policy<IteratorT, NodeFactoryT, T>,
+ NodeFactoryT,
+ T
+ >,
+ T
+ >
+ common_tree_match_policy_;
+
+ ast_match_policy()
+ {
+ }
+
+ template <typename PolicyT>
+ ast_match_policy(PolicyT const & policies)
+ : common_tree_match_policy_(policies)
+ {
+ }
+};
+
+//////////////////////////////////
+template <typename MatchPolicyT, typename NodeFactoryT, typename T>
+struct ast_tree_policy :
+ public common_tree_tree_policy<MatchPolicyT, NodeFactoryT>
+{
+ typedef typename MatchPolicyT::match_t match_t;
+ typedef typename MatchPolicyT::iterator_t iterator_t;
+
+ template<typename MatchAT, typename MatchBT>
+ static void concat(MatchAT& a, MatchBT const& b)
+ {
+ BOOST_SPIRIT_ASSERT(a && b);
+
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+ BOOST_SPIRIT_DEBUG_OUT << "\n>>>AST concat. a = " << a <<
+ "\n\tb = " << b << "<<<\n";
+#endif
+ typedef typename tree_match<iterator_t, NodeFactoryT, T>::container_t
+ container_t;
+
+ // test for size() is nessecary, because no_tree_gen_node leaves a.trees
+ // and/or b.trees empty
+ if (0 != b.trees.size() && b.trees.begin()->value.is_root())
+ {
+ BOOST_SPIRIT_ASSERT(b.trees.size() == 1);
+
+ container_t tmp;
+ std::swap(a.trees, tmp); // save a into tmp
+ std::swap(b.trees, a.trees); // make b.trees[0] be new root (a.trees[0])
+ container_t* pnon_root_trees = &a.trees;
+ while (pnon_root_trees->size() > 0 &&
+ pnon_root_trees->begin()->value.is_root())
+ {
+ pnon_root_trees = & pnon_root_trees->begin()->children;
+ }
+ pnon_root_trees->insert(pnon_root_trees->begin(),
+ tmp.begin(), tmp.end());
+ }
+ else if (0 != a.trees.size() && a.trees.begin()->value.is_root())
+ {
+ BOOST_SPIRIT_ASSERT(a.trees.size() == 1);
+
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ a.trees.begin()->children.reserve(a.trees.begin()->children.size() + b.trees.size());
+#endif
+ std::copy(b.trees.begin(),
+ b.trees.end(),
+ std::back_insert_iterator<container_t>(
+ a.trees.begin()->children));
+ }
+ else
+ {
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ a.trees.reserve(a.trees.size() + b.trees.size());
+#endif
+ std::copy(b.trees.begin(),
+ b.trees.end(),
+ std::back_insert_iterator<container_t>(a.trees));
+ }
+
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+ BOOST_SPIRIT_DEBUG_OUT << ">>>after AST concat. a = " << a << "<<<\n\n";
+#endif
+
+ return;
+ }
+
+ template <typename MatchT, typename Iterator1T, typename Iterator2T>
+ static void group_match(MatchT& m, parser_id const& id,
+ Iterator1T const& first, Iterator2T const& last)
+ {
+ if (!m)
+ return;
+
+ typedef typename tree_match<iterator_t, NodeFactoryT, T>::container_t
+ container_t;
+ typedef typename container_t::iterator cont_iterator_t;
+ typedef typename NodeFactoryT::template factory<iterator_t> factory_t;
+
+ if (m.trees.size() == 1
+#ifdef BOOST_SPIRIT_NO_TREE_NODE_COLLAPSING
+ && !(id.to_long() && m.trees.begin()->value.id().to_long())
+#endif
+ )
+ {
+ // set rule_id's. There may have been multiple nodes created.
+ // Because of root_node[] they may be left-most children of the top
+ // node.
+ container_t* punset_id = &m.trees;
+ while (punset_id->size() > 0 &&
+ punset_id->begin()->value.id() == 0)
+ {
+ punset_id->begin()->value.id(id);
+ punset_id = &punset_id->begin()->children;
+ }
+
+ m.trees.begin()->value.is_root(false);
+ }
+ else
+ {
+ match_t newmatch(m.length(),
+ m.trees.empty() ?
+ factory_t::empty_node() :
+ factory_t::create_node(first, last, false));
+
+ std::swap(newmatch.trees.begin()->children, m.trees);
+ // set this node and all it's unset children's rule_id
+ newmatch.trees.begin()->value.id(id);
+ for (cont_iterator_t i = newmatch.trees.begin();
+ i != newmatch.trees.end();
+ ++i)
+ {
+ if (i->value.id() == 0)
+ i->value.id(id);
+ }
+ m = newmatch;
+ }
+ }
+
+ template <typename FunctorT, typename MatchT>
+ static void apply_op_to_match(FunctorT const& op, MatchT& m)
+ {
+ op(m);
+ }
+};
+
+namespace impl {
+
+ template <typename IteratorT, typename NodeFactoryT, typename T>
+ struct tree_policy_selector<ast_match_policy<IteratorT, NodeFactoryT, T> >
+ {
+ typedef ast_tree_policy<
+ ast_match_policy<IteratorT, NodeFactoryT, T>,
+ NodeFactoryT,
+ T
+ > type;
+ };
+
+} // namespace impl
+
+
+//////////////////////////////////
+struct gen_ast_node_parser_gen;
+
+template <typename T>
+struct gen_ast_node_parser
+: public unary<T, parser<gen_ast_node_parser<T> > >
+{
+ typedef gen_ast_node_parser<T> self_t;
+ typedef gen_ast_node_parser_gen parser_generator_t;
+ typedef unary_parser_category parser_category_t;
+
+ gen_ast_node_parser(T const& a)
+ : unary<T, parser<gen_ast_node_parser<T> > >(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename ScannerT::iteration_policy_t iteration_policy_t;
+ typedef typename ScannerT::match_policy_t::iterator_t iterator_t;
+ typedef typename ScannerT::match_policy_t::factory_t factory_t;
+ typedef ast_match_policy<iterator_t, factory_t> match_policy_t;
+ typedef typename ScannerT::action_policy_t action_policy_t;
+ typedef scanner_policies<
+ iteration_policy_t,
+ match_policy_t,
+ action_policy_t
+ > policies_t;
+
+ return this->subject().parse(scan.change_policies(policies_t(scan)));
+ }
+};
+
+//////////////////////////////////
+struct gen_ast_node_parser_gen
+{
+ template <typename T>
+ struct result {
+
+ typedef gen_ast_node_parser<T> type;
+ };
+
+ template <typename T>
+ static gen_ast_node_parser<T>
+ generate(parser<T> const& s)
+ {
+ return gen_ast_node_parser<T>(s.derived());
+ }
+
+ template <typename T>
+ gen_ast_node_parser<T>
+ operator[](parser<T> const& s) const
+ {
+ return gen_ast_node_parser<T>(s.derived());
+ }
+};
+
+//////////////////////////////////
+const gen_ast_node_parser_gen gen_ast_node_d = gen_ast_node_parser_gen();
+
+
+//////////////////////////////////
+struct root_node_op
+{
+ template <typename MatchT>
+ void operator()(MatchT& m) const
+ {
+ BOOST_SPIRIT_ASSERT(m.trees.size() > 0);
+ m.trees.begin()->value.is_root(true);
+ }
+};
+
+const node_parser_gen<root_node_op> root_node_d =
+ node_parser_gen<root_node_op>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Parse functions for ASTs
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename AstFactoryT, typename IteratorT, typename ParserT,
+ typename SkipT
+>
+inline tree_parse_info<IteratorT, AstFactoryT>
+ast_parse(
+ IteratorT const& first_,
+ IteratorT const& last_,
+ parser<ParserT> const& parser,
+ SkipT const& skip_,
+ AstFactoryT const & /*dummy_*/ = AstFactoryT())
+{
+ typedef skip_parser_iteration_policy<SkipT> iter_policy_t;
+ typedef ast_match_policy<IteratorT, AstFactoryT> ast_match_policy_t;
+ typedef
+ scanner_policies<iter_policy_t, ast_match_policy_t>
+ scanner_policies_t;
+ typedef scanner<IteratorT, scanner_policies_t> scanner_t;
+
+ iter_policy_t iter_policy(skip_);
+ scanner_policies_t policies(iter_policy);
+ IteratorT first = first_;
+ scanner_t scan(first, last_, policies);
+ tree_match<IteratorT, AstFactoryT> hit = parser.derived().parse(scan);
+ return tree_parse_info<IteratorT, AstFactoryT>(
+ first, hit, hit && (first == last_), hit.length(), hit.trees);
+}
+
+//////////////////////////////////
+template <typename IteratorT, typename ParserT, typename SkipT>
+inline tree_parse_info<IteratorT>
+ast_parse(
+ IteratorT const& first_,
+ IteratorT const& last_,
+ parser<ParserT> const& parser,
+ SkipT const& skip_)
+{
+ typedef node_val_data_factory<nil_t> default_factory_t;
+ return ast_parse(first_, last_, parser, skip_, default_factory_t());
+}
+
+//////////////////////////////////
+template <typename IteratorT, typename ParserT>
+inline tree_parse_info<IteratorT>
+ast_parse(
+ IteratorT const& first_,
+ IteratorT const& last,
+ parser<ParserT> const& parser)
+{
+ typedef ast_match_policy<IteratorT> ast_match_policy_t;
+ IteratorT first = first_;
+ scanner<
+ IteratorT,
+ scanner_policies<iteration_policy, ast_match_policy_t>
+ > scan(first, last);
+ tree_match<IteratorT> hit = parser.derived().parse(scan);
+ return tree_parse_info<IteratorT>(
+ first, hit, hit && (first == last), hit.length(), hit.trees);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT, typename SkipT>
+inline tree_parse_info<CharT const*>
+ast_parse(
+ CharT const* str,
+ parser<ParserT> const& parser,
+ SkipT const& skip)
+{
+ CharT const* last = str;
+ while (*last)
+ last++;
+ return ast_parse(str, last, parser, skip);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline tree_parse_info<CharT const*>
+ast_parse(
+ CharT const* str,
+ parser<ParserT> const& parser)
+{
+ CharT const* last = str;
+ while (*last)
+ {
+ last++;
+ }
+ return ast_parse(str, last, parser);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/tree/ast_fwd.hpp b/boost/spirit/home/classic/tree/ast_fwd.hpp
new file mode 100644
index 0000000000..71ef91b0f5
--- /dev/null
+++ b/boost/spirit/home/classic/tree/ast_fwd.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_TREE_AST_FWD_HPP)
+#define BOOST_SPIRIT_TREE_AST_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <
+ typename MatchPolicyT,
+ typename NodeFactoryT,
+ typename T = nil_t
+ >
+ struct ast_tree_policy;
+
+ template <
+ typename IteratorT,
+ typename NodeFactoryT = node_val_data_factory<nil_t>,
+ typename T = nil_t
+ >
+ struct ast_match_policy;
+
+ template <typename T>
+ struct gen_ast_node_parser;
+
+ struct root_node_op;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/tree/common.hpp b/boost/spirit/home/classic/tree/common.hpp
new file mode 100644
index 0000000000..f25d4915ef
--- /dev/null
+++ b/boost/spirit/home/classic/tree/common.hpp
@@ -0,0 +1,1588 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2001-2007 Hartmut Kaiser
+ Revised 2007, Copyright (c) Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_TREE_COMMON_HPP
+#define BOOST_SPIRIT_TREE_COMMON_HPP
+
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+#include <vector>
+#else
+#include <list>
+#endif
+
+#if defined(BOOST_SPIRIT_USE_BOOST_ALLOCATOR_FOR_TREES)
+#include <boost/pool/pool_alloc.hpp>
+#endif
+
+#include <algorithm>
+
+#include <boost/ref.hpp>
+#include <boost/call_traits.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core.hpp>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+#include <boost/assert.hpp>
+
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+#include <iostream>
+#include <boost/spirit/home/classic/debug/debug_node.hpp>
+#endif
+
+#include <boost/spirit/home/classic/tree/common_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+template <typename T>
+void swap(tree_node<T>& a, tree_node<T>& b);
+
+template <typename T, typename V>
+void swap(node_iter_data<T, V>& a, node_iter_data<T, V>& b);
+
+namespace impl {
+ template <typename T>
+ inline void cp_swap(T& t1, T& t2);
+}
+
+template <typename T>
+struct tree_node
+{
+ typedef T parse_node_t;
+
+#if !defined(BOOST_SPIRIT_USE_BOOST_ALLOCATOR_FOR_TREES)
+ typedef std::allocator<tree_node<T> > allocator_type;
+#elif !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ typedef boost::pool_allocator<tree_node<T> > allocator_type;
+#else
+ typedef boost::fast_pool_allocator<tree_node<T> > allocator_type;
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ typedef std::vector<tree_node<T>, allocator_type> children_t;
+#else
+ typedef std::list<tree_node<T>, allocator_type> children_t;
+#endif // BOOST_SPIRIT_USE_LIST_FOR_TREES
+
+ typedef typename children_t::iterator tree_iterator;
+ typedef typename children_t::const_iterator const_tree_iterator;
+
+ T value;
+ children_t children;
+
+ tree_node()
+ : value()
+ , children()
+ {}
+
+ explicit tree_node(T const& v)
+ : value(v)
+ , children()
+ {}
+
+ tree_node(T const& v, children_t const& c)
+ : value(v)
+ , children(c)
+ {}
+
+ void swap(tree_node<T>& x)
+ {
+ impl::cp_swap(value, x.value);
+ impl::cp_swap(children, x.children);
+ }
+
+// Intel V5.0.1 has a problem without this explicit operator=
+ tree_node &operator= (tree_node const &rhs)
+ {
+ tree_node(rhs).swap(*this);
+ return *this;
+ }
+};
+
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+template <typename T>
+inline std::ostream&
+operator<<(std::ostream& o, tree_node<T> const& n)
+{
+ static int depth = 0;
+ o << "\n";
+ for (int i = 0; i <= depth; ++i)
+ {
+ o << "\t";
+ }
+ o << "(depth = " << depth++ << " value = " << n.value;
+ int c = 0;
+ for (typename tree_node<T>::children_t::const_iterator it = n.children.begin();
+ it != n.children.end(); ++it)
+ {
+ o << " children[" << c++ << "] = " << *it;
+ }
+ o << ")";
+ --depth;
+ return o;
+}
+#endif
+
+//////////////////////////////////
+template <typename IteratorT, typename ValueT>
+struct node_iter_data
+{
+ typedef IteratorT iterator_t;
+ typedef IteratorT /*const*/ const_iterator_t;
+
+ node_iter_data()
+ : first(), last(), is_root_(false), parser_id_(), value_()
+ {}
+
+ node_iter_data(IteratorT const& _first, IteratorT const& _last)
+ : first(_first), last(_last), is_root_(false), parser_id_(), value_()
+ {}
+
+ void swap(node_iter_data& x)
+ {
+ impl::cp_swap(first, x.first);
+ impl::cp_swap(last, x.last);
+ impl::cp_swap(parser_id_, x.parser_id_);
+ impl::cp_swap(is_root_, x.is_root_);
+ impl::cp_swap(value_, x.value_);
+ }
+
+ IteratorT begin()
+ {
+ return first;
+ }
+
+ IteratorT const& begin() const
+ {
+ return first;
+ }
+
+ IteratorT end()
+ {
+ return last;
+ }
+
+ IteratorT const& end() const
+ {
+ return last;
+ }
+
+ bool is_root() const
+ {
+ return is_root_;
+ }
+
+ void is_root(bool b)
+ {
+ is_root_ = b;
+ }
+
+ parser_id id() const
+ {
+ return parser_id_;
+ }
+
+ void id(parser_id r)
+ {
+ parser_id_ = r;
+ }
+
+ ValueT const& value() const
+ {
+ return value_;
+ }
+
+ void value(ValueT const& v)
+ {
+ value_ = v;
+ }
+private:
+ IteratorT first, last;
+ bool is_root_;
+ parser_id parser_id_;
+ ValueT value_;
+
+public:
+};
+
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+// value is default nil_t, so provide an operator<< for nil_t
+inline std::ostream&
+operator<<(std::ostream& o, nil_t const&)
+{
+ return o;
+}
+
+template <typename IteratorT, typename ValueT>
+inline std::ostream&
+operator<<(std::ostream& o, node_iter_data<IteratorT, ValueT> const& n)
+{
+ o << "(id = " << n.id() << " text = \"";
+ typedef typename node_iter_data<IteratorT, ValueT>::const_iterator_t
+ iterator_t;
+ for (iterator_t it = n.begin(); it != n.end(); ++it)
+ impl::token_printer(o, *it);
+ o << "\" is_root = " << n.is_root()
+ << /*" value = " << n.value() << */")";
+ return o;
+}
+#endif
+
+//////////////////////////////////
+template <typename IteratorT = char const*, typename ValueT = nil_t>
+struct node_val_data
+{
+ typedef
+ typename boost::detail::iterator_traits<IteratorT>::value_type
+ value_type;
+
+#if !defined(BOOST_SPIRIT_USE_BOOST_ALLOCATOR_FOR_TREES)
+ typedef std::allocator<value_type> allocator_type;
+#elif !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ typedef boost::pool_allocator<value_type> allocator_type;
+#else
+ typedef boost::fast_pool_allocator<value_type> allocator_type;
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ typedef std::vector<value_type, allocator_type> container_t;
+#else
+ typedef std::list<value_type, allocator_type> container_t;
+#endif
+
+ typedef typename container_t::iterator iterator_t;
+ typedef typename container_t::const_iterator const_iterator_t;
+
+ node_val_data()
+ : text(), is_root_(false), parser_id_(), value_()
+ {}
+
+#if defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
+ node_val_data(IteratorT const& _first, IteratorT const& _last)
+ : text(), is_root_(false), parser_id_(), value_()
+ {
+ std::copy(_first, _last, std::inserter(text, text.end()));
+ }
+
+ // This constructor is for building text out of iterators
+ template <typename IteratorT2>
+ node_val_data(IteratorT2 const& _first, IteratorT2 const& _last)
+ : text(), is_root_(false), parser_id_(), value_()
+ {
+ std::copy(_first, _last, std::inserter(text, text.end()));
+ }
+#else
+ node_val_data(IteratorT const& _first, IteratorT const& _last)
+ : text(_first, _last), is_root_(false), parser_id_(), value_()
+ {}
+
+ // This constructor is for building text out of iterators
+ template <typename IteratorT2>
+ node_val_data(IteratorT2 const& _first, IteratorT2 const& _last)
+ : text(_first, _last), is_root_(false), parser_id_(), value_()
+ {}
+#endif
+
+ void swap(node_val_data& x)
+ {
+ impl::cp_swap(text, x.text);
+ impl::cp_swap(is_root_, x.is_root_);
+ impl::cp_swap(parser_id_, x.parser_id_);
+ impl::cp_swap(value_, x.value_);
+ }
+
+ typename container_t::iterator begin()
+ {
+ return text.begin();
+ }
+
+ typename container_t::const_iterator begin() const
+ {
+ return text.begin();
+ }
+
+ typename container_t::iterator end()
+ {
+ return text.end();
+ }
+
+ typename container_t::const_iterator end() const
+ {
+ return text.end();
+ }
+
+ bool is_root() const
+ {
+ return is_root_;
+ }
+
+ void is_root(bool b)
+ {
+ is_root_ = b;
+ }
+
+ parser_id id() const
+ {
+ return parser_id_;
+ }
+
+ void id(parser_id r)
+ {
+ parser_id_ = r;
+ }
+
+ ValueT const& value() const
+ {
+ return value_;
+ }
+
+ void value(ValueT const& v)
+ {
+ value_ = v;
+ }
+
+private:
+ container_t text;
+ bool is_root_;
+ parser_id parser_id_;
+ ValueT value_;
+};
+
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+template <typename IteratorT, typename ValueT>
+inline std::ostream&
+operator<<(std::ostream& o, node_val_data<IteratorT, ValueT> const& n)
+{
+ o << "(id = " << n.id() << " text = \"";
+ typedef typename node_val_data<IteratorT, ValueT>::const_iterator_t
+ iterator_t;
+ for (iterator_t it = n.begin(); it != n.end(); ++it)
+ impl::token_printer(o, *it);
+ o << "\" is_root = " << n.is_root()
+ << " value = " << n.value() << ")";
+ return o;
+}
+#endif
+
+template <typename T>
+inline void
+swap(tree_node<T>& a, tree_node<T>& b)
+{
+ a.swap(b);
+}
+
+template <typename T, typename V>
+inline void
+swap(node_iter_data<T, V>& a, node_iter_data<T, V>& b)
+{
+ a.swap(b);
+}
+
+//////////////////////////////////
+template <typename ValueT>
+class node_iter_data_factory
+{
+public:
+ // This inner class is so that node_iter_data_factory can simulate
+ // a template template parameter
+ template <typename IteratorT>
+ class factory
+ {
+ public:
+ typedef IteratorT iterator_t;
+ typedef node_iter_data<iterator_t, ValueT> node_t;
+
+ static node_t create_node(iterator_t const& first, iterator_t const& last,
+ bool /*is_leaf_node*/)
+ {
+ return node_t(first, last);
+ }
+
+ static node_t empty_node()
+ {
+ return node_t();
+ }
+
+ // precondition: ContainerT contains a tree_node<node_t>. And all
+ // iterators in the container point to the same sequence.
+ template <typename ContainerT>
+ static node_t group_nodes(ContainerT const& nodes)
+ {
+ return node_t(nodes.begin()->value.begin(),
+ nodes.back().value.end());
+ }
+ };
+};
+
+//////////////////////////////////
+template <typename ValueT>
+class node_val_data_factory
+{
+public:
+ // This inner class is so that node_val_data_factory can simulate
+ // a template template parameter
+ template <typename IteratorT>
+ class factory
+ {
+ public:
+ typedef IteratorT iterator_t;
+ typedef node_val_data<iterator_t, ValueT> node_t;
+
+ static node_t create_node(iterator_t const& first, iterator_t const& last,
+ bool is_leaf_node)
+ {
+ if (is_leaf_node)
+ return node_t(first, last);
+ else
+ return node_t();
+ }
+
+ static node_t empty_node()
+ {
+ return node_t();
+ }
+
+ template <typename ContainerT>
+ static node_t group_nodes(ContainerT const& nodes)
+ {
+ typename node_t::container_t c;
+ typename ContainerT::const_iterator i_end = nodes.end();
+ // copy all the nodes text into a new one
+ for (typename ContainerT::const_iterator i = nodes.begin();
+ i != i_end; ++i)
+ {
+ // See docs: reduced_node_d cannot be used with a
+ // rule inside the [].
+ BOOST_ASSERT(i->children.size() == 0);
+ c.insert(c.end(), i->value.begin(), i->value.end());
+ }
+ return node_t(c.begin(), c.end());
+ }
+ };
+};
+
+//////////////////////////////////
+template <typename ValueT>
+class node_all_val_data_factory
+{
+public:
+ // This inner class is so that node_all_val_data_factory can simulate
+ // a template template parameter
+ template <typename IteratorT>
+ class factory
+ {
+ public:
+ typedef IteratorT iterator_t;
+ typedef node_val_data<iterator_t, ValueT> node_t;
+
+ static node_t create_node(iterator_t const& first, iterator_t const& last,
+ bool /*is_leaf_node*/)
+ {
+ return node_t(first, last);
+ }
+
+ static node_t empty_node()
+ {
+ return node_t();
+ }
+
+ template <typename ContainerT>
+ static node_t group_nodes(ContainerT const& nodes)
+ {
+ typename node_t::container_t c;
+ typename ContainerT::const_iterator i_end = nodes.end();
+ // copy all the nodes text into a new one
+ for (typename ContainerT::const_iterator i = nodes.begin();
+ i != i_end; ++i)
+ {
+ BOOST_ASSERT(i->children.size() == 0);
+ c.insert(c.end(), i->value.begin(), i->value.end());
+ }
+ return node_t(c.begin(), c.end());
+ }
+ };
+};
+
+namespace impl {
+
+ ///////////////////////////////////////////////////////////////////////////
+ // 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):
+#if __GNUC__ == 2
+ using ::std::swap;
+#endif
+ template <typename T>
+ inline void cp_swap(T& t1, T& t2)
+ {
+ using std::swap;
+ using BOOST_SPIRIT_CLASSIC_NS::swap;
+ using boost::swap;
+ swap(t1, t2);
+ }
+}
+
+//////////////////////////////////
+template <typename IteratorT, typename NodeFactoryT, typename T>
+class tree_match : public match<T>
+{
+public:
+
+ typedef typename NodeFactoryT::template factory<IteratorT> node_factory_t;
+ typedef typename node_factory_t::node_t parse_node_t;
+ typedef tree_node<parse_node_t> node_t;
+ typedef typename node_t::children_t container_t;
+ typedef typename container_t::iterator tree_iterator;
+ typedef typename container_t::const_iterator const_tree_iterator;
+
+ typedef T attr_t;
+ typedef typename boost::call_traits<T>::param_type param_type;
+ typedef typename boost::call_traits<T>::reference reference;
+ typedef typename boost::call_traits<T>::const_reference const_reference;
+
+ tree_match()
+ : match<T>(), trees()
+ {}
+
+ explicit
+ tree_match(std::size_t length_)
+ : match<T>(length_), trees()
+ {}
+
+ tree_match(std::size_t length_, parse_node_t const& n)
+ : match<T>(length_), trees()
+ {
+ trees.push_back(node_t(n));
+ }
+
+ tree_match(std::size_t length_, param_type val, parse_node_t const& n)
+ : match<T>(length_, val), trees()
+ {
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ trees.reserve(10); // this is more or less an arbitrary number...
+#endif
+ trees.push_back(node_t(n));
+ }
+
+ // attention, these constructors will change the second parameter!
+ tree_match(std::size_t length_, container_t& c)
+ : match<T>(length_), trees()
+ {
+ impl::cp_swap(trees, c);
+ }
+
+ tree_match(std::size_t length_, param_type val, container_t& c)
+ : match<T>(length_, val), trees()
+ {
+ impl::cp_swap(trees, c);
+ }
+
+ template <typename T2>
+ tree_match(match<T2> const& other)
+ : match<T>(other), trees()
+ {}
+
+ template <typename T2, typename T3, typename T4>
+ tree_match(tree_match<T2, T3, T4> const& other)
+ : match<T>(other), trees()
+ { impl::cp_swap(trees, other.trees); }
+
+ template <typename T2>
+ tree_match&
+ operator=(match<T2> const& other)
+ {
+ match<T>::operator=(other);
+ return *this;
+ }
+
+ template <typename T2, typename T3, typename T4>
+ tree_match&
+ operator=(tree_match<T2, T3, T4> const& other)
+ {
+ match<T>::operator=(other);
+ impl::cp_swap(trees, other.trees);
+ return *this;
+ }
+
+ tree_match(tree_match const& x)
+ : match<T>(x), trees()
+ {
+ // use auto_ptr like ownership for the trees data member
+ impl::cp_swap(trees, x.trees);
+ }
+
+ tree_match& operator=(tree_match const& x)
+ {
+ tree_match tmp(x);
+ this->swap(tmp);
+ return *this;
+ }
+
+ void swap(tree_match& x)
+ {
+ match<T>::swap(x);
+ impl::cp_swap(trees, x.trees);
+ }
+
+ mutable container_t trees;
+};
+
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+template <typename IteratorT, typename NodeFactoryT, typename T>
+inline std::ostream&
+operator<<(std::ostream& o, tree_match<IteratorT, NodeFactoryT, T> const& m)
+{
+ typedef
+ typename tree_match<IteratorT, NodeFactoryT, T>::container_t::iterator
+ iterator;
+
+ o << "(length = " << (int)m.length();
+ int c = 0;
+ for (iterator i = m.trees.begin(); i != m.trees.end(); ++i)
+ {
+ o << " trees[" << c++ << "] = " << *i;
+ }
+ o << "\n)";
+ return o;
+}
+#endif
+
+//////////////////////////////////
+struct tree_policy
+{
+ template <typename FunctorT, typename MatchT>
+ static void apply_op_to_match(FunctorT const& /*op*/, MatchT& /*m*/)
+ {}
+
+ template <typename MatchT, typename Iterator1T, typename Iterator2T>
+ static void group_match(MatchT& /*m*/, parser_id const& /*id*/,
+ Iterator1T const& /*first*/, Iterator2T const& /*last*/)
+ {}
+
+ template <typename MatchT>
+ static void concat(MatchT& /*a*/, MatchT const& /*b*/)
+ {}
+};
+
+//////////////////////////////////
+template <
+ typename MatchPolicyT,
+ typename IteratorT,
+ typename NodeFactoryT,
+ typename TreePolicyT,
+ typename T
+>
+struct common_tree_match_policy : public match_policy
+{
+ common_tree_match_policy()
+ {
+ }
+
+ template <typename PolicyT>
+ common_tree_match_policy(PolicyT const & policies)
+ : match_policy((match_policy const &)policies)
+ {
+ }
+
+ template <typename U>
+ struct result { typedef tree_match<IteratorT, NodeFactoryT, U> type; };
+
+ typedef tree_match<IteratorT, NodeFactoryT, T> match_t;
+ typedef IteratorT iterator_t;
+ typedef TreePolicyT tree_policy_t;
+ typedef NodeFactoryT factory_t;
+
+ static const match_t no_match() { return match_t(); }
+ static const match_t empty_match()
+ { return match_t(0, tree_policy_t::empty_node()); }
+
+ template <typename AttrT, typename Iterator1T, typename Iterator2T>
+ static tree_match<IteratorT, NodeFactoryT, AttrT> create_match(
+ std::size_t length,
+ AttrT const& val,
+ Iterator1T const& first,
+ Iterator2T const& last)
+ {
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+
+ BOOST_SPIRIT_DEBUG_OUT << "\n>>> create_node(begin) <<<\n"
+ "creating node text: \"";
+ for (Iterator1T it = first; it != last; ++it)
+ impl::token_printer(BOOST_SPIRIT_DEBUG_OUT, *it);
+ BOOST_SPIRIT_DEBUG_OUT << "\"\n";
+ BOOST_SPIRIT_DEBUG_OUT << ">>> create_node(end) <<<\n\n";
+#endif
+ return tree_match<IteratorT, NodeFactoryT, AttrT>(length, val,
+ tree_policy_t::create_node(length, first, last, true));
+ }
+
+ template <typename Match1T, typename Match2T>
+ static void concat_match(Match1T& a, Match2T const& b)
+ {
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_NODES)
+
+ BOOST_SPIRIT_DEBUG_OUT << "\n>>> concat_match(begin) <<<\n";
+ BOOST_SPIRIT_DEBUG_OUT << "tree a:\n" << a << "\n";
+ BOOST_SPIRIT_DEBUG_OUT << "tree b:\n" << b << "\n";
+ BOOST_SPIRIT_DEBUG_OUT << ">>> concat_match(end) <<<\n\n";
+#endif
+ BOOST_SPIRIT_ASSERT(a && b);
+ if (a.length() == 0)
+ {
+ a = b;
+ return;
+ }
+ else if (b.length() == 0
+#ifdef BOOST_SPIRIT_NO_TREE_NODE_COLLAPSING
+ && !b.trees.begin()->value.id().to_long()
+#endif
+ )
+ {
+ return;
+ }
+ a.concat(b);
+ tree_policy_t::concat(a, b);
+ }
+
+ template <typename MatchT, typename IteratorT2>
+ void
+ group_match(
+ MatchT& m,
+ parser_id const& id,
+ IteratorT2 const& first,
+ IteratorT2 const& last) const
+ {
+ if (!m) return;
+
+#if defined(BOOST_SPIRIT_DEBUG) && \
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_TREES)
+
+ BOOST_SPIRIT_DEBUG_OUT << "\n>>> group_match(begin) <<<\n"
+ "new node(" << id << ") \"";
+ for (IteratorT2 it = first; it != last; ++it)
+ impl::token_printer(BOOST_SPIRIT_DEBUG_OUT, *it);
+ BOOST_SPIRIT_DEBUG_OUT << "\"\n";
+ BOOST_SPIRIT_DEBUG_OUT << "new child tree (before grouping):\n" << m << "\n";
+
+ tree_policy_t::group_match(m, id, first, last);
+
+ BOOST_SPIRIT_DEBUG_OUT << "new child tree (after grouping):\n" << m << "\n";
+ BOOST_SPIRIT_DEBUG_OUT << ">>> group_match(end) <<<\n\n";
+#else
+ tree_policy_t::group_match(m, id, first, last);
+#endif
+ }
+};
+
+//////////////////////////////////
+template <typename MatchPolicyT, typename NodeFactoryT>
+struct common_tree_tree_policy
+{
+ typedef typename MatchPolicyT::iterator_t iterator_t;
+ typedef typename MatchPolicyT::match_t match_t;
+ typedef typename NodeFactoryT::template factory<iterator_t> factory_t;
+ typedef typename factory_t::node_t node_t;
+
+ template <typename Iterator1T, typename Iterator2T>
+ static node_t
+ create_node(std::size_t /*length*/, Iterator1T const& first,
+ Iterator2T const& last, bool leaf_node)
+ {
+ return factory_t::create_node(first, last, leaf_node);
+ }
+
+ static node_t
+ empty_node()
+ {
+ return factory_t::empty_node();
+ }
+
+ template <typename FunctorT>
+ static void apply_op_to_match(FunctorT const& op, match_t& m)
+ {
+ op(m);
+ }
+};
+
+//////////////////////////////////
+// directives to modify how the parse tree is generated
+
+struct no_tree_gen_node_parser_gen;
+
+template <typename T>
+struct no_tree_gen_node_parser
+: public unary<T, parser<no_tree_gen_node_parser<T> > >
+{
+ typedef no_tree_gen_node_parser<T> self_t;
+ typedef no_tree_gen_node_parser_gen parser_generator_t;
+ typedef unary_parser_category parser_category_t;
+
+ no_tree_gen_node_parser(T const& a)
+ : unary<T, parser<no_tree_gen_node_parser<T> > >(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scanner) const
+ {
+ typedef typename ScannerT::iteration_policy_t iteration_policy_t;
+ typedef match_policy match_policy_t;
+ typedef typename ScannerT::action_policy_t action_policy_t;
+ typedef scanner_policies<
+ iteration_policy_t,
+ match_policy_t,
+ action_policy_t
+ > policies_t;
+
+ return this->subject().parse(scanner.change_policies(policies_t(scanner)));
+ }
+};
+
+struct no_tree_gen_node_parser_gen
+{
+ template <typename T>
+ struct result {
+
+ typedef no_tree_gen_node_parser<T> type;
+ };
+
+ template <typename T>
+ static no_tree_gen_node_parser<T>
+ generate(parser<T> const& s)
+ {
+ return no_tree_gen_node_parser<T>(s.derived());
+ }
+
+ template <typename T>
+ no_tree_gen_node_parser<T>
+ operator[](parser<T> const& s) const
+ {
+ return no_tree_gen_node_parser<T>(s.derived());
+ }
+};
+
+const no_tree_gen_node_parser_gen no_node_d = no_tree_gen_node_parser_gen();
+
+//////////////////////////////////
+
+struct leaf_node_parser_gen;
+
+template<typename T>
+struct leaf_node_parser
+: public unary<T, parser<leaf_node_parser<T> > >
+{
+ typedef leaf_node_parser<T> self_t;
+ typedef leaf_node_parser_gen parser_generator_t;
+ typedef unary_parser_category parser_category_t;
+
+ leaf_node_parser(T const& a)
+ : unary<T, parser<leaf_node_parser<T> > >(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scanner) const
+ {
+ typedef scanner_policies< typename ScannerT::iteration_policy_t,
+ match_policy, typename ScannerT::action_policy_t > policies_t;
+
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename result_t::node_factory_t factory_t;
+
+ iterator_t from = scanner.first;
+ result_t hit = impl::contiguous_parser_parse<result_t>(this->subject(),
+ scanner.change_policies(policies_t(scanner,match_policy(),scanner)),
+ scanner);
+
+ if (hit)
+ return result_t(hit.length(),
+ factory_t::create_node(from, scanner.first, true));
+ else
+ return result_t(hit.length());
+ }
+};
+
+struct leaf_node_parser_gen
+{
+ template <typename T>
+ struct result {
+
+ typedef leaf_node_parser<T> type;
+ };
+
+ template <typename T>
+ static leaf_node_parser<T>
+ generate(parser<T> const& s)
+ {
+ return leaf_node_parser<T>(s.derived());
+ }
+
+ template <typename T>
+ leaf_node_parser<T>
+ operator[](parser<T> const& s) const
+ {
+ return leaf_node_parser<T>(s.derived());
+ }
+};
+
+const leaf_node_parser_gen leaf_node_d = leaf_node_parser_gen();
+const leaf_node_parser_gen token_node_d = leaf_node_parser_gen();
+
+//////////////////////////////////
+namespace impl {
+
+ template <typename MatchPolicyT>
+ struct tree_policy_selector
+ {
+ typedef tree_policy type;
+ };
+
+} // namespace impl
+
+//////////////////////////////////
+template <typename NodeParserT>
+struct node_parser_gen;
+
+template <typename T, typename NodeParserT>
+struct node_parser
+: public unary<T, parser<node_parser<T, NodeParserT> > >
+{
+ typedef node_parser<T, NodeParserT> self_t;
+ typedef node_parser_gen<NodeParserT> parser_generator_t;
+ typedef unary_parser_category parser_category_t;
+
+ node_parser(T const& a)
+ : unary<T, parser<node_parser<T, NodeParserT> > >(a) {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<T, ScannerT>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scanner) const
+ {
+ typename parser_result<self_t, ScannerT>::type hit = this->subject().parse(scanner);
+ if (hit)
+ {
+ impl::tree_policy_selector<typename ScannerT::match_policy_t>::type::apply_op_to_match(NodeParserT(), hit);
+ }
+ return hit;
+ }
+};
+
+template <typename NodeParserT>
+struct node_parser_gen
+{
+ template <typename T>
+ struct result {
+
+ typedef node_parser<T, NodeParserT> type;
+ };
+
+ template <typename T>
+ static node_parser<T, NodeParserT>
+ generate(parser<T> const& s)
+ {
+ return node_parser<T, NodeParserT>(s.derived());
+ }
+
+ template <typename T>
+ node_parser<T, NodeParserT>
+ operator[](parser<T> const& s) const
+ {
+ return node_parser<T, NodeParserT>(s.derived());
+ }
+};
+//////////////////////////////////
+struct reduced_node_op
+{
+ template <typename MatchT>
+ void operator()(MatchT& m) const
+ {
+ if (m.trees.size() == 1)
+ {
+ m.trees.begin()->children.clear();
+ }
+ else if (m.trees.size() > 1)
+ {
+ typedef typename MatchT::node_factory_t node_factory_t;
+ m = MatchT(m.length(), node_factory_t::group_nodes(m.trees));
+ }
+ }
+};
+
+const node_parser_gen<reduced_node_op> reduced_node_d =
+ node_parser_gen<reduced_node_op>();
+
+
+struct discard_node_op
+{
+ template <typename MatchT>
+ void operator()(MatchT& m) const
+ {
+ m.trees.clear();
+ }
+};
+
+const node_parser_gen<discard_node_op> discard_node_d =
+ node_parser_gen<discard_node_op>();
+
+struct infix_node_op
+{
+ template <typename MatchT>
+ void operator()(MatchT& m) const
+ {
+ typedef typename MatchT::container_t container_t;
+ typedef typename MatchT::container_t::iterator iter_t;
+ typedef typename MatchT::container_t::value_type value_t;
+
+ using std::swap;
+ using boost::swap;
+ using BOOST_SPIRIT_CLASSIC_NS::swap;
+
+ // copying the tree nodes is expensive, since it may copy a whole
+ // tree. swapping them is cheap, so swap the nodes we want into
+ // a new container of children.
+ container_t new_children;
+ std::size_t length = 0;
+ std::size_t tree_size = m.trees.size();
+
+ // the infix_node_d[] make no sense for nodes with no subnodes
+ BOOST_SPIRIT_ASSERT(tree_size >= 1);
+
+ bool keep = true;
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ new_children.reserve((tree_size+1)/2);
+#endif
+ iter_t i_end = m.trees.end();
+ for (iter_t i = m.trees.begin(); i != i_end; ++i)
+ {
+ if (keep) {
+ // adjust the length
+ length += std::distance((*i).value.begin(), (*i).value.end());
+
+ // move the child node
+ new_children.push_back(value_t());
+ swap(new_children.back(), *i);
+ keep = false;
+ }
+ else {
+ // ignore this child node
+ keep = true;
+ }
+ }
+
+ m = MatchT(length, new_children);
+ }
+};
+
+const node_parser_gen<infix_node_op> infix_node_d =
+ node_parser_gen<infix_node_op>();
+
+struct discard_first_node_op
+{
+ template <typename MatchT>
+ void operator()(MatchT& m) const
+ {
+ typedef typename MatchT::container_t container_t;
+ typedef typename MatchT::container_t::iterator iter_t;
+ typedef typename MatchT::container_t::value_type value_t;
+
+ using std::swap;
+ using boost::swap;
+ using BOOST_SPIRIT_CLASSIC_NS::swap;
+
+ // copying the tree nodes is expensive, since it may copy a whole
+ // tree. swapping them is cheap, so swap the nodes we want into
+ // a new container of children, instead of saying
+ // m.trees.erase(m.trees.begin()) because, on a container_t that will
+ // cause all the nodes afterwards to be copied into the previous
+ // position.
+ container_t new_children;
+ std::size_t length = 0;
+ std::size_t tree_size = m.trees.size();
+
+ // the discard_first_node_d[] make no sense for nodes with no subnodes
+ BOOST_SPIRIT_ASSERT(tree_size >= 1);
+
+ if (tree_size > 1) {
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ new_children.reserve(tree_size - 1);
+#endif
+ iter_t i = m.trees.begin(), i_end = m.trees.end();
+ for (++i; i != i_end; ++i)
+ {
+ // adjust the length
+ length += std::distance((*i).value.begin(), (*i).value.end());
+
+ // move the child node
+ new_children.push_back(value_t());
+ swap(new_children.back(), *i);
+ }
+ }
+ else {
+ // if there was a tree and now there isn't any, insert an empty node
+ iter_t i = m.trees.begin();
+
+ // This isn't entirely correct, since the empty node will reference
+ // the end of the discarded node, but I currently don't see any way to
+ // get at the begin of the node following this subnode.
+ // This should be safe anyway because the it shouldn't get dereferenced
+ // under any circumstances.
+ typedef typename value_t::parse_node_t::iterator_t iterator_type;
+ iterator_type it = (*i).value.end();
+
+ new_children.push_back(
+ value_t(typename value_t::parse_node_t(it, it)));
+ }
+
+ m = MatchT(length, new_children);
+ }
+};
+
+const node_parser_gen<discard_first_node_op> discard_first_node_d =
+ node_parser_gen<discard_first_node_op>();
+
+struct discard_last_node_op
+{
+ template <typename MatchT>
+ void operator()(MatchT& m) const
+ {
+ typedef typename MatchT::container_t container_t;
+ typedef typename MatchT::container_t::iterator iter_t;
+ typedef typename MatchT::container_t::value_type value_t;
+
+ using std::swap;
+ using boost::swap;
+ using BOOST_SPIRIT_CLASSIC_NS::swap;
+
+ // copying the tree nodes is expensive, since it may copy a whole
+ // tree. swapping them is cheap, so swap the nodes we want into
+ // a new container of children, instead of saying
+ // m.trees.erase(m.trees.begin()) because, on a container_t that will
+ // cause all the nodes afterwards to be copied into the previous
+ // position.
+ container_t new_children;
+ std::size_t length = 0;
+ std::size_t tree_size = m.trees.size();
+
+ // the discard_last_node_d[] make no sense for nodes with no subnodes
+ BOOST_SPIRIT_ASSERT(tree_size >= 1);
+
+ if (tree_size > 1) {
+ m.trees.pop_back();
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ new_children.reserve(tree_size - 1);
+#endif
+ iter_t i_end = m.trees.end();
+ for (iter_t i = m.trees.begin(); i != i_end; ++i)
+ {
+ // adjust the length
+ length += std::distance((*i).value.begin(), (*i).value.end());
+
+ // move the child node
+ new_children.push_back(value_t());
+ swap(new_children.back(), *i);
+ }
+ }
+ else {
+ // if there was a tree and now there isn't any, insert an empty node
+ iter_t i = m.trees.begin();
+
+ typedef typename value_t::parse_node_t::iterator_t iterator_type;
+ iterator_type it = (*i).value.begin();
+
+ new_children.push_back(
+ value_t(typename value_t::parse_node_t(it, it)));
+ }
+
+ m = MatchT(length, new_children);
+ }
+};
+
+const node_parser_gen<discard_last_node_op> discard_last_node_d =
+ node_parser_gen<discard_last_node_op>();
+
+struct inner_node_op
+{
+ template <typename MatchT>
+ void operator()(MatchT& m) const
+ {
+ typedef typename MatchT::container_t container_t;
+ typedef typename MatchT::container_t::iterator iter_t;
+ typedef typename MatchT::container_t::value_type value_t;
+
+ using std::swap;
+ using boost::swap;
+ using BOOST_SPIRIT_CLASSIC_NS::swap;
+
+ // copying the tree nodes is expensive, since it may copy a whole
+ // tree. swapping them is cheap, so swap the nodes we want into
+ // a new container of children, instead of saying
+ // m.trees.erase(m.trees.begin()) because, on a container_t that will
+ // cause all the nodes afterwards to be copied into the previous
+ // position.
+ container_t new_children;
+ std::size_t length = 0;
+ std::size_t tree_size = m.trees.size();
+
+ // the inner_node_d[] make no sense for nodes with less then 2 subnodes
+ BOOST_SPIRIT_ASSERT(tree_size >= 2);
+
+ if (tree_size > 2) {
+ m.trees.pop_back(); // erase the last element
+#if !defined(BOOST_SPIRIT_USE_LIST_FOR_TREES)
+ new_children.reserve(tree_size - 1);
+#endif
+ iter_t i = m.trees.begin(); // skip over the first element
+ iter_t i_end = m.trees.end();
+ for (++i; i != i_end; ++i)
+ {
+ // adjust the length
+ length += std::distance((*i).value.begin(), (*i).value.end());
+
+ // move the child node
+ new_children.push_back(value_t());
+ swap(new_children.back(), *i);
+ }
+ }
+ else {
+ // if there was a tree and now there isn't any, insert an empty node
+ iter_t i = m.trees.begin(); // skip over the first element
+
+ typedef typename value_t::parse_node_t::iterator_t iterator_type;
+ iterator_type it = (*++i).value.begin();
+
+ new_children.push_back(
+ value_t(typename value_t::parse_node_t(it, it)));
+ }
+
+ m = MatchT(length, new_children);
+ }
+};
+
+const node_parser_gen<inner_node_op> inner_node_d =
+ node_parser_gen<inner_node_op>();
+
+
+//////////////////////////////////
+// action_directive_parser and action_directive_parser_gen
+// are meant to be used as a template to create directives that
+// generate action classes. For example access_match and
+// access_node. The ActionParserT template parameter must be
+// a class that has an innter class called action that is templated
+// on the parser type and the action type.
+template <typename ActionParserT>
+struct action_directive_parser_gen;
+
+template <typename T, typename ActionParserT>
+struct action_directive_parser
+: public unary<T, parser<action_directive_parser<T, ActionParserT> > >
+{
+ typedef action_directive_parser<T, ActionParserT> self_t;
+ typedef action_directive_parser_gen<ActionParserT> parser_generator_t;
+ typedef unary_parser_category parser_category_t;
+
+ action_directive_parser(T const& a)
+ : unary<T, parser<action_directive_parser<T, ActionParserT> > >(a) {}
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<T, ScannerT>::type type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scanner) const
+ {
+ return this->subject().parse(scanner);
+ }
+
+ template <typename ActionT>
+ typename ActionParserT::template action<action_directive_parser<T, ActionParserT>, ActionT>
+ operator[](ActionT const& actor) const
+ {
+ typedef typename
+ ActionParserT::template action<action_directive_parser, ActionT>
+ action_t;
+ return action_t(*this, actor);
+ }
+};
+
+//////////////////////////////////
+template <typename ActionParserT>
+struct action_directive_parser_gen
+{
+ template <typename T>
+ struct result {
+
+ typedef action_directive_parser<T, ActionParserT> type;
+ };
+
+ template <typename T>
+ static action_directive_parser<T, ActionParserT>
+ generate(parser<T> const& s)
+ {
+ return action_directive_parser<T, ActionParserT>(s.derived());
+ }
+
+ template <typename T>
+ action_directive_parser<T, ActionParserT>
+ operator[](parser<T> const& s) const
+ {
+ return action_directive_parser<T, ActionParserT>(s.derived());
+ }
+};
+
+//////////////////////////////////
+// Calls the attached action passing it the match from the parser
+// and the first and last iterators.
+// The inner template class is used to simulate template-template parameters
+// (declared in common_fwd.hpp).
+template <typename ParserT, typename ActionT>
+struct access_match_action::action
+: public unary<ParserT, parser<access_match_action::action<ParserT, ActionT> > >
+{
+ typedef action_parser_category parser_category;
+ typedef action<ParserT, ActionT> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ action( ParserT const& subject,
+ ActionT const& actor_);
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scanner) const;
+
+ ActionT const &predicate() const;
+
+ private:
+ ActionT actor;
+};
+
+//////////////////////////////////
+template <typename ParserT, typename ActionT>
+access_match_action::action<ParserT, ActionT>::action(
+ ParserT const& subject,
+ ActionT const& actor_)
+: unary<ParserT, parser<access_match_action::action<ParserT, ActionT> > >(subject)
+, actor(actor_)
+{}
+
+//////////////////////////////////
+template <typename ParserT, typename ActionT>
+template <typename ScannerT>
+typename parser_result<access_match_action::action<ParserT, ActionT>, ScannerT>::type
+access_match_action::action<ParserT, ActionT>::
+parse(ScannerT const& scan) const
+{
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ if (!scan.at_end())
+ {
+ iterator_t save = scan.first;
+ result_t hit = this->subject().parse(scan);
+ actor(hit, save, scan.first);
+ return hit;
+ }
+ return scan.no_match();
+}
+
+//////////////////////////////////
+template <typename ParserT, typename ActionT>
+ActionT const &access_match_action::action<ParserT, ActionT>::predicate() const
+{
+ return actor;
+}
+
+//////////////////////////////////
+const action_directive_parser_gen<access_match_action> access_match_d
+ = action_directive_parser_gen<access_match_action>();
+
+
+
+//////////////////////////////////
+// Calls the attached action passing it the node from the parser
+// and the first and last iterators
+// The inner template class is used to simulate template-template parameters
+// (declared in common_fwd.hpp).
+template <typename ParserT, typename ActionT>
+struct access_node_action::action
+: public unary<ParserT, parser<access_node_action::action<ParserT, ActionT> > >
+{
+ typedef action_parser_category parser_category;
+ typedef action<ParserT, ActionT> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type type;
+ };
+
+ action( ParserT const& subject,
+ ActionT const& actor_);
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scanner) const;
+
+ ActionT const &predicate() const;
+
+ private:
+ ActionT actor;
+};
+
+//////////////////////////////////
+template <typename ParserT, typename ActionT>
+access_node_action::action<ParserT, ActionT>::action(
+ ParserT const& subject,
+ ActionT const& actor_)
+: unary<ParserT, parser<access_node_action::action<ParserT, ActionT> > >(subject)
+, actor(actor_)
+{}
+
+//////////////////////////////////
+template <typename ParserT, typename ActionT>
+template <typename ScannerT>
+typename parser_result<access_node_action::action<ParserT, ActionT>, ScannerT>::type
+access_node_action::action<ParserT, ActionT>::
+parse(ScannerT const& scan) const
+{
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ if (!scan.at_end())
+ {
+ iterator_t save = scan.first;
+ result_t hit = this->subject().parse(scan);
+ if (hit && hit.trees.size() > 0)
+ actor(*hit.trees.begin(), save, scan.first);
+ return hit;
+ }
+ return scan.no_match();
+}
+
+//////////////////////////////////
+template <typename ParserT, typename ActionT>
+ActionT const &access_node_action::action<ParserT, ActionT>::predicate() const
+{
+ return actor;
+}
+
+//////////////////////////////////
+const action_directive_parser_gen<access_node_action> access_node_d
+ = action_directive_parser_gen<access_node_action>();
+
+
+
+//////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// tree_parse_info
+//
+// Results returned by the tree parse functions:
+//
+// stop: points to the final parse position (i.e parsing
+// processed the input up to this point).
+//
+// match: true if parsing is successful. This may be full:
+// the parser consumed all the input, or partial:
+// the parser consumed only a portion of the input.
+//
+// full: true when we have a full match (i.e the parser
+// consumed all the input.
+//
+// length: The number of characters consumed by the parser.
+// This is valid only if we have a successful match
+// (either partial or full). A negative value means
+// that the match is unsucessful.
+//
+// trees: Contains the root node(s) of the tree.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename IteratorT,
+ typename NodeFactoryT,
+ typename T
+>
+struct tree_parse_info
+{
+ IteratorT stop;
+ bool match;
+ bool full;
+ std::size_t length;
+ typename tree_match<IteratorT, NodeFactoryT, T>::container_t trees;
+
+ tree_parse_info()
+ : stop()
+ , match(false)
+ , full(false)
+ , length(0)
+ , trees()
+ {}
+
+ template <typename IteratorT2>
+ tree_parse_info(tree_parse_info<IteratorT2> const& pi)
+ : stop(pi.stop)
+ , match(pi.match)
+ , full(pi.full)
+ , length(pi.length)
+ , trees()
+ {
+ using std::swap;
+ using boost::swap;
+ using BOOST_SPIRIT_CLASSIC_NS::swap;
+
+ // use auto_ptr like ownership for the trees data member
+ swap(trees, pi.trees);
+ }
+
+ tree_parse_info(
+ IteratorT stop_,
+ bool match_,
+ bool full_,
+ std::size_t length_,
+ typename tree_match<IteratorT, NodeFactoryT, T>::container_t trees_)
+ : stop(stop_)
+ , match(match_)
+ , full(full_)
+ , length(length_)
+ , trees()
+ {
+ using std::swap;
+ using boost::swap;
+ using BOOST_SPIRIT_CLASSIC_NS::swap;
+
+ // use auto_ptr like ownership for the trees data member
+ swap(trees, trees_);
+ }
+};
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/tree/common_fwd.hpp b/boost/spirit/home/classic/tree/common_fwd.hpp
new file mode 100644
index 0000000000..1388e53b7f
--- /dev/null
+++ b/boost/spirit/home/classic/tree/common_fwd.hpp
@@ -0,0 +1,96 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_TREE_COMMON_FWD_HPP)
+#define BOOST_SPIRIT_TREE_COMMON_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/nil.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <typename T>
+ struct tree_node;
+
+ template <typename IteratorT = char const*, typename ValueT = nil_t>
+ struct node_iter_data;
+
+ template <typename ValueT = nil_t>
+ class node_iter_data_factory;
+
+ template <typename ValueT = nil_t>
+ class node_val_data_factory;
+
+ template <typename ValueT = nil_t>
+ class node_all_val_data_factory;
+
+ template <
+ typename IteratorT,
+ typename NodeFactoryT = node_val_data_factory<nil_t>,
+ typename T = nil_t
+ >
+ class tree_match;
+
+ struct tree_policy;
+
+ template <
+ typename MatchPolicyT,
+ typename IteratorT,
+ typename NodeFactoryT,
+ typename TreePolicyT,
+ typename T = nil_t
+ >
+ struct common_tree_match_policy;
+
+ template <typename MatchPolicyT, typename NodeFactoryT>
+ struct common_tree_tree_policy;
+
+ template <typename T>
+ struct no_tree_gen_node_parser;
+
+ template <typename T>
+ struct leaf_node_parser;
+
+ template <typename T, typename NodeParserT>
+ struct node_parser;
+
+ struct discard_node_op;
+ struct reduced_node_op;
+ struct infix_node_op;
+ struct discard_first_node_op;
+ struct discard_last_node_op;
+ struct inner_node_op;
+
+ template <typename T, typename ActionParserT>
+ struct action_directive_parser;
+
+ struct access_match_action
+ {
+ template <typename ParserT, typename ActionT>
+ struct action;
+ };
+
+ struct access_node_action
+ {
+ template <typename ParserT, typename ActionT>
+ struct action;
+ };
+
+ template <
+ typename IteratorT = char const *,
+ typename NodeFactoryT = node_val_data_factory<nil_t>,
+ typename T = nil_t
+ >
+ struct tree_parse_info;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/tree/impl/parse_tree_utils.ipp b/boost/spirit/home/classic/tree/impl/parse_tree_utils.ipp
new file mode 100644
index 0000000000..02725208eb
--- /dev/null
+++ b/boost/spirit/home/classic/tree/impl/parse_tree_utils.ipp
@@ -0,0 +1,135 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Hartmut Kaiser
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+
+#if !defined(PARSE_TREE_UTILS_IPP)
+#define PARSE_TREE_UTILS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost {
+namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Returnes the first leaf node of the given parsetree.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+inline tree_node<T> const &
+get_first_leaf (tree_node<T> const &node)
+{
+ if (node.children.size() > 0)
+ return get_first_leaf(*node.children.begin());
+ return node;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Find a specified node through recursive search.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+inline bool
+find_node (tree_node<T> const &node, parser_id node_to_search,
+ tree_node<T> const **found_node)
+{
+ if (node.value.id() == node_to_search) {
+ *found_node = &node;
+ return true;
+ }
+ if (node.children.size() > 0) {
+ typedef typename tree_node<T>::const_tree_iterator const_tree_iterator;
+
+ const_tree_iterator end = node.children.end();
+ for (const_tree_iterator it = node.children.begin(); it != end; ++it)
+ {
+ if (find_node (*it, node_to_search, found_node))
+ return true;
+ }
+ }
+ return false; // not found here
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The functions 'get_node_range' return a pair of iterators pointing at the
+// range, which containes the elements of a specified node.
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+template <typename T>
+inline bool
+get_node_range (typename tree_node<T>::const_tree_iterator const &start,
+ parser_id node_to_search,
+ std::pair<typename tree_node<T>::const_tree_iterator,
+ typename tree_node<T>::const_tree_iterator> &nodes)
+{
+// look at this node first
+tree_node<T> const &node = *start;
+
+ if (node.value.id() == node_to_search) {
+ if (node.children.size() > 0) {
+ // full subrange
+ nodes.first = node.children.begin();
+ nodes.second = node.children.end();
+ }
+ else {
+ // only this node
+ nodes.first = start;
+ nodes.second = start;
+ std::advance(nodes.second, 1);
+ }
+ return true;
+ }
+
+// look at subnodes now
+ if (node.children.size() > 0) {
+ typedef typename tree_node<T>::const_tree_iterator const_tree_iterator;
+
+ const_tree_iterator end = node.children.end();
+ for (const_tree_iterator it = node.children.begin(); it != end; ++it)
+ {
+ if (impl::get_node_range<T>(it, node_to_search, nodes))
+ return true;
+ }
+ }
+ return false;
+}
+
+} // end of namespace impl
+
+template <typename T>
+inline bool
+get_node_range (tree_node<T> const &node, parser_id node_to_search,
+ std::pair<typename tree_node<T>::const_tree_iterator,
+ typename tree_node<T>::const_tree_iterator> &nodes)
+{
+ if (node.children.size() > 0) {
+ typedef typename tree_node<T>::const_tree_iterator const_tree_iterator;
+
+ const_tree_iterator end = node.children.end();
+ for (const_tree_iterator it = node.children.begin(); it != end; ++it)
+ {
+ if (impl::get_node_range<T>(it, node_to_search, nodes))
+ return true;
+ }
+ }
+ return false;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+} // namespace spirit
+} // namespace boost
+
+#endif // !defined(PARSE_TREE_UTILS_IPP)
diff --git a/boost/spirit/home/classic/tree/impl/tree_to_xml.ipp b/boost/spirit/home/classic/tree/impl/tree_to_xml.ipp
new file mode 100644
index 0000000000..2f0da8bf44
--- /dev/null
+++ b/boost/spirit/home/classic/tree/impl/tree_to_xml.ipp
@@ -0,0 +1,526 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ 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)
+=============================================================================*/
+
+#if !defined(TREE_TO_XML_IPP)
+#define TREE_TO_XML_IPP
+
+#include <cstdio>
+#include <cstdarg>
+#include <locale>
+#include <string>
+#include <cstring>
+
+#include <map>
+#include <iostream>
+#include <boost/config.hpp>
+#include <boost/assert.hpp>
+
+#ifdef BOOST_NO_STRINGSTREAM
+#include <strstream>
+#define BOOST_SPIRIT_OSSTREAM std::ostrstream
+inline
+std::string BOOST_SPIRIT_GETSTRING(std::ostrstream& ss)
+{
+ ss << std::ends;
+ std::string rval = ss.str();
+ ss.freeze(false);
+ return rval;
+}
+#else
+#include <sstream>
+#define BOOST_SPIRIT_GETSTRING(ss) ss.str()
+#define BOOST_SPIRIT_OSSTREAM std::basic_ostringstream<CharT>
+#endif
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace impl {
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT>
+ struct string_lit;
+
+ template <>
+ struct string_lit<char>
+ {
+ static char get(char c) { return c; }
+ static std::string get(char const* str = "") { return str; }
+ };
+
+ template <>
+ struct string_lit<wchar_t>
+ {
+ static wchar_t get(char c)
+ {
+ typedef std::ctype<wchar_t> ctype_t;
+ return std::use_facet<ctype_t>(std::locale()).widen(c);
+ }
+ static std::basic_string<wchar_t> get(char const* source = "")
+ {
+ using namespace std; // some systems have size_t in ns std
+ size_t len = strlen(source);
+ std::auto_ptr<wchar_t> result (new wchar_t[len+1]);
+ result.get()[len] = '\0';
+
+ // working with wide character streams is supported only if the
+ // platform provides the std::ctype<wchar_t> facet
+ BOOST_ASSERT(std::has_facet<std::ctype<wchar_t> >(std::locale()));
+
+ std::use_facet<std::ctype<wchar_t> >(std::locale())
+ .widen(source, source + len, result.get());
+ return result.get();
+ }
+ };
+}
+
+// xml formatting helper classes
+namespace xml {
+
+ template <typename CharT>
+ inline void
+ encode (std::basic_string<CharT> &str, char s, char const *r, int len)
+ {
+ typedef typename std::basic_string<CharT>::size_type size_type;
+
+ size_type pos = 0;
+ while ((pos = str.find_first_of (impl::string_lit<CharT>::get(s), pos)) !=
+ size_type(std::basic_string<CharT>::npos))
+ {
+ str.replace (pos, 1, impl::string_lit<CharT>::get(r));
+ pos += len;
+ }
+ }
+
+ template <typename CharT>
+ inline std::basic_string<CharT>
+ encode (std::basic_string<CharT> str)
+ {
+ encode(str, '&', "&amp;", 3);
+ encode(str, '<', "&lt;", 2);
+ encode(str, '>', "&gt;", 2);
+ encode(str, '\r', "\\r", 1);
+ encode(str, '\n', "\\n", 1);
+ return str;
+ }
+
+ template <typename CharT>
+ inline std::basic_string<CharT>
+ encode (CharT const *text)
+ {
+ return encode (std::basic_string<CharT>(text));
+ }
+
+ // format a xml attribute
+ template <typename CharT>
+ struct attribute
+ {
+ attribute()
+ {
+ }
+
+ attribute (std::basic_string<CharT> const& key_,
+ std::basic_string<CharT> const& value_)
+ : key (key_), value(value_)
+ {
+ }
+
+ bool has_value()
+ {
+ return value.size() > 0;
+ }
+
+ std::basic_string<CharT> key;
+ std::basic_string<CharT> value;
+ };
+
+ template <typename CharT>
+ inline std::basic_ostream<CharT>&
+ operator<< (std::basic_ostream<CharT> &ostrm, attribute<CharT> const &attr)
+ {
+ if (0 == attr.key.size())
+ return ostrm;
+ ostrm << impl::string_lit<CharT>::get(" ") << encode(attr.key)
+ << impl::string_lit<CharT>::get("=\"") << encode(attr.value)
+ << impl::string_lit<CharT>::get("\"");
+ return ostrm;
+ }
+
+ // output a xml element (base class, not used directly)
+ template <typename CharT>
+ class element
+ {
+ protected:
+ element(std::basic_ostream<CharT> &ostrm_, bool incr_indent_ = true)
+ : ostrm(ostrm_), incr_indent(incr_indent_)
+ {
+ if (incr_indent) ++get_indent();
+ }
+ ~element()
+ {
+ if (incr_indent) --get_indent();
+ }
+
+ public:
+ void output_space ()
+ {
+ for (int i = 0; i < get_indent(); i++)
+ ostrm << impl::string_lit<CharT>::get(" ");
+ }
+
+ protected:
+ int &get_indent()
+ {
+ static int indent;
+
+ return indent;
+ }
+
+ std::basic_ostream<CharT> &ostrm;
+ bool incr_indent;
+ };
+
+ // a xml node
+ template <typename CharT>
+ class node : public element<CharT>
+ {
+ public:
+ node (std::basic_ostream<CharT> &ostrm_,
+ std::basic_string<CharT> const& tag_, attribute<CharT> &attr)
+ : element<CharT>(ostrm_), tag(tag_)
+ {
+ this->output_space();
+ this->ostrm
+ << impl::string_lit<CharT>::get("<") << tag_ << attr
+ << impl::string_lit<CharT>::get(">\n");
+ }
+ node (std::basic_ostream<CharT> &ostrm_,
+ std::basic_string<CharT> const& tag_)
+ : element<CharT>(ostrm_), tag(tag_)
+ {
+ this->output_space();
+ this->ostrm
+ << impl::string_lit<CharT>::get("<") << tag_
+ << impl::string_lit<CharT>::get(">\n");
+ }
+ ~node()
+ {
+ this->output_space();
+ this->ostrm
+ << impl::string_lit<CharT>::get("</") << tag
+ << impl::string_lit<CharT>::get(">\n");
+ }
+
+ private:
+ std::basic_string<CharT> tag;
+ };
+
+ template <typename CharT>
+ class text : public element<CharT>
+ {
+ public:
+ text (std::basic_ostream<CharT> &ostrm_,
+ std::basic_string<CharT> const& tag,
+ std::basic_string<CharT> const& textlit)
+ : element<CharT>(ostrm_)
+ {
+ this->output_space();
+ this->ostrm
+ << impl::string_lit<CharT>::get("<") << tag
+ << impl::string_lit<CharT>::get(">") << encode(textlit)
+ << impl::string_lit<CharT>::get("</") << tag
+ << impl::string_lit<CharT>::get(">\n");
+ }
+
+ text (std::basic_ostream<CharT> &ostrm_,
+ std::basic_string<CharT> const& tag,
+ std::basic_string<CharT> const& textlit,
+ attribute<CharT> &attr)
+ : element<CharT>(ostrm_)
+ {
+ this->output_space();
+ this->ostrm
+ << impl::string_lit<CharT>::get("<") << tag << attr
+ << impl::string_lit<CharT>::get(">") << encode(textlit)
+ << impl::string_lit<CharT>::get("</") << tag
+ << impl::string_lit<CharT>::get(">\n");
+ }
+
+ text (std::basic_ostream<CharT> &ostrm_,
+ std::basic_string<CharT> const& tag,
+ std::basic_string<CharT> const& textlit,
+ attribute<CharT> &attr1, attribute<CharT> &attr2)
+ : element<CharT>(ostrm_)
+ {
+ this->output_space();
+ this->ostrm
+ << impl::string_lit<CharT>::get("<") << tag << attr1 << attr2
+ << impl::string_lit<CharT>::get(">") << encode(textlit)
+ << impl::string_lit<CharT>::get("</") << tag
+ << impl::string_lit<CharT>::get(">\n");
+ }
+ };
+
+ // a xml comment
+ template <typename CharT>
+ class comment : public element<CharT>
+ {
+ public:
+ comment (std::basic_ostream<CharT> &ostrm_,
+ std::basic_string<CharT> const& commentlit)
+ : element<CharT>(ostrm_, false)
+ {
+ if ('\0' != commentlit[0])
+ {
+ this->output_space();
+ this->ostrm << impl::string_lit<CharT>::get("<!-- ")
+ << encode(commentlit)
+ << impl::string_lit<CharT>::get(" -->\n");
+ }
+ }
+ };
+
+ // a xml document
+ template <typename CharT>
+ class document : public element<CharT>
+ {
+ public:
+ document (std::basic_ostream<CharT> &ostrm_)
+ : element<CharT>(ostrm_)
+ {
+ this->get_indent() = -1;
+ this->ostrm << impl::string_lit<CharT>::get(
+ "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
+ }
+
+ document (std::basic_ostream<CharT> &ostrm_,
+ std::basic_string<CharT> const& mainnode,
+ std::basic_string<CharT> const& dtd)
+ : element<CharT>(ostrm_)
+ {
+ this->get_indent() = -1;
+ this->ostrm << impl::string_lit<CharT>::get(
+ "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
+
+ this->output_space();
+ this->ostrm << impl::string_lit<CharT>::get("<!DOCTYPE ") << mainnode
+ << impl::string_lit<CharT>::get(" SYSTEM \"") << dtd
+ << impl::string_lit<CharT>::get("\">\n");
+ }
+ ~document()
+ {
+ BOOST_SPIRIT_ASSERT(-1 == this->get_indent());
+ }
+ };
+
+} // end of namespace xml
+
+namespace impl {
+
+ ///////////////////////////////////////////////////////////////////////////
+ // look up the rule name from the given parser_id
+ template <typename AssocContainerT>
+ inline typename AssocContainerT::value_type::second_type
+ get_rulename (AssocContainerT const &id_to_name_map,
+ BOOST_SPIRIT_CLASSIC_NS::parser_id const &id)
+ {
+ typename AssocContainerT::const_iterator it = id_to_name_map.find(id);
+ if (it != id_to_name_map.end())
+ return (*it).second;
+ typedef typename AssocContainerT::value_type::second_type second_t;
+ return second_t();
+ }
+
+ // dump a parse tree as xml
+ template <
+ typename CharT, typename IteratorT, typename GetIdT, typename GetValueT
+ >
+ inline void
+ token_to_xml (std::basic_ostream<CharT> &ostrm, IteratorT const &it,
+ bool is_root, GetIdT const &get_token_id, GetValueT const &get_token_value)
+ {
+ BOOST_SPIRIT_OSSTREAM stream;
+
+ stream << get_token_id(*it) << std::ends;
+ xml::attribute<CharT> token_id (
+ impl::string_lit<CharT>::get("id"),
+ BOOST_SPIRIT_GETSTRING(stream).c_str());
+ xml::attribute<CharT> is_root_attr (
+ impl::string_lit<CharT>::get("is_root"),
+ impl::string_lit<CharT>::get(is_root ? "1" : ""));
+ xml::attribute<CharT> nil;
+ xml::text<CharT>(ostrm,
+ impl::string_lit<CharT>::get("token"),
+ get_token_value(*it).c_str(),
+ token_id,
+ is_root_attr.has_value() ? is_root_attr : nil);
+ }
+
+ template <
+ typename CharT, typename TreeNodeT, typename AssocContainerT,
+ typename GetIdT, typename GetValueT
+ >
+ inline void
+ tree_node_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &node,
+ AssocContainerT const& id_to_name_map, GetIdT const &get_token_id,
+ GetValueT const &get_token_value)
+ {
+ typedef typename TreeNodeT::const_iterator node_iter_t;
+ typedef
+ typename TreeNodeT::value_type::parse_node_t::const_iterator_t
+ value_iter_t;
+
+ xml::attribute<CharT> nil;
+ node_iter_t end = node.end();
+ for (node_iter_t it = node.begin(); it != end; ++it)
+ {
+ // output a node
+ xml::attribute<CharT> id (
+ impl::string_lit<CharT>::get("rule"),
+ get_rulename(id_to_name_map, (*it).value.id()).c_str());
+ xml::node<CharT> currnode (ostrm,
+ impl::string_lit<CharT>::get("parsenode"),
+ (*it).value.id() != 0 && id.has_value() ? id : nil);
+
+ // first dump the value
+ std::size_t cnt = std::distance((*it).value.begin(), (*it).value.end());
+
+ if (1 == cnt)
+ {
+ token_to_xml (ostrm, (*it).value.begin(),
+ (*it).value.is_root(), get_token_id, get_token_value);
+ }
+ else if (cnt > 1)
+ {
+ xml::node<CharT> value (ostrm,
+ impl::string_lit<CharT>::get("value"));
+ bool is_root = (*it).value.is_root();
+
+ value_iter_t val_end = (*it).value.end();
+ for (value_iter_t val_it = (*it).value.begin();
+ val_it != val_end; ++val_it)
+ {
+ token_to_xml (ostrm, val_it, is_root, get_token_id,
+ get_token_value);
+ }
+ }
+ tree_node_to_xml(ostrm, (*it).children, id_to_name_map,
+ get_token_id, get_token_value); // dump all subnodes
+ }
+ }
+
+ template <typename CharT, typename TreeNodeT, typename AssocContainerT>
+ inline void
+ tree_node_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &node,
+ AssocContainerT const& id_to_name_map)
+ {
+ typedef typename TreeNodeT::const_iterator node_iter_t;
+
+ xml::attribute<CharT> nil;
+ node_iter_t end = node.end();
+ for (node_iter_t it = node.begin(); it != end; ++it)
+ {
+ // output a node
+ xml::attribute<CharT> id (
+ impl::string_lit<CharT>::get("rule"),
+ get_rulename(id_to_name_map, (*it).value.id()).c_str());
+ xml::node<CharT> currnode (ostrm,
+ impl::string_lit<CharT>::get("parsenode"),
+ (*it).value.id() != parser_id() && id.has_value() ? id : nil);
+
+ // first dump the value
+ if ((*it).value.begin() != (*it).value.end())
+ {
+ std::basic_string<CharT> tokens ((*it).value.begin(), (*it).value.end());
+
+ if (tokens.size() > 0)
+ {
+ // output all subtokens as one string (for better readability)
+ xml::attribute<CharT> is_root (
+ impl::string_lit<CharT>::get("is_root"),
+ impl::string_lit<CharT>::get((*it).value.is_root() ? "1" : ""));
+ xml::text<CharT>(ostrm,
+ impl::string_lit<CharT>::get("value"), tokens.c_str(),
+ is_root.has_value() ? is_root : nil);
+ }
+
+ }
+ // dump all subnodes
+ tree_node_to_xml(ostrm, (*it).children, id_to_name_map);
+ }
+ }
+
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+// dump a parse tree as a xml stream (generic variant)
+template <
+ typename CharT, typename TreeNodeT, typename AssocContainerT,
+ typename GetIdT, typename GetValueT
+>
+inline void
+basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree,
+std::basic_string<CharT> const &input_line, AssocContainerT const& id_to_name,
+ GetIdT const &get_token_id, GetValueT const &get_token_value)
+{
+ // generate xml dump
+ xml::document<CharT> doc (ostrm,
+ impl::string_lit<CharT>::get("parsetree"),
+ impl::string_lit<CharT>::get("parsetree.dtd"));
+ xml::comment<CharT> input (ostrm, input_line.c_str());
+ xml::attribute<CharT> ver (
+ impl::string_lit<CharT>::get("version"),
+ impl::string_lit<CharT>::get("1.0"));
+ xml::node<CharT> mainnode (ostrm,
+ impl::string_lit<CharT>::get("parsetree"), ver);
+
+ impl::tree_node_to_xml (ostrm, tree, id_to_name, get_token_id,
+ get_token_value);
+}
+
+// dump a parse tree as a xml steam (for character based parsers)
+template <typename CharT, typename TreeNodeT, typename AssocContainerT>
+inline void
+basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree,
+ std::basic_string<CharT> const &input_line,
+ AssocContainerT const& id_to_name)
+{
+ // generate xml dump
+ xml::document<CharT> doc (ostrm,
+ impl::string_lit<CharT>::get("parsetree"),
+ impl::string_lit<CharT>::get("parsetree.dtd"));
+ xml::comment<CharT> input (ostrm, input_line.c_str());
+ xml::attribute<CharT> ver (
+ impl::string_lit<CharT>::get("version"),
+ impl::string_lit<CharT>::get("1.0"));
+ xml::node<CharT> mainnode (ostrm,
+ impl::string_lit<CharT>::get("parsetree"), ver);
+
+ impl::tree_node_to_xml(ostrm, tree, id_to_name);
+}
+
+template <typename CharT, typename TreeNodeT>
+inline void
+basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree,
+ std::basic_string<CharT> const &input_line)
+{
+ return basic_tree_to_xml<CharT>(ostrm, tree, input_line,
+ std::map<BOOST_SPIRIT_CLASSIC_NS::parser_id, std::basic_string<CharT> >());
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#undef BOOST_SPIRIT_OSSTREAM
+#undef BOOST_SPIRIT_GETSTRING
+
+#endif // !defined(PARSE_TREE_XML_HPP)
diff --git a/boost/spirit/home/classic/tree/parse_tree.hpp b/boost/spirit/home/classic/tree/parse_tree.hpp
new file mode 100644
index 0000000000..dcca9b3fb4
--- /dev/null
+++ b/boost/spirit/home/classic/tree/parse_tree.hpp
@@ -0,0 +1,296 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2001-2007 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_TREE_PARSE_TREE_HPP
+#define BOOST_SPIRIT_TREE_PARSE_TREE_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/tree/common.hpp>
+#include <boost/spirit/home/classic/core/scanner/scanner.hpp>
+
+#include <boost/spirit/home/classic/tree/parse_tree_fwd.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+//////////////////////////////////
+// pt_match_policy is simply an id so the correct specialization of tree_policy can be found.
+template <
+ typename IteratorT,
+ typename NodeFactoryT,
+ typename T
+>
+struct pt_match_policy :
+ public common_tree_match_policy<
+ pt_match_policy<IteratorT, NodeFactoryT, T>,
+ IteratorT,
+ NodeFactoryT,
+ pt_tree_policy<
+ pt_match_policy<IteratorT, NodeFactoryT, T>,
+ NodeFactoryT,
+ T
+ >,
+ T
+ >
+{
+ typedef
+ common_tree_match_policy<
+ pt_match_policy<IteratorT, NodeFactoryT, T>,
+ IteratorT,
+ NodeFactoryT,
+ pt_tree_policy<
+ pt_match_policy<IteratorT, NodeFactoryT, T>,
+ NodeFactoryT,
+ T
+ >,
+ T
+ >
+ common_tree_match_policy_;
+
+ pt_match_policy()
+ {
+ }
+
+ template <typename PolicyT>
+ pt_match_policy(PolicyT const & policies)
+ : common_tree_match_policy_(policies)
+ {
+ }
+};
+
+//////////////////////////////////
+template <typename MatchPolicyT, typename NodeFactoryT, typename T>
+struct pt_tree_policy :
+ public common_tree_tree_policy<MatchPolicyT, NodeFactoryT>
+{
+ typedef typename MatchPolicyT::match_t match_t;
+ typedef typename MatchPolicyT::iterator_t iterator_t;
+
+ template<typename MatchAT, typename MatchBT>
+ static void concat(MatchAT& a, MatchBT const& b)
+ {
+ typedef typename match_t::attr_t attr_t;
+ BOOST_SPIRIT_ASSERT(a && b);
+
+ std::copy(b.trees.begin(), b.trees.end(),
+ std::back_insert_iterator<typename match_t::container_t>(a.trees));
+ }
+
+ template <typename MatchT, typename Iterator1T, typename Iterator2T>
+ static void group_match(MatchT& m, parser_id const& id,
+ Iterator1T const& first, Iterator2T const& last)
+ {
+ if (!m)
+ return;
+
+ typedef typename NodeFactoryT::template factory<iterator_t> factory_t;
+ typedef typename tree_match<iterator_t, NodeFactoryT, T>::container_t
+ container_t;
+ typedef typename container_t::iterator cont_iterator_t;
+
+ match_t newmatch(m.length(),
+ factory_t::create_node(first, last, false));
+
+ std::swap(newmatch.trees.begin()->children, m.trees);
+ // set this node and all it's unset children's rule_id
+ newmatch.trees.begin()->value.id(id);
+ for (cont_iterator_t i = newmatch.trees.begin()->children.begin();
+ i != newmatch.trees.begin()->children.end();
+ ++i)
+ {
+ if (i->value.id() == 0)
+ i->value.id(id);
+ }
+ m = newmatch;
+ }
+
+ template <typename FunctorT, typename MatchT>
+ static void apply_op_to_match(FunctorT const& op, MatchT& m)
+ {
+ op(m);
+ }
+};
+
+namespace impl {
+
+ template <typename IteratorT, typename NodeFactoryT, typename T>
+ struct tree_policy_selector<pt_match_policy<IteratorT, NodeFactoryT, T> >
+ {
+ typedef pt_tree_policy<
+ pt_match_policy<IteratorT, NodeFactoryT, T>,
+ NodeFactoryT,
+ T
+ > type;
+ };
+
+} // namespace impl
+
+
+//////////////////////////////////
+struct gen_pt_node_parser_gen;
+
+template <typename T>
+struct gen_pt_node_parser
+: public unary<T, parser<gen_pt_node_parser<T> > >
+{
+ typedef gen_pt_node_parser<T> self_t;
+ typedef gen_pt_node_parser_gen parser_generator_t;
+ typedef unary_parser_category parser_category_t;
+
+ gen_pt_node_parser(T const& a)
+ : unary<T, parser<gen_pt_node_parser<T> > >(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename ScannerT::iteration_policy_t iteration_policy_t;
+ typedef typename ScannerT::match_policy_t::iterator_t iterator_t;
+ typedef typename ScannerT::match_policy_t::factory_t factory_t;
+ typedef pt_match_policy<iterator_t, factory_t> match_policy_t;
+ typedef typename ScannerT::action_policy_t action_policy_t;
+ typedef scanner_policies<
+ iteration_policy_t,
+ match_policy_t,
+ action_policy_t
+ > policies_t;
+
+ return this->subject().parse(scan.change_policies(policies_t(scan)));
+ }
+};
+
+//////////////////////////////////
+struct gen_pt_node_parser_gen
+{
+ template <typename T>
+ struct result {
+
+ typedef gen_pt_node_parser<T> type;
+ };
+
+ template <typename T>
+ static gen_pt_node_parser<T>
+ generate(parser<T> const& s)
+ {
+ return gen_pt_node_parser<T>(s.derived());
+ }
+
+ template <typename T>
+ gen_pt_node_parser<T>
+ operator[](parser<T> const& s) const
+ {
+ return gen_pt_node_parser<T>(s.derived());
+ }
+};
+
+//////////////////////////////////
+const gen_pt_node_parser_gen gen_pt_node_d = gen_pt_node_parser_gen();
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Parse functions for parse trees
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename NodeFactoryT, typename IteratorT, typename ParserT,
+ typename SkipT
+>
+inline tree_parse_info<IteratorT, NodeFactoryT>
+pt_parse(
+ IteratorT const& first_,
+ IteratorT const& last,
+ parser<ParserT> const& p,
+ SkipT const& skip,
+ NodeFactoryT const& /*dummy_*/ = NodeFactoryT())
+{
+ typedef skip_parser_iteration_policy<SkipT> iter_policy_t;
+ typedef pt_match_policy<IteratorT, NodeFactoryT> pt_match_policy_t;
+ typedef
+ scanner_policies<iter_policy_t, pt_match_policy_t>
+ scanner_policies_t;
+ typedef scanner<IteratorT, scanner_policies_t> scanner_t;
+
+ iter_policy_t iter_policy(skip);
+ scanner_policies_t policies(iter_policy);
+ IteratorT first = first_;
+ scanner_t scan(first, last, policies);
+ tree_match<IteratorT, NodeFactoryT> hit = p.derived().parse(scan);
+ return tree_parse_info<IteratorT, NodeFactoryT>(
+ first, hit, hit && (first == last), hit.length(), hit.trees);
+}
+
+template <typename IteratorT, typename ParserT, typename SkipT>
+inline tree_parse_info<IteratorT>
+pt_parse(
+ IteratorT const& first,
+ IteratorT const& last,
+ parser<ParserT> const& p,
+ SkipT const& skip)
+{
+ typedef node_val_data_factory<nil_t> default_node_factory_t;
+ return pt_parse(first, last, p, skip, default_node_factory_t());
+}
+
+//////////////////////////////////
+template <typename IteratorT, typename ParserT>
+inline tree_parse_info<IteratorT>
+pt_parse(
+ IteratorT const& first_,
+ IteratorT const& last,
+ parser<ParserT> const& parser)
+{
+ typedef pt_match_policy<IteratorT> pt_match_policy_t;
+ IteratorT first = first_;
+ scanner<
+ IteratorT,
+ scanner_policies<iteration_policy, pt_match_policy_t>
+ > scan(first, last);
+ tree_match<IteratorT> hit = parser.derived().parse(scan);
+ return tree_parse_info<IteratorT>(
+ first, hit, hit && (first == last), hit.length(), hit.trees);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT, typename SkipT>
+inline tree_parse_info<CharT const*>
+pt_parse(
+ CharT const* str,
+ parser<ParserT> const& p,
+ SkipT const& skip)
+{
+ CharT const* last = str;
+ while (*last)
+ last++;
+ return pt_parse(str, last, p, skip);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline tree_parse_info<CharT const*>
+pt_parse(
+ CharT const* str,
+ parser<ParserT> const& parser)
+{
+ CharT const* last = str;
+ while (*last)
+ {
+ last++;
+ }
+ return pt_parse(str, last, parser);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/tree/parse_tree_fwd.hpp b/boost/spirit/home/classic/tree/parse_tree_fwd.hpp
new file mode 100644
index 0000000000..5e994594ab
--- /dev/null
+++ b/boost/spirit/home/classic/tree/parse_tree_fwd.hpp
@@ -0,0 +1,39 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_TREE_PARSE_TREE_FWD_HPP)
+#define BOOST_SPIRIT_TREE_PARSE_TREE_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <
+ typename MatchPolicyT,
+ typename NodeFactoryT,
+ typename T = nil_t
+ >
+ struct pt_tree_policy;
+
+ template <
+ typename IteratorT,
+ typename NodeFactoryT = node_val_data_factory<nil_t>,
+ typename T = nil_t
+ >
+ struct pt_match_policy;
+
+ template <typename T>
+ struct gen_pt_node_parser;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/tree/parse_tree_utils.hpp b/boost/spirit/home/classic/tree/parse_tree_utils.hpp
new file mode 100644
index 0000000000..105d80eb13
--- /dev/null
+++ b/boost/spirit/home/classic/tree/parse_tree_utils.hpp
@@ -0,0 +1,64 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2001-2007 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(PARSE_TREE_UTILS_HPP)
+#define PARSE_TREE_UTILS_HPP
+
+#include <utility> // for std::pair
+
+#include <boost/spirit/home/classic/tree/parse_tree.hpp> // needed for parse tree generation
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost {
+namespace spirit {
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The function 'get_first_leaf' returnes a reference to the first leaf node
+// of the given parsetree.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+tree_node<T> const &
+get_first_leaf (tree_node<T> const &node);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The function 'find_node' finds a specified node through recursive search.
+// If the return value is true, the variable to which points the parameter
+// 'found_node' will contain the address of the node with the given rule_id.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+bool
+find_node (tree_node<T> const &node, parser_id node_to_search,
+ tree_node<T> const **found_node);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The function 'get_node_range' return a pair of iterators pointing at the
+// range, which containes the elements of a specified node. It's very useful
+// for locating all information related with a specified node.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+bool
+get_node_range (tree_node<T> const &node, parser_id node_to_search,
+ std::pair<typename tree_node<T>::const_tree_iterator,
+ typename tree_node<T>::const_tree_iterator> &nodes);
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+} // namespace spirit
+} // namespace boost
+
+#include "boost/spirit/home/classic/tree/impl/parse_tree_utils.ipp"
+
+#endif // !defined(PARSE_TREE_UTILS_HPP)
diff --git a/boost/spirit/home/classic/tree/parsetree.dtd b/boost/spirit/home/classic/tree/parsetree.dtd
new file mode 100644
index 0000000000..9d847c746c
--- /dev/null
+++ b/boost/spirit/home/classic/tree/parsetree.dtd
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- This DTD is used for the output of Spirit parse tree's through -->
+<!-- the boost::spirit::tree_to_xml functions. -->
+<!-- Copyright (c) 2001-2007 Hartmut Kaiser -->
+<!-- Distribution under the Boost Software -->
+<!-- License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -->
+<!-- http://www.boost.org/LICENSE_1_0.txt) -->
+<!ELEMENT parsetree (parsenode)>
+<!ATTLIST parsetree
+ version CDATA "1.0"
+>
+<!ELEMENT parsenode ((value | token)?, parsenode*)>
+<!ATTLIST parsenode
+ rule CDATA #IMPLIED
+>
+<!ELEMENT value (#PCDATA | token)*>
+<!ELEMENT token (#PCDATA)>
+<!ATTLIST token
+ id CDATA #REQUIRED
+ is_root CDATA "0"
+>
diff --git a/boost/spirit/home/classic/tree/tree_to_xml.hpp b/boost/spirit/home/classic/tree/tree_to_xml.hpp
new file mode 100644
index 0000000000..0ef3aa3bb7
--- /dev/null
+++ b/boost/spirit/home/classic/tree/tree_to_xml.hpp
@@ -0,0 +1,116 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Hartmut Kaiser
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(TREE_TO_XML_HPP)
+#define TREE_TO_XML_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl {
+ template <typename CharT> struct default_string;
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Dump a parse tree as a xml stream
+//
+// The functions 'tree_to_xml' can be used to output a parse tree as a xml
+// stream into the given ostream. The parameters have the following
+// meaning:
+//
+// mandatory parameters:
+// ostrm The output stream used for streaming the parse tree.
+// tree The parse tree to output.
+//
+// optional parameters:
+// input_line The input line from which the parse tree was
+// generated (if given, it is used to output a comment
+// containing this line).
+// id_to_name A map, which is used for converting the rule id's contained
+// in the parse tree to readable strings. Here a auxiliary
+// associative container can be used, which maps a rule_id to
+// a std::string (i.e. a std::map<rule_id, std::string>).
+// get_token_id
+// A function or functor, which takes an instance of a token
+// and which should return a token id (i.e. something like
+// 'int f(char const c)').
+// get_token_value
+// A function or functor, which takes an instance of a token
+// and which should return a readable representation of this
+// token (i.e. something like 'std::string f(char const c)').
+//
+// The structure of the generated xml stream conforms to the DTD given in the
+// file 'parsetree.dtd'. This file is located in the spirit/tree directory.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ template <
+ typename CharT, typename TreeNodeT, typename AssocContainerT,
+ typename GetIdT, typename GetValueT
+ >
+ inline void
+ basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree,
+ std::basic_string<CharT> const &input_line,
+ AssocContainerT const& id_to_name, GetIdT const &get_token_id,
+ GetValueT const &get_token_value);
+
+ template <typename CharT, typename TreeNodeT, typename AssocContainerT>
+ inline void
+ basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree,
+ std::basic_string<CharT> const &input_line,
+ AssocContainerT const& id_to_name);
+
+ template <typename CharT, typename TreeNodeT>
+ inline void
+ basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree,
+ std::basic_string<CharT> const &input_line =
+ impl::default_string<CharT>::get());
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename TreeNodeT, typename AssocContainerT,
+ typename GetIdT, typename GetValueT
+ >
+ inline void
+ tree_to_xml (std::ostream &ostrm, TreeNodeT const &tree,
+ std::string const &input_line, AssocContainerT const& id_to_name,
+ GetIdT const &get_token_id, GetValueT const &get_token_value)
+ {
+ basic_tree_to_xml<char>(ostrm, tree, input_line, id_to_name,
+ get_token_id, get_token_value);
+ }
+
+ template <typename TreeNodeT, typename AssocContainerT>
+ inline void
+ tree_to_xml (std::ostream &ostrm, TreeNodeT const &tree,
+ std::string const &input_line, AssocContainerT const& id_to_name)
+ {
+ basic_tree_to_xml<char>(ostrm, tree, input_line, id_to_name);
+ }
+
+ template <typename TreeNodeT>
+ inline void
+ tree_to_xml (std::ostream &ostrm, TreeNodeT const &tree,
+ std::string const &input_line = "")
+ {
+ basic_tree_to_xml<char>(ostrm, tree, input_line);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#include <boost/spirit/home/classic/tree/impl/tree_to_xml.ipp>
+
+#endif // !defined(TREE_TO_XML_HPP)
+
diff --git a/boost/spirit/home/classic/tree/typeof.hpp b/boost/spirit/home/classic/tree/typeof.hpp
new file mode 100644
index 0000000000..2d25512c81
--- /dev/null
+++ b/boost/spirit/home/classic/tree/typeof.hpp
@@ -0,0 +1,80 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_TREE_TYPEOF_HPP)
+#define BOOST_SPIRIT_TREE_TYPEOF_HPP
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/spirit/home/classic/core/typeof.hpp>
+
+#include <boost/spirit/home/classic/tree/common_fwd.hpp>
+#include <boost/spirit/home/classic/tree/parse_tree_fwd.hpp>
+#include <boost/spirit/home/classic/tree/ast_fwd.hpp>
+
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+
+// common.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::tree_node,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::node_iter_data,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::node_iter_data_factory,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::node_val_data_factory,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::node_all_val_data_factory,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::tree_match,3)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::tree_policy)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::common_tree_match_policy,4)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::common_tree_tree_policy,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::no_tree_gen_node_parser,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::leaf_node_parser,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::node_parser,2)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::discard_node_op)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::reduced_node_op)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::infix_node_op)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::discard_first_node_op)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::discard_last_node_op)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::inner_node_op)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::action_directive_parser,2)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::access_match_action)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::access_match_action::action,2)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::access_node_action)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::access_node_action::action,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::tree_parse_info,3)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::node_iter_data,1)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::node_iter_data_factory<BOOST_SPIRIT_CLASSIC_NS::nil_t>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::node_val_data_factory<BOOST_SPIRIT_CLASSIC_NS::nil_t>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::node_all_val_data_factory<BOOST_SPIRIT_CLASSIC_NS::nil_t>)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::tree_match,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::tree_match,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::tree_parse_info,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::tree_parse_info,1)
+
+
+// parse_tree.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::pt_tree_policy,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::pt_match_policy,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::gen_pt_node_parser,1)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::pt_match_policy,1)
+
+
+// ast.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ast_tree_policy,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ast_match_policy,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::gen_ast_node_parser,1)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::root_node_op)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::ast_match_policy,1)
+
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility.hpp b/boost/spirit/home/classic/utility.hpp
new file mode 100644
index 0000000000..8eec51a7f7
--- /dev/null
+++ b/boost/spirit/home/classic/utility.hpp
@@ -0,0 +1,40 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2001-2003 Hartmut Kaiser
+ Copyright (c) 2002-2003 Martin Wille
+ Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+ Copyright (c) 2002 Raghavendra Satish
+ Copyright (c) 2002 Jeff Westfahl
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_UTILITY_MAIN_HPP)
+#define BOOST_SPIRIT_UTILITY_MAIN_HPP
+
+#include <boost/spirit/home/classic/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Master header for Spirit.Utilities
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// Utility.Parsers
+#include <boost/spirit/home/classic/utility/chset.hpp>
+#include <boost/spirit/home/classic/utility/chset_operators.hpp>
+#include <boost/spirit/home/classic/utility/escape_char.hpp>
+#include <boost/spirit/home/classic/utility/functor_parser.hpp>
+#include <boost/spirit/home/classic/utility/loops.hpp>
+#include <boost/spirit/home/classic/utility/confix.hpp>
+#include <boost/spirit/home/classic/utility/lists.hpp>
+#include <boost/spirit/home/classic/utility/distinct.hpp>
+
+// Utility.Support
+#include <boost/spirit/home/classic/utility/flush_multi_pass.hpp>
+#include <boost/spirit/home/classic/utility/scoped_lock.hpp>
+
+
+#endif // !defined(BOOST_SPIRIT_UTILITY_MAIN_HPP)
diff --git a/boost/spirit/home/classic/utility/chset.hpp b/boost/spirit/home/classic/utility/chset.hpp
new file mode 100644
index 0000000000..3635456424
--- /dev/null
+++ b/boost/spirit/home/classic/utility/chset.hpp
@@ -0,0 +1,187 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CHSET_HPP
+#define BOOST_SPIRIT_CHSET_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/shared_ptr.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace utility { namespace impl {
+
+ // This is here because some compilers choke on out-of-line member
+ // template functions. And we don't want to put the whole algorithm
+ // in the chset constructor in the class definition.
+ template <typename CharT, typename CharT2>
+ void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr,
+ CharT2 const* definition);
+
+}} // namespace utility::impl
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// chset class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT = char>
+class chset: public char_parser<chset<CharT> > {
+
+public:
+ chset();
+ chset(chset const& arg_);
+ explicit chset(CharT arg_);
+ explicit chset(anychar_parser arg_);
+ explicit chset(nothing_parser arg_);
+ explicit chset(chlit<CharT> const& arg_);
+ explicit chset(range<CharT> const& arg_);
+ explicit chset(negated_char_parser<chlit<CharT> > const& arg_);
+ explicit chset(negated_char_parser<range<CharT> > const& arg_);
+
+ template <typename CharT2>
+ explicit chset(CharT2 const* definition)
+ : ptr(new basic_chset<CharT>())
+ {
+ utility::impl::construct_chset(ptr, definition);
+ }
+ ~chset();
+
+ chset& operator=(chset const& rhs);
+ chset& operator=(CharT rhs);
+ chset& operator=(anychar_parser rhs);
+ chset& operator=(nothing_parser rhs);
+ chset& operator=(chlit<CharT> const& rhs);
+ chset& operator=(range<CharT> const& rhs);
+ chset& operator=(negated_char_parser<chlit<CharT> > const& rhs);
+ chset& operator=(negated_char_parser<range<CharT> > const& rhs);
+
+ void set(range<CharT> const& arg_);
+ void set(negated_char_parser<chlit<CharT> > const& arg_);
+ void set(negated_char_parser<range<CharT> > const& arg_);
+
+ void clear(range<CharT> const& arg_);
+ void clear(negated_char_parser<range<CharT> > const& arg_);
+ bool test(CharT ch) const;
+ chset& inverse();
+ void swap(chset& x);
+
+ chset& operator|=(chset const& x);
+ chset& operator&=(chset const& x);
+ chset& operator-=(chset const& x);
+ chset& operator^=(chset const& x);
+
+private:
+
+ boost::shared_ptr<basic_chset<CharT> > ptr;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Generator functions
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+chset_p(chlit<CharT> const& arg_)
+{ return chset<CharT>(arg_); }
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+chset_p(range<CharT> const& arg_)
+{ return chset<CharT>(arg_); }
+
+template <typename CharT>
+inline chset<CharT>
+chset_p(negated_char_parser<chlit<CharT> > const& arg_)
+{ return chset<CharT>(arg_); }
+
+template <typename CharT>
+inline chset<CharT>
+chset_p(negated_char_parser<range<CharT> > const& arg_)
+{ return chset<CharT>(arg_); }
+
+//////////////////////////////////
+inline chset<char>
+chset_p(char const* init)
+{ return chset<char>(init); }
+
+//////////////////////////////////
+inline chset<wchar_t>
+chset_p(wchar_t const* init)
+{ return chset<wchar_t>(init); }
+
+//////////////////////////////////
+inline chset<char>
+chset_p(char ch)
+{ return chset<char>(ch); }
+
+//////////////////////////////////
+inline chset<wchar_t>
+chset_p(wchar_t ch)
+{ return chset<wchar_t>(ch); }
+
+//////////////////////////////////
+inline chset<int>
+chset_p(int ch)
+{ return chset<int>(ch); }
+
+//////////////////////////////////
+inline chset<unsigned int>
+chset_p(unsigned int ch)
+{ return chset<unsigned int>(ch); }
+
+//////////////////////////////////
+inline chset<short>
+chset_p(short ch)
+{ return chset<short>(ch); }
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+//////////////////////////////////
+inline chset<unsigned short>
+chset_p(unsigned short ch)
+{ return chset<unsigned short>(ch); }
+#endif
+//////////////////////////////////
+inline chset<long>
+chset_p(long ch)
+{ return chset<long>(ch); }
+
+//////////////////////////////////
+inline chset<unsigned long>
+chset_p(unsigned long ch)
+{ return chset<unsigned long>(ch); }
+
+#ifdef BOOST_HAS_LONG_LONG
+//////////////////////////////////
+inline chset< ::boost::long_long_type>
+chset_p( ::boost::long_long_type ch)
+{ return chset< ::boost::long_long_type>(ch); }
+
+//////////////////////////////////
+inline chset< ::boost::ulong_long_type>
+chset_p( ::boost::ulong_long_type ch)
+{ return chset< ::boost::ulong_long_type>(ch); }
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/utility/impl/chset.ipp>
+#include <boost/spirit/home/classic/utility/chset_operators.hpp>
diff --git a/boost/spirit/home/classic/utility/chset_operators.hpp b/boost/spirit/home/classic/utility/chset_operators.hpp
new file mode 100644
index 0000000000..d42b5faae4
--- /dev/null
+++ b/boost/spirit/home/classic/utility/chset_operators.hpp
@@ -0,0 +1,402 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CHSET_OPERATORS_HPP
+#define BOOST_SPIRIT_CHSET_OPERATORS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/utility/chset.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// chset free operators
+//
+// Where a and b are both chsets, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+// Where a is a chset, implements:
+//
+// ~a
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator~(chset<CharT> const& a);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// range <--> chset free operators
+//
+// Where a is a chset and b is a range, and vice-versa, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, range<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, range<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, range<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, range<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(range<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(range<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(range<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(range<CharT> const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// chlit <--> chset free operators
+//
+// Where a is a chset and b is a chlit, and vice-versa, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, chlit<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, chlit<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, chlit<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, chlit<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chlit<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chlit<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chlit<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chlit<CharT> const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// negated_char_parser<range> <--> chset free operators
+//
+// Where a is a chset and b is a range, and vice-versa, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// negated_char_parser<chlit> <--> chset free operators
+//
+// Where a is a chset and b is a chlit, and vice-versa, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// literal primitives <--> chset free operators
+//
+// Where a is a chset and b is a literal primitive,
+// and vice-versa, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, CharT b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, CharT b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, CharT b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, CharT b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(CharT a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(CharT a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(CharT a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(CharT a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// anychar_parser <--> chset free operators
+//
+// Where a is chset and b is a anychar_parser, and vice-versa, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, anychar_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, anychar_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, anychar_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, anychar_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(anychar_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(anychar_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(anychar_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(anychar_parser a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// nothing_parser <--> chset free operators
+//
+// Where a is chset and b is nothing_parser, and vice-versa, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, nothing_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, nothing_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, nothing_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, nothing_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(nothing_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(nothing_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(nothing_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(nothing_parser a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/utility/impl/chset_operators.ipp>
diff --git a/boost/spirit/home/classic/utility/confix.hpp b/boost/spirit/home/classic/utility/confix.hpp
new file mode 100644
index 0000000000..42228ea242
--- /dev/null
+++ b/boost/spirit/home/classic/utility/confix.hpp
@@ -0,0 +1,405 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CONFIX_HPP
+#define BOOST_SPIRIT_CONFIX_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/config.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+#include <boost/spirit/home/classic/core/composite/operators.hpp>
+
+#include <boost/spirit/home/classic/utility/confix_fwd.hpp>
+#include <boost/spirit/home/classic/utility/impl/confix.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// confix_parser class
+//
+// Parses a sequence of 3 sub-matches. This class may
+// be used to parse structures, where the opening part is possibly
+// contained in the expression part and the whole sequence is only
+// parsed after seeing the closing part matching the first opening
+// subsequence. Example: C-comments:
+//
+// /* This is a C-comment */
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+template<typename NestedT = non_nested, typename LexemeT = non_lexeme>
+struct confix_parser_gen;
+
+template <
+ typename OpenT, typename ExprT, typename CloseT, typename CategoryT,
+ typename NestedT, typename LexemeT
+>
+struct confix_parser :
+ public parser<
+ confix_parser<OpenT, ExprT, CloseT, CategoryT, NestedT, LexemeT>
+ >
+{
+ typedef
+ confix_parser<OpenT, ExprT, CloseT, CategoryT, NestedT, LexemeT>
+ self_t;
+
+ confix_parser(OpenT const &open_, ExprT const &expr_, CloseT const &close_)
+ : open(open_), expr(expr_), close(close_)
+ {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ return impl::confix_parser_type<CategoryT>::
+ parse(NestedT(), LexemeT(), *this, scan, open, expr, close);
+ }
+
+private:
+
+ typename as_parser<OpenT>::type::embed_t open;
+ typename as_parser<ExprT>::type::embed_t expr;
+ typename as_parser<CloseT>::type::embed_t close;
+};
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Confix parser generator template
+//
+// This is a helper for generating a correct confix_parser<> from
+// auxiliary parameters. There are the following types supported as
+// parameters yet: parsers, single characters and strings (see
+// as_parser).
+//
+// If the body parser is an action_parser_category type parser (a parser
+// with an attached semantic action) we have to do something special. This
+// happens, if the user wrote something like:
+//
+// confix_p(open, body[f], close)
+//
+// where 'body' is the parser matching the body of the confix sequence
+// and 'f' is a functor to be called after matching the body. If we would
+// do nothing, the resulting code would parse the sequence as follows:
+//
+// start >> (body[f] - close) >> close
+//
+// what in most cases is not what the user expects.
+// (If this _is_ what you've expected, then please use the confix_p
+// generator function 'direct()', which will inhibit
+// re-attaching the actor to the body parser).
+//
+// To make the confix parser behave as expected:
+//
+// start >> (body - close)[f] >> close
+//
+// the actor attached to the 'body' parser has to be re-attached to the
+// (body - close) parser construct, which will make the resulting confix
+// parser 'do the right thing'. This refactoring is done by the help of
+// the refactoring parsers (see the files refactoring.[hi]pp).
+//
+// Additionally special care must be taken, if the body parser is a
+// unary_parser_category type parser as
+//
+// confix_p(open, *anychar_p, close)
+//
+// which without any refactoring would result in
+//
+// start >> (*anychar_p - close) >> close
+//
+// and will not give the expected result (*anychar_p will eat up all the
+// input up to the end of the input stream). So we have to refactor this
+// into:
+//
+// start >> *(anychar_p - close) >> close
+//
+// what will give the correct result.
+//
+// The case, where the body parser is a combination of the two mentioned
+// problems (i.e. the body parser is a unary parser with an attached
+// action), is handled accordingly too:
+//
+// confix_p(start, (*anychar_p)[f], end)
+//
+// will be parsed as expected:
+//
+// start >> (*(anychar_p - end))[f] >> end.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename NestedT, typename LexemeT>
+struct confix_parser_gen
+{
+ // Generic generator function for creation of concrete confix parsers
+
+ template<typename StartT, typename ExprT, typename EndT>
+ struct paren_op_result_type
+ {
+ typedef confix_parser<
+ typename as_parser<StartT>::type,
+ typename as_parser<ExprT>::type,
+ typename as_parser<EndT>::type,
+ typename as_parser<ExprT>::type::parser_category_t,
+ NestedT,
+ LexemeT
+ > type;
+ };
+
+ template<typename StartT, typename ExprT, typename EndT>
+ typename paren_op_result_type<StartT, ExprT, EndT>::type
+ operator()(StartT const &start_, ExprT const &expr_, EndT const &end_) const
+ {
+ typedef typename paren_op_result_type<StartT,ExprT,EndT>::type
+ return_t;
+
+ return return_t(
+ as_parser<StartT>::convert(start_),
+ as_parser<ExprT>::convert(expr_),
+ as_parser<EndT>::convert(end_)
+ );
+ }
+
+ // Generic generator function for creation of concrete confix parsers
+ // which have an action directly attached to the ExprT part of the
+ // parser (see comment above, no automatic refactoring)
+
+ template<typename StartT, typename ExprT, typename EndT>
+ struct direct_result_type
+ {
+ typedef confix_parser<
+ typename as_parser<StartT>::type,
+ typename as_parser<ExprT>::type,
+ typename as_parser<EndT>::type,
+ plain_parser_category, // do not re-attach action
+ NestedT,
+ LexemeT
+ > type;
+ };
+
+ template<typename StartT, typename ExprT, typename EndT>
+ typename direct_result_type<StartT,ExprT,EndT>::type
+ direct(StartT const &start_, ExprT const &expr_, EndT const &end_) const
+ {
+ typedef typename direct_result_type<StartT,ExprT,EndT>::type
+ return_t;
+
+ return return_t(
+ as_parser<StartT>::convert(start_),
+ as_parser<ExprT>::convert(expr_),
+ as_parser<EndT>::convert(end_)
+ );
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Predefined non_nested confix parser generators
+//
+///////////////////////////////////////////////////////////////////////////////
+
+const confix_parser_gen<non_nested, non_lexeme> confix_p =
+ confix_parser_gen<non_nested, non_lexeme>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Comments are special types of confix parsers
+//
+// Comment parser generator template. This is a helper for generating a
+// correct confix_parser<> from auxiliary parameters, which is able to
+// parse comment constructs: (StartToken >> Comment text >> EndToken).
+//
+// There are the following types supported as parameters yet: parsers,
+// single characters and strings (see as_parser).
+//
+// There are two diffenerent predefined comment parser generators
+// (comment_p and comment_nest_p, see below), which may be used for
+// creating special comment parsers in two different ways.
+//
+// If these are used with one parameter, a comment starting with the given
+// first parser parameter up to the end of the line is matched. So for
+// instance the following parser matches C++ style comments:
+//
+// comment_p("//").
+//
+// If these are used with two parameters, a comment starting with the
+// first parser parameter up to the second parser parameter is matched.
+// For instance a C style comment parser should be constrcuted as:
+//
+// comment_p("/*", "*/").
+//
+// Please note, that a comment is parsed implicitly as if the whole
+// comment_p(...) statement were embedded into a lexeme_d[] directive.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename NestedT>
+struct comment_parser_gen
+{
+ // Generic generator function for creation of concrete comment parsers
+ // from an open token. The newline parser eol_p is used as the
+ // closing token.
+
+ template<typename StartT>
+ struct paren_op1_result_type
+ {
+ typedef confix_parser<
+ typename as_parser<StartT>::type,
+ kleene_star<anychar_parser>,
+ alternative<eol_parser, end_parser>,
+ unary_parser_category, // there is no action to re-attach
+ NestedT,
+ is_lexeme // insert implicit lexeme_d[]
+ >
+ type;
+ };
+
+ template<typename StartT>
+ typename paren_op1_result_type<StartT>::type
+ operator() (StartT const &start_) const
+ {
+ typedef typename paren_op1_result_type<StartT>::type
+ return_t;
+
+ return return_t(
+ as_parser<StartT>::convert(start_),
+ *anychar_p,
+ eol_p | end_p
+ );
+ }
+
+ // Generic generator function for creation of concrete comment parsers
+ // from an open and a close tokens.
+
+ template<typename StartT, typename EndT>
+ struct paren_op2_result_type
+ {
+ typedef confix_parser<
+ typename as_parser<StartT>::type,
+ kleene_star<anychar_parser>,
+ typename as_parser<EndT>::type,
+ unary_parser_category, // there is no action to re-attach
+ NestedT,
+ is_lexeme // insert implicit lexeme_d[]
+ > type;
+ };
+
+ template<typename StartT, typename EndT>
+ typename paren_op2_result_type<StartT,EndT>::type
+ operator() (StartT const &start_, EndT const &end_) const
+ {
+ typedef typename paren_op2_result_type<StartT,EndT>::type
+ return_t;
+
+ return return_t(
+ as_parser<StartT>::convert(start_),
+ *anychar_p,
+ as_parser<EndT>::convert(end_)
+ );
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Predefined non_nested comment parser generator
+//
+///////////////////////////////////////////////////////////////////////////////
+
+const comment_parser_gen<non_nested> comment_p =
+ comment_parser_gen<non_nested>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// comment_nest_parser class
+//
+// Parses a nested comments.
+// Example: nested PASCAL-comments:
+//
+// { This is a { nested } PASCAL-comment }
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename OpenT, typename CloseT>
+struct comment_nest_parser:
+ public parser<comment_nest_parser<OpenT, CloseT> >
+{
+ typedef comment_nest_parser<OpenT, CloseT> self_t;
+
+ comment_nest_parser(OpenT const &open_, CloseT const &close_):
+ open(open_), close(close_)
+ {}
+
+ template<typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const &scan) const
+ {
+ return do_parse(
+ open >> *(*this | (anychar_p - close)) >> close,
+ scan);
+ }
+
+private:
+ template<typename ParserT, typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ do_parse(ParserT const &p, ScannerT const &scan) const
+ {
+ return
+ impl::contiguous_parser_parse<
+ typename parser_result<ParserT, ScannerT>::type
+ >(p, scan, scan);
+ }
+
+ typename as_parser<OpenT>::type::embed_t open;
+ typename as_parser<CloseT>::type::embed_t close;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Predefined nested comment parser generator
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename OpenT, typename CloseT>
+struct comment_nest_p_result
+{
+ typedef comment_nest_parser<
+ typename as_parser<OpenT>::type,
+ typename as_parser<CloseT>::type
+ > type;
+};
+
+template<typename OpenT, typename CloseT>
+inline typename comment_nest_p_result<OpenT,CloseT>::type
+comment_nest_p(OpenT const &open, CloseT const &close)
+{
+ typedef typename comment_nest_p_result<OpenT,CloseT>::type
+ result_t;
+
+ return result_t(
+ as_parser<OpenT>::convert(open),
+ as_parser<CloseT>::convert(close)
+ );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/utility/confix_fwd.hpp b/boost/spirit/home/classic/utility/confix_fwd.hpp
new file mode 100644
index 0000000000..24e2236233
--- /dev/null
+++ b/boost/spirit/home/classic/utility/confix_fwd.hpp
@@ -0,0 +1,39 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CONFIX_FWD_HPP)
+#define BOOST_SPIRIT_CONFIX_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ struct is_nested;
+ struct non_nested;
+ struct is_lexeme;
+ struct non_lexeme;
+
+ template <
+ typename OpenT, typename ExprT, typename CloseT,
+ typename CategoryT = plain_parser_category,
+ typename NestedT = non_nested, typename LexemeT = non_lexeme
+ >
+ struct confix_parser;
+
+ template<typename OpenT, typename CloseT>
+ struct comment_nest_parser;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+
diff --git a/boost/spirit/home/classic/utility/distinct.hpp b/boost/spirit/home/classic/utility/distinct.hpp
new file mode 100644
index 0000000000..b66d409f5d
--- /dev/null
+++ b/boost/spirit/home/classic/utility/distinct.hpp
@@ -0,0 +1,229 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2003 Vaclav Vesely
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DISTINCT_HPP)
+#define BOOST_SPIRIT_DISTINCT_HPP
+
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#include <boost/spirit/home/classic/core/composite/operators.hpp>
+#include <boost/spirit/home/classic/core/composite/directives.hpp>
+#include <boost/spirit/home/classic/core/composite/epsilon.hpp>
+#include <boost/spirit/home/classic/core/non_terminal/rule.hpp>
+#include <boost/spirit/home/classic/utility/chset.hpp>
+
+#include <boost/spirit/home/classic/utility/distinct_fwd.hpp>
+
+namespace boost {
+ namespace spirit {
+ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+//-----------------------------------------------------------------------------
+// distinct_parser class
+
+template <typename CharT, typename TailT>
+class distinct_parser
+{
+public:
+ typedef
+ contiguous<
+ sequence<
+ chseq<CharT const*>,
+ negated_empty_match_parser<
+ TailT
+ >
+ >
+ >
+ result_t;
+
+ distinct_parser()
+ : tail(chset<CharT>())
+ {
+ }
+
+ explicit distinct_parser(parser<TailT> const & tail_)
+ : tail(tail_.derived())
+ {
+ }
+
+ explicit distinct_parser(CharT const* letters)
+ : tail(chset_p(letters))
+ {
+ }
+
+ result_t operator()(CharT const* str) const
+ {
+ return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
+ }
+
+ TailT tail;
+};
+
+//-----------------------------------------------------------------------------
+// distinct_directive class
+
+template <typename CharT, typename TailT>
+class distinct_directive
+{
+public:
+ template<typename ParserT>
+ struct result {
+ typedef
+ contiguous<
+ sequence<
+ ParserT,
+ negated_empty_match_parser<
+ TailT
+ >
+ >
+ >
+ type;
+ };
+
+ distinct_directive()
+ : tail(chset<CharT>())
+ {
+ }
+
+ explicit distinct_directive(CharT const* letters)
+ : tail(chset_p(letters))
+ {
+ }
+
+ explicit distinct_directive(parser<TailT> const & tail_)
+ : tail(tail_.derived())
+ {
+ }
+
+ template<typename ParserT>
+ typename result<typename as_parser<ParserT>::type>::type
+ operator[](ParserT const &subject) const
+ {
+ return
+ lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
+ }
+
+ TailT tail;
+};
+
+//-----------------------------------------------------------------------------
+// dynamic_distinct_parser class
+
+template <typename ScannerT>
+class dynamic_distinct_parser
+{
+public:
+ typedef typename ScannerT::value_t char_t;
+
+ typedef
+ rule<
+ typename no_actions_scanner<
+ typename lexeme_scanner<ScannerT>::type
+ >::type
+ >
+ tail_t;
+
+ typedef
+ contiguous<
+ sequence<
+ chseq<char_t const*>,
+ negated_empty_match_parser<
+ tail_t
+ >
+ >
+ >
+ result_t;
+
+ dynamic_distinct_parser()
+ : tail(nothing_p)
+ {
+ }
+
+ template<typename ParserT>
+ explicit dynamic_distinct_parser(parser<ParserT> const & tail_)
+ : tail(tail_.derived())
+ {
+ }
+
+ explicit dynamic_distinct_parser(char_t const* letters)
+ : tail(chset_p(letters))
+ {
+ }
+
+ result_t operator()(char_t const* str) const
+ {
+ return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
+ }
+
+ tail_t tail;
+};
+
+//-----------------------------------------------------------------------------
+// dynamic_distinct_directive class
+
+template <typename ScannerT>
+class dynamic_distinct_directive
+{
+public:
+ typedef typename ScannerT::value_t char_t;
+
+ typedef
+ rule<
+ typename no_actions_scanner<
+ typename lexeme_scanner<ScannerT>::type
+ >::type
+ >
+ tail_t;
+
+ template<typename ParserT>
+ struct result {
+ typedef
+ contiguous<
+ sequence<
+ ParserT,
+ negated_empty_match_parser<
+ tail_t
+ >
+ >
+ >
+ type;
+ };
+
+ dynamic_distinct_directive()
+ : tail(nothing_p)
+ {
+ }
+
+ template<typename ParserT>
+ explicit dynamic_distinct_directive(parser<ParserT> const & tail_)
+ : tail(tail_.derived())
+ {
+ }
+
+ explicit dynamic_distinct_directive(char_t const* letters)
+ : tail(chset_p(letters))
+ {
+ }
+
+ template<typename ParserT>
+ typename result<typename as_parser<ParserT>::type>::type
+ operator[](ParserT const &subject) const
+ {
+ return
+ lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
+ }
+
+ tail_t tail;
+};
+
+//-----------------------------------------------------------------------------
+ BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+ } // namespace spirit
+} // namespace boost
+
+#endif // !defined(BOOST_SPIRIT_DISTINCT_HPP)
diff --git a/boost/spirit/home/classic/utility/distinct_fwd.hpp b/boost/spirit/home/classic/utility/distinct_fwd.hpp
new file mode 100644
index 0000000000..368d1f0162
--- /dev/null
+++ b/boost/spirit/home/classic/utility/distinct_fwd.hpp
@@ -0,0 +1,37 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DISTINCT_FWD_HPP)
+#define BOOST_SPIRIT_DISTINCT_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template<typename CharT> class chset;
+
+ template <typename CharT = char, typename TailT = chset<CharT> >
+ class distinct_parser;
+
+ template <typename CharT = char, typename TailT = chset<CharT> >
+ class distinct_directive;
+
+ template <typename ScannerT = scanner<> >
+ class dynamic_distinct_parser;
+
+ template <typename ScannerT = scanner<> >
+ class dynamic_distinct_directive;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+
diff --git a/boost/spirit/home/classic/utility/escape_char.hpp b/boost/spirit/home/classic/utility/escape_char.hpp
new file mode 100644
index 0000000000..375402f73a
--- /dev/null
+++ b/boost/spirit/home/classic/utility/escape_char.hpp
@@ -0,0 +1,184 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ESCAPE_CHAR_HPP
+#define BOOST_SPIRIT_ESCAPE_CHAR_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <string>
+#include <iterator>
+#include <cctype>
+#include <boost/limits.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/debug.hpp>
+
+#include <boost/spirit/home/classic/utility/escape_char_fwd.hpp>
+#include <boost/spirit/home/classic/utility/impl/escape_char.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// escape_char_action class
+//
+// Links an escape char parser with a user defined semantic action.
+// The semantic action may be a function or a functor. A function
+// should be compatible with the interface:
+//
+// void f(CharT ch);
+//
+// A functor should have a member operator() with a compatible signature
+// as above. The matching character is passed into the function/functor.
+// This is the default class that character parsers use when dealing with
+// the construct:
+//
+// p[f]
+//
+// where p is a parser and f is a function or functor.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename ParserT, typename ActionT,
+ unsigned long Flags, typename CharT
+>
+struct escape_char_action
+: public unary<ParserT,
+ parser<escape_char_action<ParserT, ActionT, Flags, CharT> > >
+{
+ typedef escape_char_action
+ <ParserT, ActionT, Flags, CharT> self_t;
+ typedef action_parser_category parser_category_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, CharT>::type type;
+ };
+
+ escape_char_action(ParserT const& p, ActionT const& a)
+ : base_t(p), actor(a) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ return impl::escape_char_action_parse<Flags, CharT>::
+ parse(scan, *this);
+ }
+
+ ActionT const& predicate() const { return actor; }
+
+private:
+
+ ActionT actor;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// escape_char_parser class
+//
+// The escape_char_parser helps in conjunction with the escape_char_action
+// template class (see above) in parsing escaped characters. There are two
+// different variants of this parser: one for parsing C style escaped
+// characters and one for parsing LEX style escaped characters.
+//
+// The C style escaped character parser is generated, when the template
+// parameter 'Flags' is equal to 'c_escapes' (a constant defined in the
+// file impl/escape_char.ipp). This parser recognizes all valid C escape
+// character sequences: '\t', '\b', '\f', '\n', '\r', '\"', '\'', '\\'
+// and the numeric style escapes '\120' (octal) and '\x2f' (hexadecimal)
+// and converts these to their character equivalent, for instance the
+// sequence of a backslash and a 'b' is parsed as the character '\b'.
+// All other escaped characters are rejected by this parser.
+//
+// The LEX style escaped character parser is generated, when the template
+// parameter 'Flags' is equal to 'lex_escapes' (a constant defined in the
+// file impl/escape_char.ipp). This parser recognizes all the C style
+// escaped character sequences (as described above) and additionally
+// does not reject all other escape sequences. All not mentioned escape
+// sequences are converted by the parser to the plain character, for
+// instance '\a' will be parsed as 'a'.
+//
+// All not escaped characters are parsed without modification.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <unsigned long Flags, typename CharT>
+struct escape_char_action_parser_gen;
+
+template <unsigned long Flags, typename CharT>
+struct escape_char_parser :
+ public parser<escape_char_parser<Flags, CharT> > {
+
+ // only the values c_escapes and lex_escapes are valid for Flags
+ BOOST_STATIC_ASSERT(Flags == c_escapes || Flags == lex_escapes);
+
+ typedef escape_char_parser<Flags, CharT> self_t;
+ typedef
+ escape_char_action_parser_gen<Flags, CharT>
+ action_parser_generator_t;
+
+ template <typename ScannerT>
+ struct result {
+
+ typedef typename match_result<ScannerT, CharT>::type type;
+ };
+
+ template <typename ActionT>
+ escape_char_action<self_t, ActionT, Flags, CharT>
+ operator[](ActionT const& actor) const
+ {
+ return escape_char_action<self_t, ActionT, Flags, CharT>(*this, actor);
+ }
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const &scan) const
+ {
+ return impl::escape_char_parse<CharT>::parse(scan, *this);
+ }
+};
+
+template <unsigned long Flags, typename CharT>
+struct escape_char_action_parser_gen {
+
+ template <typename ParserT, typename ActionT>
+ static escape_char_action<ParserT, ActionT, Flags, CharT>
+ generate (ParserT const &p, ActionT const &actor)
+ {
+ typedef
+ escape_char_action<ParserT, ActionT, Flags, CharT>
+ action_parser_t;
+ return action_parser_t(p, actor);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// predefined escape_char_parser objects
+//
+// These objects should be used for generating correct escaped character
+// parsers.
+//
+///////////////////////////////////////////////////////////////////////////////
+const escape_char_parser<lex_escapes> lex_escape_ch_p =
+ escape_char_parser<lex_escapes>();
+
+const escape_char_parser<c_escapes> c_escape_ch_p =
+ escape_char_parser<c_escapes>();
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/utility/escape_char_fwd.hpp b/boost/spirit/home/classic/utility/escape_char_fwd.hpp
new file mode 100644
index 0000000000..1485367164
--- /dev/null
+++ b/boost/spirit/home/classic/utility/escape_char_fwd.hpp
@@ -0,0 +1,30 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ESCAPE_CHAR_FWD_HPP)
+#define BOOST_SPIRIT_ESCAPE_CHAR_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <unsigned long Flags, typename CharT = char>
+ struct escape_char_parser;
+
+ template <
+ class ParserT, typename ActionT,
+ unsigned long Flags, typename CharT = char>
+ struct escape_char_action;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/flush_multi_pass.hpp b/boost/spirit/home/classic/utility/flush_multi_pass.hpp
new file mode 100644
index 0000000000..ad69f4fefb
--- /dev/null
+++ b/boost/spirit/home/classic/utility/flush_multi_pass.hpp
@@ -0,0 +1,77 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_FLUSH_MULTI_PASS_HPP
+#define BOOST_SPIRIT_FLUSH_MULTI_PASS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core.hpp>
+#include <boost/spirit/home/classic/iterator/multi_pass.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace impl {
+
+ template <typename T>
+ void flush_iterator(T &) {}
+
+ template <typename T1, typename T2, typename T3, typename T4>
+ void flush_iterator(BOOST_SPIRIT_CLASSIC_NS::multi_pass<
+ T1, T2, T3, T4, BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::std_deque> &i)
+ {
+ i.clear_queue();
+ }
+
+ } // namespace impl
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // flush_multi_pass_parser
+ //
+ // The flush_multi_pass_parser flushes an underlying
+ // multi_pass_iterator during the normal parsing process. This may
+ // be used at certain points during the parsing process, when it is
+ // clear, that no backtracking is needed anymore and the input
+ // gathered so far may be discarded.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ class flush_multi_pass_parser
+ : public parser<flush_multi_pass_parser>
+ {
+ public:
+ typedef flush_multi_pass_parser this_t;
+
+ template <typename ScannerT>
+ typename parser_result<this_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ impl::flush_iterator(scan.first);
+ return scan.empty_match();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // predefined flush_multi_pass_p object
+ //
+ // This object should may used to flush a multi_pass_iterator along
+ // the way during the normal parsing process.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ flush_multi_pass_parser const
+ flush_multi_pass_p = flush_multi_pass_parser();
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_FLUSH_MULTI_PASS_HPP
diff --git a/boost/spirit/home/classic/utility/functor_parser.hpp b/boost/spirit/home/classic/utility/functor_parser.hpp
new file mode 100644
index 0000000000..ac53751bcc
--- /dev/null
+++ b/boost/spirit/home/classic/utility/functor_parser.hpp
@@ -0,0 +1,71 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Joel de Guzman
+ Copyright (c) 2002-2003 Juan Carlos Arevalo-Baeza
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_FUNCTOR_PARSER_HPP
+#define BOOST_SPIRIT_FUNCTOR_PARSER_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // functor_parser class
+ //
+ // Once a functor parser has been defined, you can build a real
+ // parser from it by passing it to this class as the template
+ // parameter.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template < class FunctorT >
+ struct functor_parser : public parser<functor_parser<FunctorT> >
+ {
+ FunctorT functor;
+
+ functor_parser(): functor() {}
+ functor_parser(FunctorT const& functor_): functor(functor_) {}
+
+ typedef typename FunctorT::result_t functor_result_t;
+ typedef functor_parser<FunctorT> self_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, functor_result_t>::type
+ type;
+ };
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ typedef typename ScannerT::value_t value_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+
+ iterator_t const s(scan.first);
+ functor_result_t functor_result;
+ std::ptrdiff_t len = functor(scan, functor_result);
+
+ if (len < 0)
+ return scan.no_match();
+ else
+ return scan.create_match(std::size_t(len), functor_result, s, scan.first);
+ }
+ };
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/utility/grammar_def.hpp b/boost/spirit/home/classic/utility/grammar_def.hpp
new file mode 100644
index 0000000000..6ddfcab647
--- /dev/null
+++ b/boost/spirit/home/classic/utility/grammar_def.hpp
@@ -0,0 +1,307 @@
+/*=============================================================================
+ Copyright (c) 2003 Hartmut Kaiser
+ Copyright (c) 2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_GRAMMAR_DEF_HPP)
+#define BOOST_SPIRIT_GRAMMAR_DEF_HPP
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/enum.hpp>
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/repeat_from_to.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+#include <boost/spirit/home/classic/core/assert.hpp>
+#include <boost/spirit/home/classic/utility/grammar_def_fwd.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Spirit predefined maximum grammar start parser limit. This limit defines
+// the maximum number of of possible different parsers exposed from a
+// particular grammar. This number defaults to 3.
+// The actual maximum is rounded up in multiples of 3. Thus, if this value
+// is 4, the actual limit is 6. The ultimate maximum limit in this
+// implementation is 15.
+//
+// It should NOT be greater than PHOENIX_LIMIT!
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT)
+#define BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT PHOENIX_LIMIT
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// ensure BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT <= PHOENIX_LIMIT and
+// BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT <= 15 and
+// BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 0
+//
+///////////////////////////////////////////////////////////////////////////////
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT <= PHOENIX_LIMIT);
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT <= 15);
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 0);
+
+//////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+struct same {};
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The make_const_pointer meta function allows to generate a T const*
+ // needed to store the pointer to a given start parser from a grammar.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T0, typename T = T0>
+ struct make_const_pointer {
+
+ private:
+ // T0 shouldn't be of type 'same'
+ BOOST_STATIC_ASSERT((!boost::is_same<T0, same>::value));
+
+ typedef typename boost::mpl::if_c<
+ boost::is_same<T, same>::value,
+ T0 const *,
+ T const *
+ >::type
+ ptr_type;
+
+ public:
+ // If the type in question is phoenix::nil_t, then the returned type
+ // is still phoenix::nil_t, otherwise a constant pointer type to the
+ // inspected type is returned.
+ typedef typename boost::mpl::if_c<
+ boost::is_same<T, ::phoenix::nil_t>::value,
+ ::phoenix::nil_t,
+ ptr_type
+ >::type
+ type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <int N, typename ElementT>
+ struct assign_zero_to_tuple_member {
+
+ template <typename TupleT>
+ static void do_(TupleT &t) { t[::phoenix::tuple_index<N>()] = 0; }
+ };
+
+ template <int N>
+ struct assign_zero_to_tuple_member<N, ::phoenix::nil_t> {
+
+ template <typename TupleT>
+ static void do_(TupleT& /*t*/) {}
+ };
+
+ struct phoenix_nil_type {
+
+ typedef ::phoenix::nil_t type;
+ };
+
+ template <int N>
+ struct init_tuple_member {
+
+ template <typename TupleT>
+ static void
+ do_(TupleT &t)
+ {
+ typedef typename boost::mpl::eval_if_c<
+ (N < TupleT::length),
+ ::phoenix::tuple_element<N, TupleT>,
+ phoenix_nil_type
+ >::type
+ element_type;
+
+ assign_zero_to_tuple_member<N, element_type>::do_(t);
+ }
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// grammar_def class
+//
+// This class may be used as a base class for the embedded definition
+// class inside the grammar<> derived user grammar.
+// It exposes the two functions needed for start rule access:
+//
+// rule<> const &start() const;
+//
+// and
+//
+// template <int N>
+// rule<> const *get_start_parser() const;
+//
+// Additionally it exposes a set o 'start_parsers' functions, which are to
+// be called by the user to define the parsers to use as start parsers
+// of the given grammar.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename T,
+ BOOST_PP_ENUM_PARAMS(
+ BOOST_PP_DEC(BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A), typename T)
+>
+class grammar_def {
+
+private:
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // This generates the full tuple type from the given template parameters
+ // T, T0, ...
+ //
+ // typedef ::phoenix::tuple<
+ // typename impl::make_const_pointer<T>::type,
+ // typename impl::make_const_pointer<T, T0>::type,
+ // ...
+ // > tuple_t;
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #define BOOST_SPIRIT_GRAMMARDEF_TUPLE_PARAM(z, N, _) \
+ typename impl::make_const_pointer<T, BOOST_PP_CAT(T, N)>::type \
+ /**/
+
+ typedef ::phoenix::tuple<
+ typename impl::make_const_pointer<T>::type,
+ BOOST_PP_ENUM(
+ BOOST_PP_DEC(BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A),
+ BOOST_SPIRIT_GRAMMARDEF_TUPLE_PARAM,
+ _
+ )
+ > tuple_t;
+
+ #undef BOOST_SPIRIT_GRAMMARDEF_TUPLE_PARAM
+ ///////////////////////////////////////////////////////////////////////////
+
+protected:
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // This generates a sequence of 'start_parsers' functions with increasing
+ // number of arguments, which allow to initialize the tuple members with
+ // the pointers to the start parsers of the grammar:
+ //
+ // template <typename TC0, ...>
+ // void start_parsers (TC0 const &t0, ...)
+ // {
+ // using ::phoenix::tuple_index_names::_1;
+ // t[_1] = &t0;
+ // ...
+ // }
+ //
+ // where a TC0 const* must be convertible to a T0 const*
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #define BOOST_SPIRIT_GRAMMARDEF_ENUM_PARAMS(z, N, _) \
+ BOOST_PP_CAT(TC, N) const &BOOST_PP_CAT(t, N) \
+ /**/
+ #define BOOST_SPIRIT_GRAMMARDEF_ENUM_ASSIGN(z, N, _) \
+ using ::phoenix::tuple_index_names::BOOST_PP_CAT(_, BOOST_PP_INC(N)); \
+ t[BOOST_PP_CAT(_, BOOST_PP_INC(N))] = &BOOST_PP_CAT(t, N); \
+ /**/
+ #define BOOST_SPIRIT_GRAMMARDEF_ENUM_START(z, N, _) \
+ template <BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), typename TC)> \
+ void \
+ start_parsers(BOOST_PP_ENUM_ ## z(BOOST_PP_INC(N), \
+ BOOST_SPIRIT_GRAMMARDEF_ENUM_PARAMS, _) ) \
+ { \
+ BOOST_PP_REPEAT_ ## z(BOOST_PP_INC(N), \
+ BOOST_SPIRIT_GRAMMARDEF_ENUM_ASSIGN, _) \
+ } \
+ /**/
+
+ BOOST_PP_REPEAT(
+ BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A,
+ BOOST_SPIRIT_GRAMMARDEF_ENUM_START, _)
+
+ #undef BOOST_SPIRIT_GRAMMARDEF_ENUM_START
+ #undef BOOST_SPIRIT_GRAMMARDEF_ENUM_ASSIGN
+ #undef BOOST_SPIRIT_GRAMMARDEF_ENUM_PARAMS
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // This generates some initialization code, which allows to initialize all
+ // used tuple members to 0 (zero):
+ //
+ // t[_1] = 0;
+ // impl::init_tuple_member<1>::do_(t);
+ // ...
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ #define BOOST_SPIRIT_GRAMMARDEF_ENUM_INIT(z, N, _) \
+ impl::init_tuple_member<N>::do_(t); \
+ /**/
+
+ grammar_def()
+ {
+ using ::phoenix::tuple_index_names::_1;
+ t[_1] = 0;
+ BOOST_PP_REPEAT_FROM_TO(
+ 1, BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A,
+ BOOST_SPIRIT_GRAMMARDEF_ENUM_INIT, _)
+ }
+
+ #undef BOOST_SPIRIT_GRAMMARDEF_ENUM_INIT
+ ///////////////////////////////////////////////////////////////////////////
+
+public:
+ T const &
+ start() const
+ {
+ // If the following assertion is fired, you have probably forgot to call
+ // the start_parser() function from inside the constructor of your
+ // embedded definition class to initialize the start parsers to be exposed
+ // from your grammar.
+ using ::phoenix::tuple_index_names::_1;
+ BOOST_SPIRIT_ASSERT(0 != t[_1]);
+ return *t[_1];
+ }
+
+ template <int N>
+ typename ::phoenix::tuple_element<N, tuple_t>::crtype
+ get_start_parser() const
+ {
+ // If the following expression yields a compiler error, you have probably
+ // tried to access a start rule, which isn't exposed as such from your
+ // grammar.
+ BOOST_STATIC_ASSERT(N > 0 && N < tuple_t::length);
+
+ // If the following assertion is fired, you have probably forgot to call
+ // the start_parser() function from inside the constructor of your
+ // embedded definition class to initialize the start parsers to be exposed
+ // from your grammar.
+ // Another reason may be, that there is a count mismatch between
+ // the number of template parameters to the grammar_def<> class and the
+ // number of parameters used while calling start_parsers().
+ BOOST_SPIRIT_ASSERT(0 != t[::phoenix::tuple_index<N>()]);
+
+ return t[::phoenix::tuple_index<N>()];
+ }
+
+private:
+ tuple_t t;
+};
+
+#undef BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_GRAMMAR_DEF_HPP
diff --git a/boost/spirit/home/classic/utility/grammar_def_fwd.hpp b/boost/spirit/home/classic/utility/grammar_def_fwd.hpp
new file mode 100644
index 0000000000..cf9e3851c6
--- /dev/null
+++ b/boost/spirit/home/classic/utility/grammar_def_fwd.hpp
@@ -0,0 +1,52 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_GRAMMAR_DEF_FWD_HPP)
+#define BOOST_SPIRIT_GRAMMAR_DEF_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+
+#if !defined(BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT)
+#define BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT PHOENIX_LIMIT
+#endif
+
+// Calculate an integer rounded up to the nearest integer dividable by 3
+#if BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 12
+#define BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A 15
+#elif BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 9
+#define BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A 12
+#elif BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 6
+#define BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A 9
+#elif BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 3
+#define BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A 6
+#else
+#define BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A 3
+#endif
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template <
+ typename T,
+ BOOST_PP_ENUM_BINARY_PARAMS(
+ BOOST_PP_DEC(BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT_A),
+ typename T, = ::phoenix::nil_t BOOST_PP_INTERCEPT
+ )
+ >
+ class grammar_def;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/impl/chset.ipp b/boost/spirit/home/classic/utility/impl/chset.ipp
new file mode 100644
index 0000000000..3017035106
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/chset.ipp
@@ -0,0 +1,366 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_CHSET_IPP
+#define BOOST_SPIRIT_CHSET_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/limits.hpp>
+#include <boost/spirit/home/classic/utility/chset.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// chset class
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace utility { namespace impl {
+ template <typename CharT>
+ inline void
+ detach(boost::shared_ptr<basic_chset<CharT> >& ptr)
+ {
+ if (!ptr.unique())
+ ptr = boost::shared_ptr<basic_chset<CharT> >
+ (new basic_chset<CharT>(*ptr));
+ }
+
+ template <typename CharT>
+ inline void
+ detach_clear(boost::shared_ptr<basic_chset<CharT> >& ptr)
+ {
+ if (ptr.unique())
+ ptr->clear();
+ else
+ ptr.reset(new basic_chset<CharT>());
+ }
+
+ template <typename CharT, typename CharT2>
+ void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr,
+ CharT2 const* definition)
+ {
+ CharT2 ch = *definition++;
+ while (ch)
+ {
+ CharT2 next = *definition++;
+ if (next == '-')
+ {
+ next = *definition++;
+ if (next == 0)
+ {
+ ptr->set(ch);
+ ptr->set('-');
+ break;
+ }
+ ptr->set(ch, next);
+ }
+ else
+ {
+ ptr->set(ch);
+ }
+ ch = next;
+ }
+ }
+
+ //////////////////////////////////
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+ template <typename CharT, typename FakeT>
+ void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr, chlit<CharT> const &ch,
+ FakeT)
+ {
+ if(ch.ch != (std::numeric_limits<CharT>::min)()) {
+ ptr->set((std::numeric_limits<CharT>::min)(), ch.ch - 1);
+ }
+ if(ch.ch != (std::numeric_limits<CharT>::max)()) {
+ ptr->set(ch.ch + 1, (std::numeric_limits<CharT>::max)());
+ }
+ }
+
+ template <typename CharT, typename FakeT>
+ void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr,
+ spirit::range<CharT> const &rng, FakeT)
+ {
+ if(rng.first != (std::numeric_limits<CharT>::min)()) {
+ ptr->set((std::numeric_limits<CharT>::min)(), rng.first - 1);
+ }
+ if(rng.last != (std::numeric_limits<CharT>::max)()) {
+ ptr->set(rng.last + 1, (std::numeric_limits<CharT>::max)());
+ }
+ }
+
+#endif // BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+//////////////////////////////////
+
+}} // namespace utility::impl
+
+template <typename CharT>
+inline chset<CharT>::chset()
+: ptr(new basic_chset<CharT>()) {}
+
+template <typename CharT>
+inline chset<CharT>::chset(chset const& arg_)
+: ptr(new basic_chset<CharT>(*arg_.ptr)) {}
+
+template <typename CharT>
+inline chset<CharT>::chset(CharT arg_)
+: ptr(new basic_chset<CharT>())
+{ ptr->set(arg_); }
+
+template <typename CharT>
+inline chset<CharT>::chset(anychar_parser /*arg*/)
+: ptr(new basic_chset<CharT>())
+{
+ ptr->set(
+ (std::numeric_limits<CharT>::min)(),
+ (std::numeric_limits<CharT>::max)()
+ );
+}
+
+template <typename CharT>
+inline chset<CharT>::chset(nothing_parser arg_)
+: ptr(new basic_chset<CharT>()) {}
+
+template <typename CharT>
+inline chset<CharT>::chset(chlit<CharT> const& arg_)
+: ptr(new basic_chset<CharT>())
+{ ptr->set(arg_.ch); }
+
+template <typename CharT>
+inline chset<CharT>::chset(range<CharT> const& arg_)
+: ptr(new basic_chset<CharT>())
+{ ptr->set(arg_.first, arg_.last); }
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline chset<CharT>::chset(negated_char_parser<chlit<CharT> > const& arg_)
+: ptr(new basic_chset<CharT>())
+{
+ set(arg_);
+}
+
+template <typename CharT>
+inline chset<CharT>::chset(negated_char_parser<range<CharT> > const& arg_)
+: ptr(new basic_chset<CharT>())
+{
+ set(arg_);
+}
+
+#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline chset<CharT>::~chset() {}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(chset const& rhs)
+{
+ ptr = rhs.ptr;
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(CharT rhs)
+{
+ utility::impl::detach_clear(ptr);
+ ptr->set(rhs);
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(anychar_parser rhs)
+{
+ utility::impl::detach_clear(ptr);
+ ptr->set(
+ (std::numeric_limits<CharT>::min)(),
+ (std::numeric_limits<CharT>::max)()
+ );
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(nothing_parser rhs)
+{
+ utility::impl::detach_clear(ptr);
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(chlit<CharT> const& rhs)
+{
+ utility::impl::detach_clear(ptr);
+ ptr->set(rhs.ch);
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(range<CharT> const& rhs)
+{
+ utility::impl::detach_clear(ptr);
+ ptr->set(rhs.first, rhs.last);
+ return *this;
+}
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(negated_char_parser<chlit<CharT> > const& rhs)
+{
+ utility::impl::detach_clear(ptr);
+ set(rhs);
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(negated_char_parser<range<CharT> > const& rhs)
+{
+ utility::impl::detach_clear(ptr);
+ set(rhs);
+ return *this;
+}
+
+#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline void
+chset<CharT>::set(range<CharT> const& arg_)
+{
+ utility::impl::detach(ptr);
+ ptr->set(arg_.first, arg_.last);
+}
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline void
+chset<CharT>::set(negated_char_parser<chlit<CharT> > const& arg_)
+{
+ utility::impl::detach(ptr);
+
+ if(arg_.positive.ch != (std::numeric_limits<CharT>::min)()) {
+ ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.ch - 1);
+ }
+ if(arg_.positive.ch != (std::numeric_limits<CharT>::max)()) {
+ ptr->set(arg_.positive.ch + 1, (std::numeric_limits<CharT>::max)());
+ }
+}
+
+template <typename CharT>
+inline void
+chset<CharT>::set(negated_char_parser<range<CharT> > const& arg_)
+{
+ utility::impl::detach(ptr);
+
+ if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
+ ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
+ }
+ if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
+ ptr->set(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
+ }
+}
+
+#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline void
+chset<CharT>::clear(range<CharT> const& arg_)
+{
+ utility::impl::detach(ptr);
+ ptr->clear(arg_.first, arg_.last);
+}
+
+template <typename CharT>
+inline void
+chset<CharT>::clear(negated_char_parser<range<CharT> > const& arg_)
+{
+ utility::impl::detach(ptr);
+
+ if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
+ ptr->clear((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
+ }
+ if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
+ ptr->clear(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
+ }
+}
+
+template <typename CharT>
+inline bool
+chset<CharT>::test(CharT ch) const
+{ return ptr->test(ch); }
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::inverse()
+{
+ utility::impl::detach(ptr);
+ ptr->inverse();
+ return *this;
+}
+
+template <typename CharT>
+inline void
+chset<CharT>::swap(chset& x)
+{ ptr.swap(x.ptr); }
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator|=(chset const& x)
+{
+ utility::impl::detach(ptr);
+ *ptr |= *x.ptr;
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator&=(chset const& x)
+{
+ utility::impl::detach(ptr);
+ *ptr &= *x.ptr;
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator-=(chset const& x)
+{
+ utility::impl::detach(ptr);
+ *ptr -= *x.ptr;
+ return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator^=(chset const& x)
+{
+ utility::impl::detach(ptr);
+ *ptr ^= *x.ptr;
+ return *this;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp b/boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp
new file mode 100644
index 0000000000..ace650166f
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp
@@ -0,0 +1,107 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_BASIC_CHSET_HPP
+#define BOOST_SPIRIT_BASIC_CHSET_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <bitset>
+#include <climits>
+#include <boost/spirit/home/classic/utility/impl/chset/range_run.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // basic_chset: basic character set implementation using range_run
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT>
+ class basic_chset
+ {
+ public:
+ basic_chset();
+ basic_chset(basic_chset const& arg_);
+
+ bool test(CharT v) const;
+ void set(CharT from, CharT to);
+ void set(CharT c);
+ void clear(CharT from, CharT to);
+ void clear(CharT c);
+ void clear();
+
+ void inverse();
+ void swap(basic_chset& x);
+
+ basic_chset& operator|=(basic_chset const& x);
+ basic_chset& operator&=(basic_chset const& x);
+ basic_chset& operator-=(basic_chset const& x);
+ basic_chset& operator^=(basic_chset const& x);
+
+ private: utility::impl::range_run<CharT> rr;
+ };
+
+ #if (CHAR_BIT == 8)
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // basic_chset: specializations for 8 bit chars using std::bitset
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT>
+ class basic_chset_8bit {
+
+ public:
+ basic_chset_8bit();
+ basic_chset_8bit(basic_chset_8bit const& arg_);
+
+ bool test(CharT v) const;
+ void set(CharT from, CharT to);
+ void set(CharT c);
+ void clear(CharT from, CharT to);
+ void clear(CharT c);
+ void clear();
+
+ void inverse();
+ void swap(basic_chset_8bit& x);
+
+ basic_chset_8bit& operator|=(basic_chset_8bit const& x);
+ basic_chset_8bit& operator&=(basic_chset_8bit const& x);
+ basic_chset_8bit& operator-=(basic_chset_8bit const& x);
+ basic_chset_8bit& operator^=(basic_chset_8bit const& x);
+
+ private: std::bitset<256> bset;
+ };
+
+ /////////////////////////////////
+ template <>
+ class basic_chset<char>
+ : public basic_chset_8bit<char> {};
+
+ /////////////////////////////////
+ template <>
+ class basic_chset<signed char>
+ : public basic_chset_8bit<signed char> {};
+
+ /////////////////////////////////
+ template <>
+ class basic_chset<unsigned char>
+ : public basic_chset_8bit<unsigned char> {};
+
+#endif
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
+#include <boost/spirit/home/classic/utility/impl/chset/basic_chset.ipp>
diff --git a/boost/spirit/home/classic/utility/impl/chset/basic_chset.ipp b/boost/spirit/home/classic/utility/impl/chset/basic_chset.ipp
new file mode 100644
index 0000000000..e7d9272345
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/chset/basic_chset.ipp
@@ -0,0 +1,246 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ Copyright (c) 2001-2003 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_BASIC_CHSET_IPP
+#define BOOST_SPIRIT_BASIC_CHSET_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <bitset>
+#include <boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// basic_chset: character set implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>::basic_chset() {}
+
+//////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>::basic_chset(basic_chset const& arg_)
+: rr(arg_.rr) {}
+
+//////////////////////////////////
+template <typename CharT>
+inline bool
+basic_chset<CharT>::test(CharT v) const
+{ return rr.test(v); }
+
+//////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::set(CharT from, CharT to)
+{ rr.set(utility::impl::range<CharT>(from, to)); }
+
+//////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::set(CharT c)
+{ rr.set(utility::impl::range<CharT>(c, c)); }
+
+//////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::clear(CharT from, CharT to)
+{ rr.clear(utility::impl::range<CharT>(from, to)); }
+
+//////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::clear()
+{ rr.clear(); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::inverse()
+{
+ basic_chset inv;
+ inv.set(
+ (std::numeric_limits<CharT>::min)(),
+ (std::numeric_limits<CharT>::max)()
+ );
+ inv -= *this;
+ swap(inv);
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::swap(basic_chset& x)
+{ rr.swap(x.rr); }
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>&
+basic_chset<CharT>::operator|=(basic_chset<CharT> const& x)
+{
+ typedef typename utility::impl::range_run<CharT>::const_iterator const_iterator;
+ for (const_iterator iter = x.rr.begin(); iter != x.rr.end(); ++iter)
+ rr.set(*iter);
+ return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>&
+basic_chset<CharT>::operator&=(basic_chset<CharT> const& x)
+{
+ basic_chset inv;
+ inv.set(
+ (std::numeric_limits<CharT>::min)(),
+ (std::numeric_limits<CharT>::max)()
+ );
+ inv -= x;
+ *this -= inv;
+ return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>&
+basic_chset<CharT>::operator-=(basic_chset<CharT> const& x)
+{
+ typedef typename utility::impl::range_run<CharT>::const_iterator const_iterator;
+ for (const_iterator iter = x.rr.begin(); iter != x.rr.end(); ++iter)
+ rr.clear(*iter);
+ return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>&
+basic_chset<CharT>::operator^=(basic_chset<CharT> const& x)
+{
+ basic_chset bma = x;
+ bma -= *this;
+ *this -= x;
+ *this |= bma;
+ return *this;
+}
+
+#if (CHAR_BIT == 8)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// basic_chset: specializations for 8 bit chars using std::bitset
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>::basic_chset_8bit() {}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>::basic_chset_8bit(basic_chset_8bit const& arg_)
+: bset(arg_.bset) {}
+
+/////////////////////////////////
+template <typename CharT>
+inline bool
+basic_chset_8bit<CharT>::test(CharT v) const
+{ return bset.test((unsigned char)v); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::set(CharT from, CharT to)
+{
+ for (int i = from; i <= to; ++i)
+ bset.set((unsigned char)i);
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::set(CharT c)
+{ bset.set((unsigned char)c); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::clear(CharT from, CharT to)
+{
+ for (int i = from; i <= to; ++i)
+ bset.reset((unsigned char)i);
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::clear(CharT c)
+{ bset.reset((unsigned char)c); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::clear()
+{ bset.reset(); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::inverse()
+{ bset.flip(); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::swap(basic_chset_8bit& x)
+{ std::swap(bset, x.bset); }
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>&
+basic_chset_8bit<CharT>::operator|=(basic_chset_8bit const& x)
+{
+ bset |= x.bset;
+ return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>&
+basic_chset_8bit<CharT>::operator&=(basic_chset_8bit const& x)
+{
+ bset &= x.bset;
+ return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>&
+basic_chset_8bit<CharT>::operator-=(basic_chset_8bit const& x)
+{
+ bset &= ~x.bset;
+ return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>&
+basic_chset_8bit<CharT>::operator^=(basic_chset_8bit const& x)
+{
+ bset ^= x.bset;
+ return *this;
+}
+
+#endif
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/impl/chset/range_run.hpp b/boost/spirit/home/classic/utility/impl/chset/range_run.hpp
new file mode 100644
index 0000000000..579bcaec70
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/chset/range_run.hpp
@@ -0,0 +1,127 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_RANGE_RUN_HPP
+#define BOOST_SPIRIT_RANGE_RUN_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <vector>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace utility { namespace impl {
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // range class
+ //
+ // Implements a closed range of values. This class is used in
+ // the implementation of the range_run class.
+ //
+ // { Low level implementation detail }
+ // { Not to be confused with BOOST_SPIRIT_CLASSIC_NS::range }
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT>
+ struct range {
+
+ range(CharT first, CharT last);
+
+ bool is_valid() const;
+ bool includes(CharT v) const;
+ bool includes(range const& r) const;
+ bool overlaps(range const& r) const;
+ void merge(range const& r);
+
+ CharT first;
+ CharT last;
+ };
+
+ //////////////////////////////////
+ template <typename CharT>
+ struct range_char_compare {
+
+ bool operator()(range<CharT> const& x, const CharT y) const
+ { return x.first < y; }
+
+ bool operator()(const CharT x, range<CharT> const& y) const
+ { return x < y.first; }
+
+ // This additional operator is required for the checked STL shipped
+ // with VC8 testing the ordering of the iterators passed to the
+ // std::lower_bound algo this range_char_compare<> predicate is passed
+ // to.
+ bool operator()(range<CharT> const& x, range<CharT> const& y) const
+ { return x.first < y.first; }
+ };
+
+ //////////////////////////////////
+ template <typename CharT>
+ struct range_compare {
+
+ bool operator()(range<CharT> const& x, range<CharT> const& y) const
+ { return x.first < y.first; }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // range_run
+ //
+ // An implementation of a sparse bit (boolean) set. The set uses
+ // a sorted vector of disjoint ranges. This class implements the
+ // bare minimum essentials from which the full range of set
+ // operators can be implemented. The set is constructed from
+ // ranges. Internally, adjacent or overlapping ranges are
+ // coalesced.
+ //
+ // range_runs are very space-economical in situations where there
+ // are lots of ranges and a few individual disjoint values.
+ // Searching is O(log n) where n is the number of ranges.
+ //
+ // { Low level implementation detail }
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT>
+ class range_run {
+
+ public:
+
+ typedef range<CharT> range_t;
+ typedef std::vector<range_t> run_t;
+ typedef typename run_t::iterator iterator;
+ typedef typename run_t::const_iterator const_iterator;
+
+ void swap(range_run& rr);
+ bool test(CharT v) const;
+ void set(range_t const& r);
+ void clear(range_t const& r);
+ void clear();
+
+ const_iterator begin() const;
+ const_iterator end() const;
+
+ private:
+
+ void merge(iterator iter, range_t const& r);
+
+ run_t run;
+ };
+
+}}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS::utility::impl
+
+#endif
+
+#include <boost/spirit/home/classic/utility/impl/chset/range_run.ipp>
diff --git a/boost/spirit/home/classic/utility/impl/chset/range_run.ipp b/boost/spirit/home/classic/utility/impl/chset/range_run.ipp
new file mode 100644
index 0000000000..ede15673fc
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/chset/range_run.ipp
@@ -0,0 +1,218 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_RANGE_RUN_IPP
+#define BOOST_SPIRIT_RANGE_RUN_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <algorithm> // for std::lower_bound
+#include <boost/spirit/home/classic/core/assert.hpp> // for BOOST_SPIRIT_ASSERT
+#include <boost/spirit/home/classic/utility/impl/chset/range_run.hpp>
+#include <boost/spirit/home/classic/debug.hpp>
+#include <boost/limits.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ namespace utility { namespace impl {
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // range class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename CharT>
+ inline range<CharT>::range(CharT first_, CharT last_)
+ : first(first_), last(last_) {}
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline bool
+ range<CharT>::is_valid() const
+ { return first <= last; }
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline bool
+ range<CharT>::includes(range const& r) const
+ { return (first <= r.first) && (last >= r.last); }
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline bool
+ range<CharT>::includes(CharT v) const
+ { return (first <= v) && (last >= v); }
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline bool
+ range<CharT>::overlaps(range const& r) const
+ {
+ CharT decr_first =
+ first == (std::numeric_limits<CharT>::min)() ? first : first-1;
+ CharT incr_last =
+ last == (std::numeric_limits<CharT>::max)() ? last : last+1;
+
+ return (decr_first <= r.last) && (incr_last >= r.first);
+ }
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline void
+ range<CharT>::merge(range const& r)
+ {
+ first = (std::min)(first, r.first);
+ last = (std::max)(last, r.last);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // range_run class implementation
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename CharT>
+ inline bool
+ range_run<CharT>::test(CharT v) const
+ {
+ if (!run.empty())
+ {
+ const_iterator iter =
+ std::lower_bound(
+ run.begin(), run.end(), v,
+ range_char_compare<CharT>()
+ );
+
+ if (iter != run.end() && iter->includes(v))
+ return true;
+ if (iter != run.begin())
+ return (--iter)->includes(v);
+ }
+ return false;
+ }
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline void
+ range_run<CharT>::swap(range_run& rr)
+ { run.swap(rr.run); }
+
+ //////////////////////////////////
+ template <typename CharT>
+ void
+ range_run<CharT>::merge(iterator iter, range<CharT> const& r)
+ {
+ iter->merge(r);
+ iterator i = iter + 1;
+
+ while (i != run.end() && iter->overlaps(*i))
+ iter->merge(*i++);
+
+ run.erase(iter+1, i);
+ }
+
+ //////////////////////////////////
+ template <typename CharT>
+ void
+ range_run<CharT>::set(range<CharT> const& r)
+ {
+ BOOST_SPIRIT_ASSERT(r.is_valid());
+ if (!run.empty())
+ {
+ iterator iter =
+ std::lower_bound(
+ run.begin(), run.end(), r,
+ range_compare<CharT>()
+ );
+
+ if ((iter != run.end() && iter->includes(r)) ||
+ ((iter != run.begin()) && (iter - 1)->includes(r)))
+ return;
+
+ if (iter != run.begin() && (iter - 1)->overlaps(r))
+ merge(--iter, r);
+
+ else if (iter != run.end() && iter->overlaps(r))
+ merge(iter, r);
+
+ else
+ run.insert(iter, r);
+ }
+ else
+ {
+ run.push_back(r);
+ }
+ }
+
+ //////////////////////////////////
+ template <typename CharT>
+ void
+ range_run<CharT>::clear(range<CharT> const& r)
+ {
+ BOOST_SPIRIT_ASSERT(r.is_valid());
+ if (!run.empty())
+ {
+ iterator iter =
+ std::lower_bound(
+ run.begin(), run.end(), r,
+ range_compare<CharT>()
+ );
+
+ iterator left_iter;
+
+ if ((iter != run.begin()) &&
+ (left_iter = (iter - 1))->includes(r.first))
+ {
+ if (left_iter->last > r.last)
+ {
+ CharT save_last = left_iter->last;
+ left_iter->last = r.first-1;
+ run.insert(iter, range<CharT>(r.last+1, save_last));
+ return;
+ }
+ else
+ {
+ left_iter->last = r.first-1;
+ }
+ }
+
+ iterator i = iter;
+ while (i != run.end() && r.includes(*i))
+ i++;
+ if (i != run.end() && i->includes(r.last))
+ i->first = r.last+1;
+ run.erase(iter, i);
+ }
+ }
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline void
+ range_run<CharT>::clear()
+ { run.clear(); }
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline typename range_run<CharT>::const_iterator
+ range_run<CharT>::begin() const
+ { return run.begin(); }
+
+ //////////////////////////////////
+ template <typename CharT>
+ inline typename range_run<CharT>::const_iterator
+ range_run<CharT>::end() const
+ { return run.end(); }
+
+ }} // namespace utility::impl
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/spirit/home/classic/utility/impl/chset_operators.ipp b/boost/spirit/home/classic/utility/impl/chset_operators.ipp
new file mode 100644
index 0000000000..4319c9b2a8
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/chset_operators.ipp
@@ -0,0 +1,666 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_CHSET_OPERATORS_IPP
+#define BOOST_SPIRIT_CHSET_OPERATORS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/limits.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) |= b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) -= b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator~(chset<CharT> const& a)
+{
+ return chset<CharT>(a).inverse();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) &= b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) ^= b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// range <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, range<CharT> const& b)
+{
+ chset<CharT> a_(a);
+ a_.set(b);
+ return a_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, range<CharT> const& b)
+{
+ chset<CharT> a_(a);
+ if(b.first != (std::numeric_limits<CharT>::min)()) {
+ a_.clear(range<CharT>((std::numeric_limits<CharT>::min)(), b.first - 1));
+ }
+ if(b.last != (std::numeric_limits<CharT>::max)()) {
+ a_.clear(range<CharT>(b.last + 1, (std::numeric_limits<CharT>::max)()));
+ }
+ return a_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, range<CharT> const& b)
+{
+ chset<CharT> a_(a);
+ a_.clear(b);
+ return a_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, range<CharT> const& b)
+{
+ return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(range<CharT> const& a, chset<CharT> const& b)
+{
+ chset<CharT> b_(b);
+ b_.set(a);
+ return b_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(range<CharT> const& a, chset<CharT> const& b)
+{
+ chset<CharT> b_(b);
+ if(a.first != (std::numeric_limits<CharT>::min)()) {
+ b_.clear(range<CharT>((std::numeric_limits<CharT>::min)(), a.first - 1));
+ }
+ if(a.last != (std::numeric_limits<CharT>::max)()) {
+ b_.clear(range<CharT>(a.last + 1, (std::numeric_limits<CharT>::max)()));
+ }
+ return b_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(range<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(range<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) ^ b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// literal primitives <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, CharT b)
+{
+ return a | chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, CharT b)
+{
+ return a & chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, CharT b)
+{
+ return a - chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, CharT b)
+{
+ return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(CharT a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) | b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(CharT a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) & b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(CharT a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(CharT a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) ^ b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// chlit <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, chlit<CharT> const& b)
+{
+ return a | chset<CharT>(b.ch);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, chlit<CharT> const& b)
+{
+ return a & chset<CharT>(b.ch);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, chlit<CharT> const& b)
+{
+ return a - chset<CharT>(b.ch);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, chlit<CharT> const& b)
+{
+ return a ^ chset<CharT>(b.ch);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chlit<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a.ch) | b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chlit<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a.ch) & b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chlit<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a.ch) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chlit<CharT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a.ch) ^ b;
+}
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// negated_char_parser <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<ParserT> const& b)
+{
+ return a | chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<ParserT> const& b)
+{
+ return a & chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<ParserT> const& b)
+{
+ return a - chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<ParserT> const& b)
+{
+ return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator|(negated_char_parser<ParserT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) | b;
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator&(negated_char_parser<ParserT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) & b;
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator-(negated_char_parser<ParserT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator^(negated_char_parser<ParserT> const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) ^ b;
+}
+
+#else // BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// negated_char_parser<range> <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b)
+{
+ return a | chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b)
+{
+ return a & chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b)
+{
+ return a - chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b)
+{
+ return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) | b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) & b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) ^ b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// negated_char_parser<chlit> <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b)
+{
+ return a | chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b)
+{
+ return a & chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b)
+{
+ return a - chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b)
+{
+ return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) | b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) & b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b)
+{
+ return chset<CharT>(a) ^ b;
+}
+
+#endif // BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// anychar_parser <--> chset free operators
+//
+// Where a is chset and b is a anychar_parser, and vice-versa, implements:
+//
+// a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+ template <typename CharT>
+ inline BOOST_SPIRIT_CLASSIC_NS::range<CharT> const&
+ full()
+ {
+ static BOOST_SPIRIT_CLASSIC_NS::range<CharT> full_(
+ (std::numeric_limits<CharT>::min)(),
+ (std::numeric_limits<CharT>::max)());
+ return full_;
+ }
+
+ template <typename CharT>
+ inline BOOST_SPIRIT_CLASSIC_NS::range<CharT> const&
+ empty()
+ {
+ static BOOST_SPIRIT_CLASSIC_NS::range<CharT> empty_;
+ return empty_;
+ }
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const&, anychar_parser)
+{
+ return chset<CharT>(impl::full<CharT>());
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, anychar_parser)
+{
+ return a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const&, anychar_parser)
+{
+ return chset<CharT>();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, anychar_parser)
+{
+ return ~a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(anychar_parser, chset<CharT> const& /*b*/)
+{
+ return chset<CharT>(impl::full<CharT>());
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(anychar_parser, chset<CharT> const& b)
+{
+ return b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(anychar_parser, chset<CharT> const& b)
+{
+ return ~b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(anychar_parser, chset<CharT> const& b)
+{
+ return ~b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// nothing_parser <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, nothing_parser)
+{
+ return a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& /*a*/, nothing_parser)
+{
+ return impl::empty<CharT>();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, nothing_parser)
+{
+ return a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, nothing_parser)
+{
+ return a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(nothing_parser, chset<CharT> const& b)
+{
+ return b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(nothing_parser, chset<CharT> const& /*b*/)
+{
+ return impl::empty<CharT>();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(nothing_parser, chset<CharT> const& /*b*/)
+{
+ return impl::empty<CharT>();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(nothing_parser, chset<CharT> const& b)
+{
+ return b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/impl/confix.ipp b/boost/spirit/home/classic/utility/impl/confix.ipp
new file mode 100644
index 0000000000..494c4807cd
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/confix.ipp
@@ -0,0 +1,221 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_CONFIX_IPP
+#define BOOST_SPIRIT_CONFIX_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/meta/refactoring.hpp>
+#include <boost/spirit/home/classic/core/composite/impl/directives.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Types to distinguish nested and non-nested confix parsers
+//
+///////////////////////////////////////////////////////////////////////////////
+struct is_nested {};
+struct non_nested {};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Types to distinguish between confix parsers, which are implicitly lexems
+// and without this behaviour
+//
+///////////////////////////////////////////////////////////////////////////////
+struct is_lexeme {};
+struct non_lexeme {};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// confix_parser_type class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+ ///////////////////////////////////////////////////////////////////////////
+ // implicitly insert a lexeme_d into the parsing process
+
+ template <typename LexemeT>
+ struct select_confix_parse_lexeme;
+
+ template <>
+ struct select_confix_parse_lexeme<is_lexeme> {
+
+ template <typename ParserT, typename ScannerT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const& p, ScannerT const& scan)
+ {
+ typedef typename parser_result<ParserT, ScannerT>::type result_t;
+ return contiguous_parser_parse<result_t>(p, scan, scan);
+ }
+ };
+
+ template <>
+ struct select_confix_parse_lexeme<non_lexeme> {
+
+ template <typename ParserT, typename ScannerT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ParserT const& p, ScannerT const& scan)
+ {
+ return p.parse(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // parse confix sequences with refactoring
+
+ template <typename NestedT>
+ struct select_confix_parse_refactor;
+
+ template <>
+ struct select_confix_parse_refactor<is_nested> {
+
+ template <
+ typename LexemeT, typename ParserT, typename ScannerT,
+ typename OpenT, typename ExprT, typename CloseT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(
+ LexemeT const &, ParserT const& this_, ScannerT const& scan,
+ OpenT const& open, ExprT const& expr, CloseT const& close)
+ {
+ typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
+ const refactor_t refactor_body_d = refactor_t(refactor_unary_d);
+
+ return select_confix_parse_lexeme<LexemeT>::parse((
+ open
+ >> (this_ | refactor_body_d[expr - close])
+ >> close
+ ), scan);
+ }
+ };
+
+ template <>
+ struct select_confix_parse_refactor<non_nested> {
+
+ template <
+ typename LexemeT, typename ParserT, typename ScannerT,
+ typename OpenT, typename ExprT, typename CloseT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(
+ LexemeT const &, ParserT const& /*this_*/, ScannerT const& scan,
+ OpenT const& open, ExprT const& expr, CloseT const& close)
+ {
+ typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
+ const refactor_t refactor_body_d = refactor_t(refactor_unary_d);
+
+ return select_confix_parse_lexeme<LexemeT>::parse((
+ open
+ >> refactor_body_d[expr - close]
+ >> close
+ ), scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // parse confix sequences without refactoring
+
+ template <typename NestedT>
+ struct select_confix_parse_no_refactor;
+
+ template <>
+ struct select_confix_parse_no_refactor<is_nested> {
+
+ template <
+ typename LexemeT, typename ParserT, typename ScannerT,
+ typename OpenT, typename ExprT, typename CloseT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(
+ LexemeT const &, ParserT const& this_, ScannerT const& scan,
+ OpenT const& open, ExprT const& expr, CloseT const& close)
+ {
+ return select_confix_parse_lexeme<LexemeT>::parse((
+ open
+ >> (this_ | (expr - close))
+ >> close
+ ), scan);
+ }
+ };
+
+ template <>
+ struct select_confix_parse_no_refactor<non_nested> {
+
+ template <
+ typename LexemeT, typename ParserT, typename ScannerT,
+ typename OpenT, typename ExprT, typename CloseT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(
+ LexemeT const &, ParserT const & /*this_*/, ScannerT const& scan,
+ OpenT const& open, ExprT const& expr, CloseT const& close)
+ {
+ return select_confix_parse_lexeme<LexemeT>::parse((
+ open
+ >> (expr - close)
+ >> close
+ ), scan);
+ }
+ };
+
+ // the refactoring is handled by the refactoring parsers, so here there
+ // is no need to pay attention to these issues.
+
+ template <typename CategoryT>
+ struct confix_parser_type {
+
+ template <
+ typename NestedT, typename LexemeT,
+ typename ParserT, typename ScannerT,
+ typename OpenT, typename ExprT, typename CloseT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(
+ NestedT const &, LexemeT const &lexeme,
+ ParserT const& this_, ScannerT const& scan,
+ OpenT const& open, ExprT const& expr, CloseT const& close)
+ {
+ return select_confix_parse_refactor<NestedT>::
+ parse(lexeme, this_, scan, open, expr, close);
+ }
+ };
+
+ template <>
+ struct confix_parser_type<plain_parser_category> {
+
+ template <
+ typename NestedT, typename LexemeT,
+ typename ParserT, typename ScannerT,
+ typename OpenT, typename ExprT, typename CloseT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(
+ NestedT const &, LexemeT const &lexeme,
+ ParserT const& this_, ScannerT const& scan,
+ OpenT const& open, ExprT const& expr, CloseT const& close)
+ {
+ return select_confix_parse_no_refactor<NestedT>::
+ parse(lexeme, this_, scan, open, expr, close);
+ }
+ };
+
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/impl/escape_char.ipp b/boost/spirit/home/classic/utility/impl/escape_char.ipp
new file mode 100644
index 0000000000..55ab158472
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/escape_char.ipp
@@ -0,0 +1,224 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Daniel Nuffer
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_ESCAPE_CHAR_IPP
+#define BOOST_SPIRIT_ESCAPE_CHAR_IPP
+
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/primitives/numerics.hpp>
+#include <boost/spirit/home/classic/core/composite/difference.hpp>
+#include <boost/spirit/home/classic/core/composite/sequence.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// escape_char_parser class
+//
+///////////////////////////////////////////////////////////////////////////////
+
+const unsigned long c_escapes = 1;
+const unsigned long lex_escapes = c_escapes << 1;
+
+//////////////////////////////////
+namespace impl {
+
+ //////////////////////////////////
+#if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+ template <unsigned long Flags, typename CharT>
+ struct escape_char_action_parse {
+
+ template <typename ParserT, typename ScannerT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const& scan, ParserT const &p)
+ {
+ // Actually decode the escape char.
+ typedef CharT char_t;
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef typename parser_result<ParserT, ScannerT>::type result_t;
+
+ if (scan.first != scan.last) {
+
+ iterator_t save = scan.first;
+ if (result_t hit = p.subject().parse(scan)) {
+
+ char_t unescaped;
+
+ scan.first = save;
+ if (*scan.first == '\\') {
+
+ ++scan.first;
+ switch (*scan.first) {
+ case 'b': unescaped = '\b'; ++scan.first; break;
+ case 't': unescaped = '\t'; ++scan.first; break;
+ case 'n': unescaped = '\n'; ++scan.first; break;
+ case 'f': unescaped = '\f'; ++scan.first; break;
+ case 'r': unescaped = '\r'; ++scan.first; break;
+ case '"': unescaped = '"'; ++scan.first; break;
+ case '\'': unescaped = '\''; ++scan.first; break;
+ case '\\': unescaped = '\\'; ++scan.first; break;
+
+ case 'x': case 'X':
+ {
+ char_t hex = 0;
+ char_t const lim =
+ (std::numeric_limits<char_t>::max)() >> 4;
+
+ ++scan.first;
+ while (scan.first != scan.last)
+ {
+ char_t c = *scan.first;
+ if (hex > lim && impl::isxdigit_(c))
+ {
+ // overflow detected
+ scan.first = save;
+ return scan.no_match();
+ }
+ if (impl::isdigit_(c))
+ {
+ hex <<= 4;
+ hex |= c - '0';
+ ++scan.first;
+ }
+ else if (impl::isxdigit_(c))
+ {
+ hex <<= 4;
+ c = impl::toupper_(c);
+ hex |= c - 'A' + 0xA;
+ ++scan.first;
+ }
+ else
+ {
+ break; // reached the end of the number
+ }
+ }
+ unescaped = hex;
+ }
+ break;
+
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ {
+ char_t oct = 0;
+ char_t const lim =
+ (std::numeric_limits<char_t>::max)() >> 3;
+ while (scan.first != scan.last)
+ {
+ char_t c = *scan.first;
+ if (oct > lim && (c >= '0' && c <= '7'))
+ {
+ // overflow detected
+ scan.first = save;
+ return scan.no_match();
+ }
+
+ if (c >= '0' && c <= '7')
+ {
+ oct <<= 3;
+ oct |= c - '0';
+ ++scan.first;
+ }
+ else
+ {
+ break; // reached end of digits
+ }
+ }
+ unescaped = oct;
+ }
+ break;
+
+ default:
+ if (Flags & c_escapes)
+ {
+ // illegal C escape sequence
+ scan.first = save;
+ return scan.no_match();
+ }
+ else
+ {
+ unescaped = *scan.first;
+ ++scan.first;
+ }
+ break;
+ }
+ }
+ else {
+ unescaped = *scan.first;
+ ++scan.first;
+ }
+
+ scan.do_action(p.predicate(), unescaped, save, scan.first);
+ return hit;
+ }
+ }
+ return scan.no_match(); // overflow detected
+ }
+ };
+#if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
+#pragma warning(pop)
+#endif
+
+ //////////////////////////////////
+ template <typename CharT>
+ struct escape_char_parse {
+
+ template <typename ScannerT, typename ParserT>
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const &scan, ParserT const &/*p*/)
+ {
+ typedef
+ uint_parser<CharT, 8, 1,
+ std::numeric_limits<CharT>::digits / 3 + 1
+ >
+ oct_parser_t;
+ typedef
+ uint_parser<CharT, 16, 1,
+ std::numeric_limits<CharT>::digits / 4 + 1
+ >
+ hex_parser_t;
+
+ typedef alternative<difference<anychar_parser, chlit<CharT> >,
+ sequence<chlit<CharT>, alternative<alternative<oct_parser_t,
+ sequence<inhibit_case<chlit<CharT> >, hex_parser_t > >,
+ difference<difference<anychar_parser,
+ inhibit_case<chlit<CharT> > >, oct_parser_t > > > >
+ parser_t;
+
+ static parser_t p =
+ ( (anychar_p - chlit<CharT>(CharT('\\')))
+ | (chlit<CharT>(CharT('\\')) >>
+ ( oct_parser_t()
+ | as_lower_d[chlit<CharT>(CharT('x'))] >> hex_parser_t()
+ | (anychar_p - as_lower_d[chlit<CharT>(CharT('x'))] - oct_parser_t())
+ )
+ ));
+
+ BOOST_SPIRIT_DEBUG_TRACE_NODE(p,
+ (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_ESCAPE_CHAR) != 0);
+
+ return p.parse(scan);
+ }
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/impl/lists.ipp b/boost/spirit/home/classic/utility/impl/lists.ipp
new file mode 100644
index 0000000000..a3dd462fcd
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/lists.ipp
@@ -0,0 +1,168 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_LISTS_IPP
+#define BOOST_SPIRIT_LISTS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/meta/refactoring.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// list_parser_type class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+struct no_list_endtoken { typedef no_list_endtoken embed_t; };
+
+namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Refactor the original list item parser
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ // match list with 'extended' syntax
+ template <typename EndT>
+ struct select_list_parse_refactor {
+
+ template <
+ typename ParserT, typename ScannerT,
+ typename ItemT, typename DelimT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const& scan, ParserT const& /*p*/,
+ ItemT const &item, DelimT const &delim, EndT const &end)
+ {
+ typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
+ const refactor_t refactor_item_d = refactor_t(refactor_unary_d);
+
+ return (
+ refactor_item_d[item - (end | delim)]
+ >> *(delim >> refactor_item_d[item - (end | delim)])
+ >> !(delim >> end)
+ ).parse(scan);
+ }
+ };
+
+ // match list with 'normal' syntax (without an 'end' parser)
+ template <>
+ struct select_list_parse_refactor<no_list_endtoken> {
+
+ template <
+ typename ParserT, typename ScannerT,
+ typename ItemT, typename DelimT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const& scan, ParserT const& /*p*/,
+ ItemT const &item, DelimT const &delim, no_list_endtoken const&)
+ {
+ typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
+ const refactor_t refactor_item_d = refactor_t(refactor_unary_d);
+
+ return (
+ refactor_item_d[item - delim]
+ >> *(delim >> refactor_item_d[item - delim])
+ ).parse(scan);
+ }
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Do not refactor the original list item parser.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ // match list with 'extended' syntax
+ template <typename EndT>
+ struct select_list_parse_no_refactor {
+
+ template <
+ typename ParserT, typename ScannerT,
+ typename ItemT, typename DelimT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const& scan, ParserT const& /*p*/,
+ ItemT const &item, DelimT const &delim, EndT const &end)
+ {
+ return (
+ (item - (end | delim))
+ >> *(delim >> (item - (end | delim)))
+ >> !(delim >> end)
+ ).parse(scan);
+ }
+ };
+
+ // match list with 'normal' syntax (without an 'end' parser)
+ template <>
+ struct select_list_parse_no_refactor<no_list_endtoken> {
+
+ template <
+ typename ParserT, typename ScannerT,
+ typename ItemT, typename DelimT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const& scan, ParserT const& /*p*/,
+ ItemT const &item, DelimT const &delim, no_list_endtoken const&)
+ {
+ return (
+ (item - delim)
+ >> *(delim >> (item - delim))
+ ).parse(scan);
+ }
+ };
+
+ // the refactoring is handled by the refactoring parsers, so here there
+ // is no need to pay attention to these issues.
+
+ template <typename CategoryT>
+ struct list_parser_type {
+
+ template <
+ typename ParserT, typename ScannerT,
+ typename ItemT, typename DelimT, typename EndT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const& scan, ParserT const& p,
+ ItemT const &item, DelimT const &delim, EndT const &end)
+ {
+ return select_list_parse_refactor<EndT>::
+ parse(scan, p, item, delim, end);
+ }
+ };
+
+ template <>
+ struct list_parser_type<plain_parser_category> {
+
+ template <
+ typename ParserT, typename ScannerT,
+ typename ItemT, typename DelimT, typename EndT
+ >
+ static typename parser_result<ParserT, ScannerT>::type
+ parse(ScannerT const& scan, ParserT const& p,
+ ItemT const &item, DelimT const &delim, EndT const &end)
+ {
+ return select_list_parse_no_refactor<EndT>::
+ parse(scan, p, item, delim, end);
+ }
+ };
+
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/impl/regex.ipp b/boost/spirit/home/classic/utility/impl/regex.ipp
new file mode 100644
index 0000000000..655c1e5c8d
--- /dev/null
+++ b/boost/spirit/home/classic/utility/impl/regex.ipp
@@ -0,0 +1,81 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ 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_SPIRIT_REGEX_IPP
+#define BOOST_SPIRIT_REGEX_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/core/primitives/impl/primitives.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+inline const char* rx_prefix(char) { return "\\A"; }
+inline const wchar_t* rx_prefix(wchar_t) { return L"\\A"; }
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// rx_parser class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT = char>
+class rx_parser : public parser<rx_parser<CharT> > {
+
+public:
+ typedef std::basic_string<CharT> string_t;
+ typedef rx_parser<CharT> self_t;
+
+ rx_parser(CharT const *first, CharT const *last)
+ {
+ rxstr = string_t(rx_prefix(CharT())) + string_t(first, last);
+ }
+
+ rx_parser(CharT const *first)
+ {
+ rxstr = string_t(rx_prefix(CharT())) +
+ string_t(first, impl::get_last(first));
+ }
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ boost::match_results<typename ScannerT::iterator_t> what;
+ boost::regex_search(scan.first, scan.last, what, rxstr,
+ boost::match_default);
+
+ if (!what[0].matched)
+ return scan.no_match();
+
+ scan.first = what[0].second;
+ return scan.create_match(what[0].length(), nil_t(),
+ what[0].first, scan.first);
+ }
+
+private:
+#if BOOST_VERSION >= 013300
+ boost::basic_regex<CharT> rxstr; // regular expression to match
+#else
+ boost::reg_expression<CharT> rxstr; // regular expression to match
+#endif
+};
+
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_REGEX_IPP
diff --git a/boost/spirit/home/classic/utility/lists.hpp b/boost/spirit/home/classic/utility/lists.hpp
new file mode 100644
index 0000000000..48e9de01da
--- /dev/null
+++ b/boost/spirit/home/classic/utility/lists.hpp
@@ -0,0 +1,340 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_LISTS_HPP
+#define BOOST_SPIRIT_LISTS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/config.hpp>
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+
+#include <boost/spirit/home/classic/utility/lists_fwd.hpp>
+#include <boost/spirit/home/classic/utility/impl/lists.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// list_parser class
+//
+// List parsers allow to parse constructs like
+//
+// item >> *(delim >> item)
+//
+// where 'item' is an auxiliary expression to parse and 'delim' is an
+// auxiliary delimiter to parse.
+//
+// The list_parser class also can match an optional closing delimiter
+// represented by the 'end' parser at the end of the list:
+//
+// item >> *(delim >> item) >> !end.
+//
+// If ItemT is an action_parser_category type (parser with an attached
+// semantic action) we have to do something special. This happens, if the
+// user wrote something like:
+//
+// list_p(item[f], delim)
+//
+// where 'item' is the parser matching one item of the list sequence and
+// 'f' is a functor to be called after matching one item. If we would do
+// nothing, the resulting code would parse the sequence as follows:
+//
+// (item[f] - delim) >> *(delim >> (item[f] - delim))
+//
+// what in most cases is not what the user expects.
+// (If this _is_ what you've expected, then please use one of the list_p
+// generator functions 'direct()', which will inhibit re-attaching
+// the actor to the item parser).
+//
+// To make the list parser behave as expected:
+//
+// (item - delim)[f] >> *(delim >> (item - delim)[f])
+//
+// the actor attached to the 'item' parser has to be re-attached to the
+// *(item - delim) parser construct, which will make the resulting list
+// parser 'do the right thing'.
+//
+// Additionally special care must be taken, if the item parser is a
+// unary_parser_category type parser as
+//
+// list_p(*anychar_p, ',')
+//
+// which without any refactoring would result in
+//
+// (*anychar_p - ch_p(','))
+// >> *( ch_p(',') >> (*anychar_p - ch_p(',')) )
+//
+// and will not give the expected result (the first *anychar_p will eat up
+// all the input up to the end of the input stream). So we have to
+// refactor this into:
+//
+// *(anychar_p - ch_p(','))
+// >> *( ch_p(',') >> *(anychar_p - ch_p(',')) )
+//
+// what will give the correct result.
+//
+// The case, where the item parser is a combination of the two mentioned
+// problems (i.e. the item parser is a unary parser with an attached
+// action), is handled accordingly too:
+//
+// list_p((*anychar_p)[f], ',')
+//
+// will be parsed as expected:
+//
+// (*(anychar_p - ch_p(',')))[f]
+// >> *( ch_p(',') >> (*(anychar_p - ch_p(',')))[f] ).
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+ typename ItemT, typename DelimT, typename EndT, typename CategoryT
+>
+struct list_parser :
+ public parser<list_parser<ItemT, DelimT, EndT, CategoryT> > {
+
+ typedef list_parser<ItemT, DelimT, EndT, CategoryT> self_t;
+ typedef CategoryT parser_category_t;
+
+ list_parser(ItemT const &item_, DelimT const &delim_,
+ EndT const& end_ = no_list_endtoken())
+ : item(item_), delim(delim_), end(end_)
+ {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ return impl::list_parser_type<CategoryT>
+ ::parse(scan, *this, item, delim, end);
+ }
+
+private:
+ typename as_parser<ItemT>::type::embed_t item;
+ typename as_parser<DelimT>::type::embed_t delim;
+ typename as_parser<EndT>::type::embed_t end;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// List parser generator template
+//
+// This is a helper for generating a correct list_parser<> from
+// auxiliary parameters. There are the following types supported as
+// parameters yet: parsers, single characters and strings (see
+// as_parser<> in meta/as_parser.hpp).
+//
+// The list_parser_gen by itself can be used for parsing comma separated
+// lists without item formatting:
+//
+// list_p.parse(...)
+// matches any comma separated list.
+//
+// If list_p is used with one parameter, this parameter is used to match
+// the delimiter:
+//
+// list_p(';').parse(...)
+// matches any semicolon separated list.
+//
+// If list_p is used with two parameters, the first parameter is used to
+// match the items and the second parameter matches the delimiters:
+//
+// list_p(uint_p, ',').parse(...)
+// matches comma separated unsigned integers.
+//
+// If list_p is used with three parameters, the first parameter is used
+// to match the items, the second one is used to match the delimiters and
+// the third one is used to match an optional ending token sequence:
+//
+// list_p(real_p, ';', eol_p).parse(...)
+// matches a semicolon separated list of real numbers optionally
+// followed by an end of line.
+//
+// The list_p in the previous examples denotes the predefined parser
+// generator, which should be used to define list parsers (see below).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename CharT = char>
+struct list_parser_gen :
+ public list_parser<kleene_star<anychar_parser>, chlit<CharT> >
+{
+ typedef list_parser_gen<CharT> self_t;
+
+// construct the list_parser_gen object as an list parser for comma separated
+// lists without item formatting.
+ list_parser_gen()
+ : list_parser<kleene_star<anychar_parser>, chlit<CharT> >
+ (*anychar_p, chlit<CharT>(','))
+ {}
+
+// The following generator functions should be used under normal circumstances.
+// (the operator()(...) functions)
+
+ // Generic generator functions for creation of concrete list parsers, which
+ // support 'normal' syntax:
+ //
+ // item >> *(delim >> item)
+ //
+ // If item isn't given, everything between two delimiters is matched.
+
+ template<typename DelimT>
+ list_parser<
+ kleene_star<anychar_parser>,
+ typename as_parser<DelimT>::type,
+ no_list_endtoken,
+ unary_parser_category // there is no action to re-attach
+ >
+ operator()(DelimT const &delim_) const
+ {
+ typedef kleene_star<anychar_parser> item_t;
+ typedef typename as_parser<DelimT>::type delim_t;
+
+ typedef
+ list_parser<item_t, delim_t, no_list_endtoken, unary_parser_category>
+ return_t;
+
+ return return_t(*anychar_p, as_parser<DelimT>::convert(delim_));
+ }
+
+ template<typename ItemT, typename DelimT>
+ list_parser<
+ typename as_parser<ItemT>::type,
+ typename as_parser<DelimT>::type,
+ no_list_endtoken,
+ typename as_parser<ItemT>::type::parser_category_t
+ >
+ operator()(ItemT const &item_, DelimT const &delim_) const
+ {
+ typedef typename as_parser<ItemT>::type item_t;
+ typedef typename as_parser<DelimT>::type delim_t;
+ typedef list_parser<item_t, delim_t, no_list_endtoken,
+ BOOST_DEDUCED_TYPENAME item_t::parser_category_t>
+ return_t;
+
+ return return_t(
+ as_parser<ItemT>::convert(item_),
+ as_parser<DelimT>::convert(delim_)
+ );
+ }
+
+ // Generic generator function for creation of concrete list parsers, which
+ // support 'extended' syntax:
+ //
+ // item >> *(delim >> item) >> !end
+
+ template<typename ItemT, typename DelimT, typename EndT>
+ list_parser<
+ typename as_parser<ItemT>::type,
+ typename as_parser<DelimT>::type,
+ typename as_parser<EndT>::type,
+ typename as_parser<ItemT>::type::parser_category_t
+ >
+ operator()(
+ ItemT const &item_, DelimT const &delim_, EndT const &end_) const
+ {
+ typedef typename as_parser<ItemT>::type item_t;
+ typedef typename as_parser<DelimT>::type delim_t;
+ typedef typename as_parser<EndT>::type end_t;
+
+ typedef list_parser<item_t, delim_t, end_t,
+ BOOST_DEDUCED_TYPENAME item_t::parser_category_t>
+ return_t;
+
+ return return_t(
+ as_parser<ItemT>::convert(item_),
+ as_parser<DelimT>::convert(delim_),
+ as_parser<EndT>::convert(end_)
+ );
+ }
+
+// The following functions should be used, if the 'item' parser has an attached
+// semantic action or is a unary_parser_category type parser and the structure
+// of the resulting list parser should _not_ be refactored during parser
+// construction (see comment above).
+
+ // Generic generator function for creation of concrete list parsers, which
+ // support 'normal' syntax:
+ //
+ // item >> *(delim >> item)
+
+ template<typename ItemT, typename DelimT>
+ list_parser<
+ typename as_parser<ItemT>::type,
+ typename as_parser<DelimT>::type,
+ no_list_endtoken,
+ plain_parser_category // inhibit action re-attachment
+ >
+ direct(ItemT const &item_, DelimT const &delim_) const
+ {
+ typedef typename as_parser<ItemT>::type item_t;
+ typedef typename as_parser<DelimT>::type delim_t;
+ typedef list_parser<item_t, delim_t, no_list_endtoken,
+ plain_parser_category>
+ return_t;
+
+ return return_t(
+ as_parser<ItemT>::convert(item_),
+ as_parser<DelimT>::convert(delim_)
+ );
+ }
+
+ // Generic generator function for creation of concrete list parsers, which
+ // support 'extended' syntax:
+ //
+ // item >> *(delim >> item) >> !end
+
+ template<typename ItemT, typename DelimT, typename EndT>
+ list_parser<
+ typename as_parser<ItemT>::type,
+ typename as_parser<DelimT>::type,
+ typename as_parser<EndT>::type,
+ plain_parser_category // inhibit action re-attachment
+ >
+ direct(
+ ItemT const &item_, DelimT const &delim_, EndT const &end_) const
+ {
+ typedef typename as_parser<ItemT>::type item_t;
+ typedef typename as_parser<DelimT>::type delim_t;
+ typedef typename as_parser<EndT>::type end_t;
+
+ typedef
+ list_parser<item_t, delim_t, end_t, plain_parser_category>
+ return_t;
+
+ return return_t(
+ as_parser<ItemT>::convert(item_),
+ as_parser<DelimT>::convert(delim_),
+ as_parser<EndT>::convert(end_)
+ );
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Predefined list parser generator
+//
+// The list_p parser generator can be used
+// - by itself for parsing comma separated lists without item formatting
+// or
+// - for generating list parsers with auxiliary parser parameters
+// for the 'item', 'delim' and 'end' subsequences.
+// (see comment above)
+//
+///////////////////////////////////////////////////////////////////////////////
+const list_parser_gen<> list_p = list_parser_gen<>();
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
diff --git a/boost/spirit/home/classic/utility/lists_fwd.hpp b/boost/spirit/home/classic/utility/lists_fwd.hpp
new file mode 100644
index 0000000000..1defcb6d66
--- /dev/null
+++ b/boost/spirit/home/classic/utility/lists_fwd.hpp
@@ -0,0 +1,31 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_LISTS_FWD_HPP)
+#define BOOST_SPIRIT_LISTS_FWD_HPP
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ struct no_list_endtoken;
+
+ template <
+ typename ItemT, typename DelimT, typename EndT = no_list_endtoken,
+ typename CategoryT = plain_parser_category
+ >
+ struct list_parser;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif
+
diff --git a/boost/spirit/home/classic/utility/loops.hpp b/boost/spirit/home/classic/utility/loops.hpp
new file mode 100644
index 0000000000..97fc1d3c78
--- /dev/null
+++ b/boost/spirit/home/classic/utility/loops.hpp
@@ -0,0 +1,317 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ Copyright (c) 2002 Raghavendra Satish
+ Copyright (c) 2002 Jeff Westfahl
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_LOOPS_HPP)
+#define BOOST_SPIRIT_LOOPS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // fixed_loop class
+ //
+ // This class takes care of the construct:
+ //
+ // repeat_p (exact) [p]
+ //
+ // where 'p' is a parser and 'exact' is the number of times to
+ // repeat. The parser iterates over the input exactly 'exact' times.
+ // The parse function fails if the parser does not match the input
+ // exactly 'exact' times.
+ //
+ // This class is parametizable and can accept constant arguments
+ // (e.g. repeat_p (5) [p]) as well as references to variables (e.g.
+ // repeat_p (ref (n)) [p]).
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename ParserT, typename ExactT>
+ class fixed_loop
+ : public unary<ParserT, parser <fixed_loop <ParserT, ExactT> > >
+ {
+ public:
+
+ typedef fixed_loop<ParserT, ExactT> self_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ fixed_loop (ParserT const & subject_, ExactT const & exact)
+ : base_t(subject_), m_exact(exact) {}
+
+ template <typename ScannerT>
+ typename parser_result <self_t, ScannerT>::type
+ parse (ScannerT const & scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ result_t hit = scan.empty_match();
+ std::size_t n = m_exact;
+
+ for (std::size_t i = 0; i < n; ++i)
+ {
+ if (result_t next = this->subject().parse(scan))
+ {
+ scan.concat_match(hit, next);
+ }
+ else
+ {
+ return scan.no_match();
+ }
+ }
+
+ return hit;
+ }
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ private:
+
+ ExactT m_exact;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //
+ // finite_loop class
+ //
+ // This class takes care of the construct:
+ //
+ // repeat_p (min, max) [p]
+ //
+ // where 'p' is a parser, 'min' and 'max' specifies the minimum and
+ // maximum iterations over 'p'. The parser iterates over the input
+ // at least 'min' times and at most 'max' times. The parse function
+ // fails if the parser does not match the input at least 'min' times
+ // and at most 'max' times.
+ //
+ // This class is parametizable and can accept constant arguments
+ // (e.g. repeat_p (5, 10) [p]) as well as references to variables
+ // (e.g. repeat_p (ref (n1), ref (n2)) [p]).
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ template <typename ParserT, typename MinT, typename MaxT>
+ class finite_loop
+ : public unary<ParserT, parser<finite_loop<ParserT, MinT, MaxT> > >
+ {
+ public:
+
+ typedef finite_loop <ParserT, MinT, MaxT> self_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ finite_loop (ParserT const & subject_, MinT const & min, MaxT const & max)
+ : base_t(subject_), m_min(min), m_max(max) {}
+
+ template <typename ScannerT>
+ typename parser_result <self_t, ScannerT>::type
+ parse(ScannerT const & scan) const
+ {
+ BOOST_SPIRIT_ASSERT(m_min <= m_max);
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ result_t hit = scan.empty_match();
+
+ std::size_t n1 = m_min;
+ std::size_t n2 = m_max;
+
+ for (std::size_t i = 0; i < n2; ++i)
+ {
+ typename ScannerT::iterator_t save = scan.first;
+ result_t next = this->subject().parse(scan);
+
+ if (!next)
+ {
+ if (i >= n1)
+ {
+ scan.first = save;
+ break;
+ }
+ else
+ {
+ return scan.no_match();
+ }
+ }
+
+ scan.concat_match(hit, next);
+ }
+
+ return hit;
+ }
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ private:
+
+ MinT m_min;
+ MaxT m_max;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //
+ // infinite_loop class
+ //
+ // This class takes care of the construct:
+ //
+ // repeat_p (min, more) [p]
+ //
+ // where 'p' is a parser, 'min' is the minimum iteration over 'p'
+ // and more specifies that the iteration should proceed
+ // indefinitely. The parser iterates over the input at least 'min'
+ // times and continues indefinitely until 'p' fails or all of the
+ // input is parsed. The parse function fails if the parser does not
+ // match the input at least 'min' times.
+ //
+ // This class is parametizable and can accept constant arguments
+ // (e.g. repeat_p (5, more) [p]) as well as references to variables
+ // (e.g. repeat_p (ref (n), more) [p]).
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+
+ struct more_t {};
+ more_t const more = more_t ();
+
+ template <typename ParserT, typename MinT>
+ class infinite_loop
+ : public unary<ParserT, parser<infinite_loop<ParserT, MinT> > >
+ {
+ public:
+
+ typedef infinite_loop <ParserT, MinT> self_t;
+ typedef unary<ParserT, parser<self_t> > base_t;
+
+ infinite_loop (
+ ParserT const& subject_,
+ MinT const& min,
+ more_t const&
+ )
+ : base_t(subject_), m_min(min) {}
+
+ template <typename ScannerT>
+ typename parser_result <self_t, ScannerT>::type
+ parse(ScannerT const & scan) const
+ {
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ result_t hit = scan.empty_match();
+ std::size_t n = m_min;
+
+ for (std::size_t i = 0; ; ++i)
+ {
+ typename ScannerT::iterator_t save = scan.first;
+ result_t next = this->subject().parse(scan);
+
+ if (!next)
+ {
+ if (i >= n)
+ {
+ scan.first = save;
+ break;
+ }
+ else
+ {
+ return scan.no_match();
+ }
+ }
+
+ scan.concat_match(hit, next);
+ }
+
+ return hit;
+ }
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename match_result<ScannerT, nil_t>::type type;
+ };
+
+ private:
+
+ MinT m_min;
+ };
+
+ template <typename ExactT>
+ struct fixed_loop_gen
+ {
+ fixed_loop_gen (ExactT const & exact)
+ : m_exact (exact) {}
+
+ template <typename ParserT>
+ fixed_loop <ParserT, ExactT>
+ operator[](parser <ParserT> const & subject_) const
+ {
+ return fixed_loop <ParserT, ExactT> (subject_.derived (), m_exact);
+ }
+
+ ExactT m_exact;
+ };
+
+ namespace impl {
+
+ template <typename ParserT, typename MinT, typename MaxT>
+ struct loop_traits
+ {
+ typedef typename mpl::if_<
+ boost::is_same<MaxT, more_t>,
+ infinite_loop<ParserT, MinT>,
+ finite_loop<ParserT, MinT, MaxT>
+ >::type type;
+ };
+
+ } // namespace impl
+
+ template <typename MinT, typename MaxT>
+ struct nonfixed_loop_gen
+ {
+ nonfixed_loop_gen (MinT min, MaxT max)
+ : m_min (min), m_max (max) {}
+
+ template <typename ParserT>
+ typename impl::loop_traits<ParserT, MinT, MaxT>::type
+ operator[](parser <ParserT> const & subject_) const
+ {
+ typedef typename impl::loop_traits<ParserT, MinT, MaxT>::type ret_t;
+ return ret_t(
+ subject_.derived(),
+ m_min,
+ m_max);
+ }
+
+ MinT m_min;
+ MaxT m_max;
+ };
+
+ template <typename ExactT>
+ fixed_loop_gen <ExactT>
+ repeat_p(ExactT const & exact)
+ {
+ return fixed_loop_gen <ExactT> (exact);
+ }
+
+ template <typename MinT, typename MaxT>
+ nonfixed_loop_gen <MinT, MaxT>
+ repeat_p(MinT const & min, MaxT const & max)
+ {
+ return nonfixed_loop_gen <MinT, MaxT> (min, max);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // #if !defined(BOOST_SPIRIT_LOOPS_HPP)
diff --git a/boost/spirit/home/classic/utility/regex.hpp b/boost/spirit/home/classic/utility/regex.hpp
new file mode 100644
index 0000000000..e8286d5812
--- /dev/null
+++ b/boost/spirit/home/classic/utility/regex.hpp
@@ -0,0 +1,112 @@
+/*=============================================================================
+ Copyright (c) 2002-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_REGEX_HPP
+#define BOOST_SPIRIT_REGEX_HPP
+
+#include <boost/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Include the regular expression library of boost (Boost.Regex)
+//
+// Note though, that this library is not distributed with Spirit. You have to
+// obtain a separate copy from http://www.boost.org.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if defined(BOOST_SPIRIT_NO_REGEX_LIB) && BOOST_VERSION < 103300
+//
+// Include all the Boost.regex library. Please note that this will not work,
+// if you are using the boost/spirit/regex.hpp header from more than one
+// translation units.
+//
+#define BOOST_REGEX_NO_LIB
+#define BOOST_REGEX_STATIC_LINK
+#define BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+#include <boost/regex.hpp>
+#include <boost/regex/src.cpp>
+
+#else
+//
+// Include the Boost.Regex headers only. Note, that you will have to link your
+// application against the Boost.Regex library as described in the related
+// documentation.
+// This is the only way for Boost newer than V1.32.0
+//
+#include <boost/regex.hpp>
+#endif // defined(BOOST_SPIRIT_NO_REGEX_LIB)
+
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+#include <boost/spirit/home/classic/core/parser.hpp>
+#include <boost/spirit/home/classic/utility/impl/regex.ipp>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+// rxstrlit class
+template <typename CharT = char>
+struct rxstrlit : public parser<rxstrlit<CharT> > {
+
+ typedef rxstrlit self_t;
+
+ rxstrlit(CharT const *first, CharT const *last)
+ : rx(first, last) {}
+ rxstrlit(CharT const *first)
+ : rx(first) {}
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const& scan) const
+ {
+ // Due to limitations in the boost::regex library the iterators wrapped in
+ // the ScannerT object should be at least bidirectional iterators. Plain
+ // forward iterators do not work here.
+ typedef typename ScannerT::iterator_t iterator_t;
+ typedef
+ typename boost::detail::iterator_traits<iterator_t>::iterator_category
+ iterator_category;
+
+ BOOST_STATIC_ASSERT((
+ boost::is_convertible<iterator_category,
+ std::bidirectional_iterator_tag>::value
+ ));
+
+ typedef typename parser_result<self_t, ScannerT>::type result_t;
+ return impl::contiguous_parser_parse<result_t>(rx, scan, scan);
+ }
+
+private:
+ impl::rx_parser<CharT> rx; // contains the boost regular expression parser
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// Generator functions
+template <typename CharT>
+inline rxstrlit<CharT>
+regex_p(CharT const *first)
+{ return rxstrlit<CharT>(first); }
+
+//////////////////////////////////
+template <typename CharT>
+inline rxstrlit<CharT>
+regex_p(CharT const *first, CharT const *last)
+{ return rxstrlit<CharT>(first, last); }
+
+///////////////////////////////////////////////////////////////////////////////
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#endif // BOOST_SPIRIT_REGEX_HPP
diff --git a/boost/spirit/home/classic/utility/rule_parser.hpp b/boost/spirit/home/classic/utility/rule_parser.hpp
new file mode 100644
index 0000000000..9cacb49940
--- /dev/null
+++ b/boost/spirit/home/classic/utility/rule_parser.hpp
@@ -0,0 +1,1142 @@
+/*==============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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 comment below contains a unnamed 'namespace {', which is flagged by the
+// Boost inspect tool as a violation of common C++ programming rules. Since it's
+// in a comment, well, we switch it off :-P
+// boostinspect:nounnamed
+
+//
+// About:
+// =====
+//
+// Using a typeof operator or Boost.Typeof to automatically set the type of
+// variables (as done in the Spirit example demonstrating typeof) is by far not
+// all we can do to tighten up our grammars as there are some significant
+// drawbacks of this approach:
+// - the types complexity scales with the complexity of the grammar (sooner or
+// later hitting the limits of the compiler),
+// - recursive grammars are not possible, and
+// - all parser objects are embedded by value.
+//
+// The Spirit documentation therefore recommends creating custom parser classes
+// (derived from the a sub_grammar template):
+//
+// http://www.boost.org/libs/spirit/doc/techniques.html#no_rules
+// http://www.boost.org/libs/spirit/doc/techniques.html#typeof
+//
+// In practice manually applying this technique leads to rather lengthy code and
+// overthis requires the user to have a solid understanding of Spirit details.
+//
+// Here is a generalized, macro-based approach to easily create typeof-based
+// grammars that can be recursive and arbitrarily complex.
+//
+//
+// Quick manual:
+// ============
+//
+// 1. Setup
+//
+// Before the rule parser macro (the protagonist of the facility) can be used
+// the the user must define the macro BOOST_SPIRIT__NAMESPACE (note the double
+// underscore characeter) and setup a registration group for Boost.Typeof.
+//
+// Examples:
+//
+// // should come after regular #includeS
+// #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+//
+// // [...]
+//
+// #define BOOST_SPIRIT__NAMESPACE (2,(my_project, my_module))
+// // | | +- outer +- inner
+// // ! space ! -+ | namespace namespace
+// // |
+// // +--- number of nested namespaces
+//
+// namespace my_project { namespace my_module {
+//
+// // [...]
+//
+// ---
+//
+// // should come after regular #includeS
+// #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+//
+// // [...]
+//
+// #define BOOST_SPIRIT__NAMESPACE (2,(my_project, (anonymous) ))
+//
+// namespace my_project { namespace {
+//
+// // [...]
+//
+// ---
+//
+// // should come after regular #includeS
+// #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+//
+// // [...]
+//
+//
+// #define BOOST_SPIRIT__NAMESPACE -
+// // we're working at root namespace
+//
+//
+// Why do I have to do this?
+//
+// Boost.Typeof needs to assign a unique ID for each registration. This ID is
+// created composed of the line number and the registration group. The
+// facility performs Typeof registration and thus requires the source file to
+// have its own registration group. Further Boost.Typeof requires registration
+// to happen at root namespace so we have to close and reopen the namespace
+// we're in.
+//
+//
+// 2. The rule parser macro
+//
+// A simple rule parser definition looks like that:
+//
+// // we're at namespace scope here
+//
+// // Skip parser for C/C++ comments and whitespace
+// BOOST_SPIRIT_RULE_PARSER(skipper,
+// -,-,-,
+//
+// +( confix_p("//",*anychar_p,eol_p)
+// | confix_p("/*",*anychar_p,"*/")
+// | space_p
+// )
+// )
+//
+// Now we can use 'skipper' in other Spirit expressions.
+//
+// The code above creates a parser (template) class 'skpper_t' and (in this
+// case, because there are no parameters) a static const instance 'skipper' of
+// that class. The class is automatically registered with Boost.Typeof. The type
+// name our parser is skipper_t here.
+//
+//
+// 2.1. Parametrized rule parsers
+//
+// Rule parser definitions can have parameters.
+//
+// Parameters are passed to the BOOST_SPIRIT_RULE_PARSER macro as its second
+// argument (just pass '-' if there are no parameters) with the following
+// format:
+//
+// (N,( param1,param2, / ... / paramN ))
+// +-- number of parameters
+//
+// Example of a whole rule parser:
+//
+// BOOST_SPIRIT_RULE_PARSER(new_name,
+// (1,( symbol_table )),-,-,
+//
+// lexeme_d[ (alpha_p >> *alnum_p)[ symbol_table.add ] ]
+// )
+//
+// The expression 'new_name(my_symbols)' parses a string literal and adds it to
+// the symbol table 'my_symbols'.
+//
+// The rule parser macro creates a function template as called 'new_name' that
+// takes one parameter of deduced reference type and returns a specialization of
+// 'new_name_t' in this case.
+//
+// Since parsers that require to be fast and lightweight often also require to
+// be reentrant, it's quite common to pass in some semantic controller (the
+// symbol table in the example above).
+// However, parameters are templated so they can be anything (including parsers
+// of course) so refactoring tasks can be abstracted with rule parsers as well.
+//
+// BOOST_SPIRIT_RULE_PARSER(enumeration_parser,
+// (2,( element_parser, delimiter_parser )),-,-,
+//
+// element_parser >> *(delimiter_parser >> element_parser)
+// )
+//
+// The expression 'enumeration_parser(int_p[ some_action ], ',')' creates a
+// parser for a comma-separated list of integers.
+//
+//
+// 2.2. Rule parsrs and semantic actions
+//
+// While semantic actions can be globally attached to a rule parser or passed
+// to a parametrized rule parser as (part of) an argument, even more control is
+// possible by using action placeholders. E.g:
+//
+// BOOST_SPIRIT_ACTION_PLACEHOLDER(int_action)
+//
+// BOOST_SPIRIT_RULE_PARSER(int_list,
+// -,(1,( int_action )),-,
+//
+// int_p[ int_action ] >> *(',' >> int_p[ int_action ])
+// )
+//
+// The expression 'int_list[ my_action ]' parses a comma separated list of
+// integers and calls 'my_action' for every integer parsed therein.
+//
+// Of course multiple actions can be attached to one placeholder as usual (in
+// this case 'int_list[ my_action1 ][ my_action2 ] would call two actions).
+//
+// Further there can be multiple action placeholders for a single rule parser:
+//
+// BOOST_SPIRIT_ACTION_PLACEHOLDER(feed_int)
+// BOOST_SPIRIT_ACTION_PLACEHOLDER(next_int)
+//
+// BOOST_SPIRIT_RULE_PARSER(int_list,
+// -,(2,( feed_int, next_int )),-,
+//
+// int_p[ feed_int ] >> *(',' >> int_p[ next_int ][ feed_int ])
+// )
+//
+// The expression 'int_list[ (feed_int = my_action1), (next_int = my_action2) ]'
+// creates a parser for a comma separated list of integers with the actions
+// attached appropriately.
+//
+// int_list[ feed_int = my_action1,my_action2, next_int = my_action3 ]
+//
+// works too (in this case the action placeholder 'feed_int' has two actions
+// attached to it).
+//
+// You can both override and append actions associated with an action
+// placeholder:
+//
+// var = int_list[ feed_int = my_action1, next_int = my_action2 ]
+//
+// // [...]
+//
+// ... var[ feed_int = another_action ]
+// // 'another_action' overrides the actions previously attached to 'feed_int'
+//
+// ... var[ next_int += another_action ]
+// // 'another_action' is appended to the list of actions attached to
+// // 'next_int'
+//
+// Action placeholders are not entirely for free -- they add to the size and the
+// initialization time of the rule parser. However, the impact on an already
+// initialized rule parser instance should be quite small.
+//
+//
+// 2.3. Member variables
+//
+// You can add member variables to the rule parser class using the third
+// parameter of the rule parser macro:
+//
+// BOOST_SPIRIT_RULE_PARSER( calc,
+// -,
+// -,
+// (3,( ((subrule<0>),expression,()),
+// ((subrule<1>),term,()),
+// ((subrule<2>),factor,() )) ),
+//
+// // [...]
+//
+// adds three subrules to the rule parser.
+// Each parameter must have the following type to allow commas to be handled
+// safely from within the preprocessing code:
+//
+// ((type)),name,(constructor argument(s)))
+//
+//
+// 2.4. The opaque rule parser
+//
+// Rule parsers usually are templates. Building large grammars pushes the
+// compiler really hard (and eventually to its limits) because of the
+// metafunction complexity involved.
+// If a rule parser without parameters and action placeholders is defined, a
+// non-template class is created. Non-templated rule parsers can also be created
+// explicitly by using BOOST_SPIRIT_OPAQUE_RULE_PARSER.
+// Opaque rule parsers can have parameters and member variables (note: no action
+// placeholders are possible). The parameters of an opaque rule parsers are
+// strictly typed, e.g:
+//
+// BOOST_SPIRIT_OPAQUE_RULE_PARSER(new_identifier,
+// (1,( ((my_symbol_table_t &),symbol_table) ))
+// ,-,
+// (alpha_p >> *alnum_p) [ symbol_table.add ]
+// )
+//
+// Note it's also possible to have opaque rule parsers accept parameters of
+// non-const reference types which is not possible with regular rule parsers.
+//
+//
+// 3. Utilities for by-reference embedding
+//
+// When using parsers mutiple times or recursively it can be helpful to embed
+// them by-reference into the final parser expression.
+// For this purpose the library provides a wrapper template 'parser_reference'.
+// There is also a function template to create a wrapped parser which can deduce
+// the parser's type from its argument.
+//
+// --- --- - - --- - - --- - - - - --- - - - - - - - - - - - - - - - - - - - - -
+#if !defined(BOOST_SPIRIT_UTILITY_RULE_PARSER_HPP_INCLUDED)
+# define BOOST_SPIRIT_UTILITY_RULE_PARSER_HPP_INCLUDED
+//==============================================================================
+// Dependencies
+//==============================================================================
+# include <boost/config.hpp>
+# include <boost/detail/workaround.hpp>
+# include <boost/call_traits.hpp>
+# include <boost/typeof/typeof.hpp>
+# include <boost/spirit/home/classic/namespace.hpp>
+# include <boost/spirit/home/classic/core/parser.hpp>
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/seq/for_each_i.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/tuple/to_seq.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/logical/or.hpp>
+# include <boost/preprocessor/logical/nor.hpp>
+# include <boost/preprocessor/logical/not.hpp>
+# include <boost/preprocessor/logical/compl.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/add.hpp>
+# include <boost/preprocessor/detail/is_unary.hpp>
+# include <boost/preprocessor/detail/is_binary.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/repetition/enum_params.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+# include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+# include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+# include <boost/preprocessor/punctuation/comma.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/facilities/identity.hpp>
+# include <boost/preprocessor/facilities/intercept.hpp>
+//==============================================================================
+// Interface
+//==============================================================================
+// Creates a rule parser. Use at namespace scope.
+# define BOOST_SPIRIT_RULE_PARSER(name,params,actions,members,rule) \
+ BOOST_SPIRIT_RP_IMPL_I(name,params,actions,members,rule)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Creates a non-templated rule parser. Use at namespace scope.
+# define BOOST_SPIRIT_OPAQUE_RULE_PARSER(name,params,members,rule) \
+ BOOST_SPIRIT_RP_OPAQUE_IMPL_I(name,params,members,rule)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Defines an action placeholder. Use at namespace scope.
+# define BOOST_SPIRIT_ACTION_PLACEHOLDER(name) \
+ BOOST_SPIRIT_RP_AP_IMPL(name,::BOOST_SPIRIT_CLASSIC_NS::type_of)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Utilities to embed parsers by reference.
+namespace boost
+{
+ namespace spirit
+ {
+ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ template<class P> class parser_reference;
+ template<class P> parser_reference<P> embed_by_reference(parser<P> const &);
+
+ BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+ }
+}
+//==============================================================================
+// Implementation
+//==============================================================================
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_REGISTER_TEMPLATE
+//
+// Boost.Typeof registration from within BOOST_SPIRIT__NAMESPACE
+# define BOOST_SPIRIT_RP_REGISTER_TEMPLATE(name,params) \
+ BOOST_SPIRIT_RP_EMIT(NS_CLOSE,BOOST_SPIRIT__NAMESPACE,-) \
+ BOOST_TYPEOF_REGISTER_TEMPLATE( \
+ BOOST_SPIRIT_RP_EMIT(NS_QUALIFY,BOOST_SPIRIT__NAMESPACE,-) name, \
+ params) \
+ BOOST_SPIRIT_RP_EMIT(NS_OPEN,BOOST_SPIRIT__NAMESPACE,-)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_REGISTER_TYPE
+//
+// Boost.Typeof registration from within BOOST_SPIRIT__NAMESPACE
+# define BOOST_SPIRIT_RP_REGISTER_TYPE(name) \
+ BOOST_SPIRIT_RP_EMIT(NS_CLOSE,BOOST_SPIRIT__NAMESPACE,-) \
+ BOOST_TYPEOF_REGISTER_TYPE( \
+ BOOST_SPIRIT_RP_EMIT(NS_QUALIFY,BOOST_SPIRIT__NAMESPACE,-) name ) \
+ BOOST_SPIRIT_RP_EMIT(NS_OPEN,BOOST_SPIRIT__NAMESPACE,-)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_AP_IMPL
+//
+// The action placeholder definition
+# define BOOST_SPIRIT_RP_AP_IMPL(name,ns) \
+ namespace __action_placeholder \
+ { \
+ struct name \
+ { \
+ template<typename Action> \
+ ns :: action_chain< name, ns :: replace, Action> \
+ operator=(Action const & __a) const \
+ { return ns :: action_chain< name, ns :: replace, Action>(__a); } \
+ \
+ template<typename Action> \
+ ns :: action_chain< name, ns :: append, Action> \
+ operator+=(Action const & __a) const \
+ { return ns :: action_chain< name, ns :: append, Action> (__a); } \
+ }; \
+ } \
+ __action_placeholder:: name const name = __action_placeholder:: name ();
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_IMPL_I
+//
+// Does some precalculation so RP_IMPL_II can look cleaner
+# define BOOST_SPIRIT_RP_IMPL_I(name,pars,acts,mbrs,expr) \
+ BOOST_SPIRIT_RP_IMPL_II(name, name ## _t , \
+ pars, BOOST_SPIRIT_RP_ARRAY_SIZE(pars), \
+ acts, BOOST_SPIRIT_RP_ARRAY_SIZE(acts), \
+ mbrs, BOOST_SPIRIT_RP_ARRAY_SIZE(mbrs), expr)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_IMPL_II
+# define BOOST_SPIRIT_RP_IMPL_II(name,name_t,pars,np,acts,na,mbrs,nm,x) \
+ BOOST_PP_IIF(BOOST_PP_OR(np,na),BOOST_SPIRIT_RP_IMPL_III, \
+ BOOST_SPIRIT_RP_OPAQUE_IMPL_II) \
+ (name,name_t,pars,np,acts,na,mbrs,nm,x)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_IMPL_III
+//
+// The rule parser definition
+# define BOOST_SPIRIT_RP_IMPL_III(name,name_t,pars,np,acts,na,mbrs,nm,x) \
+ \
+ template< BOOST_SPIRIT_RP_TPL_PARAMS(pars,acts,typename __,1) > \
+ class name_t \
+ : public ::BOOST_SPIRIT_CLASSIC_NS::parser< name_t \
+ < BOOST_SPIRIT_RP_TPL_PARAMS(pars,acts,__,0) > > \
+ { \
+ class __rule \
+ { \
+ BOOST_SPIRIT_RP_EMIT(PM_STATIC,pars,__T) \
+ BOOST_SPIRIT_RP_EMIT(AP_STATIC,acts,-) \
+ BOOST_SPIRIT_RP_EMIT(MV_STATIC,mbrs,BOOST_PP_IDENTITY(typename)) \
+ public: \
+ BOOST_TYPEOF_NESTED_TYPEDEF_TPL(__expr, \
+ ::BOOST_SPIRIT_CLASSIC_NS::type_of::depend_on_type<__Dummy>(x) ) \
+ }; \
+ \
+ public: \
+ \
+ typedef name_t self_t; \
+ typedef typename __rule::__expr::type::parser_category_t \
+ parser_category_t; \
+ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_NOR(np,na),typedef self_t const & embed_t;) \
+ \
+ protected: \
+ \
+ BOOST_SPIRIT_RP_EMIT(MV_NONSTATIC,mbrs,BOOST_PP_IDENTITY(typename)) \
+ BOOST_SPIRIT_RP_IF(na,SPIRIT_RP_AP_EXTRA_MBRS,2)(np,na) \
+ \
+ typename __rule::__expr::type::embed_t __parser; \
+ \
+ public: \
+ \
+ explicit name_t ( BOOST_SPIRIT_RP_CTOR(PARAMS,pars,np,acts) ) \
+ : BOOST_SPIRIT_RP_EMIT(MV_CTOR_INIT_LIST,mbrs,-) \
+ BOOST_PP_COMMA_IF(nm) \
+ BOOST_SPIRIT_RP_IF(na,SPIRIT_RP_CTOR_COMMA,4)(INIT_LIST,pars,np,acts)\
+ __parser(x) \
+ { } \
+ \
+ name_t( name_t const & that) \
+ : BOOST_SPIRIT_RP_EMIT(MV_CTOR_COPY_INIT_LIST,mbrs,that) \
+ BOOST_PP_COMMA_IF(nm) \
+ BOOST_SPIRIT_RP_IF(na,SPIRIT_RP_CTOR_COMMA,4) \
+ (COPY_INIT_LIST,pars,np,acts) \
+ __parser(that.__parser) \
+ { } \
+ \
+ template<typename Scanner> struct result \
+ { \
+ typedef typename ::BOOST_SPIRIT_CLASSIC_NS::parser_result< \
+ typename __rule::__expr::type, Scanner>::type type; \
+ }; \
+ \
+ template<typename Scanner> \
+ typename ::BOOST_SPIRIT_CLASSIC_NS::parser_result<self_t, Scanner>::type \
+ parse(Scanner const & s) const { return __parser.parse(s); } \
+ \
+ BOOST_SPIRIT_RP_IF(na,SPIRIT_RP_AP_HANDLER,5) \
+ (name_t,np,acts,na,::BOOST_SPIRIT_CLASSIC_NS::type_of) \
+ }; \
+ \
+ BOOST_PP_IF(np,BOOST_SPIRIT_RP_GEN_FUNC,BOOST_SPIRIT_RP_GLOB_VAR) \
+ (name,name_t,np,na) \
+ BOOST_SPIRIT_RP_REGISTER_TEMPLATE \
+ (name_t,BOOST_PP_INC(BOOST_PP_ADD(np,na)))
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_OPAQUE_IMPL_I
+//
+# define BOOST_SPIRIT_RP_OPAQUE_IMPL_I(name,pars,mbrs,expr) \
+ BOOST_SPIRIT_RP_OPAQUE_IMPL_II(name, name ## _t, \
+ pars,BOOST_SPIRIT_RP_ARRAY_SIZE(pars),-,-,\
+ mbrs,BOOST_SPIRIT_RP_ARRAY_SIZE(mbrs),expr)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_OPAQUE_IMPL_II
+//
+# define BOOST_SPIRIT_RP_OPAQUE_IMPL_II(name,name_t,pars,np,_1,_2,mbrs,nm,x) \
+ class name_t; \
+ \
+ BOOST_SPIRIT_RP_REGISTER_TYPE(name_t) \
+ \
+ class name_t \
+ : public ::BOOST_SPIRIT_CLASSIC_NS::parser< name_t > \
+ { \
+ class __rule \
+ { \
+ BOOST_SPIRIT_RP_EMIT(PM_OPAQUE_STATIC,pars,-) \
+ BOOST_SPIRIT_RP_EMIT(MV_STATIC,mbrs,BOOST_PP_EMPTY) \
+ public: \
+ BOOST_TYPEOF_NESTED_TYPEDEF(__expr,x) \
+ }; \
+ \
+ public: \
+ \
+ typedef name_t self_t; \
+ typedef __rule::__expr::type::parser_category_t parser_category_t; \
+ BOOST_PP_EXPR_IIF(BOOST_PP_NOT(np),typedef self_t const & embed_t;) \
+ \
+ protected: \
+ \
+ BOOST_SPIRIT_RP_EMIT(MV_NONSTATIC,mbrs,BOOST_PP_EMPTY) \
+ \
+ __rule::__expr::type::embed_t __parser; \
+ \
+ public: \
+ \
+ explicit name_t (BOOST_SPIRIT_RP_EMIT(PM_OPAQUE_CTOR_PARAMS,pars,-)) \
+ : BOOST_SPIRIT_RP_EMIT(MV_CTOR_INIT_LIST,mbrs,-) \
+ BOOST_PP_COMMA_IF(nm) __parser(x) \
+ { } \
+ \
+ name_t(name_t const & that) \
+ : BOOST_SPIRIT_RP_EMIT(MV_CTOR_COPY_INIT_LIST,mbrs,that) \
+ BOOST_PP_COMMA_IF(nm) __parser(that.__parser) \
+ { } \
+ \
+ template<typename Scanner> struct result \
+ { \
+ typedef typename ::BOOST_SPIRIT_CLASSIC_NS::parser_result< \
+ __rule::__expr::type, Scanner>::type type; \
+ }; \
+ \
+ template<typename Scanner> \
+ typename ::BOOST_SPIRIT_CLASSIC_NS::parser_result<self_t, Scanner>::type \
+ parse(Scanner const & s) const { return __parser.parse(s); } \
+ }; \
+ \
+ BOOST_PP_IF(np,BOOST_SPIRIT_RP_GEN_OPAQUE,BOOST_SPIRIT_RP_GLOB_OPAQUE) \
+ (name,name_t,np,pars)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_AP_HANDLER
+//
+// Part of the rule parser definition for handling action placeholders
+# define BOOST_SPIRIT_RP_AP_HANDLER(name_t,np,acts,na,ns) \
+ private: \
+ template<typename A> struct __rebound_1st \
+ { \
+ typedef name_t < void BOOST_PP_ENUM_TRAILING_PARAMS(np,__T) , \
+ typename ns ::action_concatenator<__A0,A>::type \
+ BOOST_PP_COMMA_IF(BOOST_PP_DEC(na)) \
+ BOOST_PP_ENUM_SHIFTED_PARAMS(na,__A) \
+ > type; \
+ }; \
+ \
+ template<typename X> struct __rebound \
+ { \
+ typedef name_t < \
+ void BOOST_PP_ENUM_TRAILING_PARAMS(np,__T) \
+ BOOST_SPIRIT_RP_EMIT(AP_REBOUND_TPL_ARGS,acts,X) \
+ > type; \
+ }; \
+ public: \
+ template<typename A> \
+ typename __rebound_1st<A>::type const operator[](A const & a) const \
+ { \
+ return typename __rebound_1st<A>::type ( \
+ BOOST_PP_ENUM_PARAMS(np,__p) BOOST_PP_COMMA_IF(np) \
+ ns ::concatenate_actions(__a0,a) \
+ BOOST_PP_COMMA_IF(BOOST_PP_DEC(na)) \
+ BOOST_PP_ENUM_SHIFTED_PARAMS(na,__a) ); \
+ } \
+ template<class PH, ns ::action_chain_mode M, typename A> \
+ typename __rebound< ns ::action_chain<PH,M,A> >::type const \
+ operator[]( ns ::action_chain<PH,M,A> const & x) const \
+ { \
+ return typename __rebound< ns ::action_chain<PH,M,A> >::type ( \
+ BOOST_PP_ENUM_PARAMS(np,__p) BOOST_PP_COMMA_IF(np) \
+ BOOST_SPIRIT_RP_EMIT(AP_REBOUND_ARGS,acts,x) ); \
+ } \
+ template<class Head, class Tail> \
+ typename __rebound< ns ::action_chains<Head,Tail> >::type const \
+ operator[]( ns ::action_chains<Head,Tail> const & x) const \
+ { \
+ return typename __rebound< ns ::action_chains<Head,Tail> >::type ( \
+ BOOST_PP_ENUM_PARAMS(np,__p) BOOST_PP_COMMA_IF(np) \
+ BOOST_SPIRIT_RP_EMIT(AP_REBOUND_ARGS,acts,x) ); \
+ }
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_AP_EXTRA_MBRS
+//
+// Extra members we need for rebinding if there are action placeholders
+# define BOOST_SPIRIT_RP_AP_EXTRA_MBRS(np,na) \
+ private: \
+ BOOST_PP_REPEAT(np,BOOST_SPIRIT_RP_PM_MBRS,-) \
+ BOOST_PP_REPEAT(na,BOOST_SPIRIT_RP_AP_MBRS,-)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_PM_MBRS
+//
+// Member variables to remember parameters if there are action placeholder
+# define BOOST_SPIRIT_RP_PM_MBRS(z,i,d) __T ## i __p ## i ;
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_AP_MBRS
+//
+// Member variables to remember action placeholder substitutes
+# define BOOST_SPIRIT_RP_AP_MBRS(z,i,d) __A ## i __a ## i ;
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_CTOR
+//
+// Expands to a fragment of a constructor (parameters or init-list)
+# define BOOST_SPIRIT_RP_CTOR(what,pars,np,acts) \
+ BOOST_SPIRIT_RP_EMIT(PM_CTOR_ ## what,pars,__T) \
+ BOOST_SPIRIT_RP_EMIT(AP_CTOR_ ## what,acts,np)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_CTOR_COMMA
+//
+// RP_CTOR with a trailing comma
+# define BOOST_SPIRIT_RP_CTOR_COMMA(what,pars,np,acts) \
+ BOOST_SPIRIT_RP_CTOR(what,pars,np,acts) ,
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_TPL_PARAMS
+//
+// Expands to the template parameters or arguments of the rule parser template
+# define BOOST_SPIRIT_RP_TPL_PARAMS(pars,acts,prefix,defaults) \
+ prefix ## Dummy \
+ BOOST_SPIRIT_RP_EMIT(PM_TEMPLATE_PARAMS,pars,prefix ## T) \
+ BOOST_SPIRIT_RP_EMIT(AP_TEMPLATE_PARAMS,acts,(prefix ## A,defaults))
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_GEN_FUNC
+//
+// Generator function
+# define BOOST_SPIRIT_RP_GEN_FUNC(name,name_t,np,na) \
+ template< BOOST_PP_ENUM_PARAMS(np,typename T) > \
+ inline name_t < void BOOST_PP_ENUM_TRAILING_PARAMS(np,T) > \
+ name( BOOST_PP_ENUM_BINARY_PARAMS(np,T, const & p) ) \
+ { return name_t < void BOOST_PP_ENUM_TRAILING_PARAMS(np,T) > \
+ (BOOST_PP_ENUM_PARAMS(np,p) BOOST_PP_ENUM_TRAILING_PARAMS(na, \
+ ::BOOST_SPIRIT_CLASSIC_NS::type_of::nop_functor() BOOST_PP_INTERCEPT) ); \
+ }
+// RP_GEN_OPAQUE
+//
+// non-templated version for opaque rule parsers.
+# define BOOST_SPIRIT_RP_GEN_OPAQUE(name,name_t,np,pars) \
+ inline name_t name( BOOST_SPIRIT_RP_EMIT(PM_OPAQUE_GEN_PARAMS,pars,p)) \
+ { return name_t (BOOST_PP_ENUM_PARAMS(np,p)); }
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_GLOB_VAR
+//
+// Global variable -- used instead of the generator function if there are no
+// parameters
+# define BOOST_SPIRIT_RP_GLOB_VAR(name,name_t,np,na) \
+ static name_t <void> const name = name_t <void>(BOOST_PP_ENUM_PARAMS(na, \
+ ::BOOST_SPIRIT_CLASSIC_NS::type_of::nop_functor() BOOST_PP_INTERCEPT) );
+
+// RP_GLOB_OPAQUE
+//
+// non-templated version for opaque rule parsers.
+# define BOOST_SPIRIT_RP_GLOB_OPAQUE(name,name_t,np,pars) \
+ static name_t const name = name_t () ;
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// PP_EMIT operations (fragment emittion based on array input)
+
+// - - Namespace handling
+
+// NS_OPEN
+# define BOOST_SPIRIT_RP__NS_OPEN(r,data,i,elem) \
+ namespace BOOST_SPIRIT_RP_OPTIONAL(elem) {
+
+// NS_QUALIFY
+# define BOOST_SPIRIT_RP__NS_QUALIFY(r,data,i,elem) \
+ BOOST_SPIRIT_RP_OPTIONAL(elem ::)
+
+// NS_CLOSE
+# define BOOST_SPIRIT_RP__NS_CLOSE(r,data,i,elem) }
+
+// - - Parameter handling
+
+// PM_STATIC
+# define BOOST_SPIRIT_RP__PM_STATIC(r,data,i,elem) \
+ static typename ::boost::call_traits< data ## i >::reference elem ;
+
+// PM_CTOR_PARAMS
+# define BOOST_SPIRIT_RP__PM_CTOR_PARAMS(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) \
+ typename ::boost::call_traits< data ## i >::param_type elem
+
+// PM_CTOR_ARGS
+# define BOOST_SPIRIT_RP__PM_CTOR_ARGS(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) elem
+
+// PM_CTOR_INIT_LIST
+# define BOOST_SPIRIT_RP__PM_CTOR_INIT_LIST(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) __p ## i ( elem )
+
+// PM_CTOR_COPY_INIT_LIST
+# define BOOST_SPIRIT_RP__PM_CTOR_COPY_INIT_LIST(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) __p ## i ( that. __p ## i )
+
+
+// PM_TEMPLATE_PARAMS
+# define BOOST_SPIRIT_RP__PM_TEMPLATE_PARAMS(r,data,i,elem) , data ## i
+
+// - strictly typed parameters of the opaque rule_parser
+
+// PM_OPAQUE_STATIC
+# define BOOST_SPIRIT_RP__PM_OPAQUE_STATIC(r,data,i,elem) \
+ static ::boost::call_traits< \
+ BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(2,0,elem)) \
+ >::reference BOOST_PP_TUPLE_ELEM(2,1,elem) ;
+
+// PM_OPAQUE_CTOR_PARAMS
+# define BOOST_SPIRIT_RP__PM_OPAQUE_CTOR_PARAMS(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) ::boost::call_traits< \
+ BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(2,0,elem)) \
+ >::param_type BOOST_PP_TUPLE_ELEM(2,1,elem)
+
+// PM_OPAQUE_GEN_PARAMS
+# define BOOST_SPIRIT_RP__PM_OPAQUE_GEN_PARAMS(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) ::boost::call_traits< \
+ BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(2,0,elem)) \
+ >::param_type data ## i
+
+// - - Member variable handling
+
+// MV_NONSTATIC
+# define BOOST_SPIRIT_RP__MV_NONSTATIC(r,data,i,elem) \
+ data() BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(3,0,elem)) \
+ BOOST_PP_TUPLE_ELEM(3,1,elem) ;
+
+// MV_STATIC
+# define BOOST_SPIRIT_RP__MV_STATIC(r,data,i,elem) \
+ static data() ::boost::call_traits< \
+ data() BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(3,0,elem)) \
+ >::reference BOOST_PP_TUPLE_ELEM(3,1,elem) ;
+
+// MV_CTOR_INIT_LIST
+# define BOOST_SPIRIT_RP__MV_CTOR_INIT_LIST(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_PP_TUPLE_ELEM(3,1,elem) BOOST_PP_TUPLE_ELEM(3,2,elem)
+
+// MV_CTOR_COPY_INIT_LIST
+# define BOOST_SPIRIT_RP__MV_CTOR_COPY_INIT_LIST(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_PP_TUPLE_ELEM(3,1,elem) (data . BOOST_PP_TUPLE_ELEM(3,1,elem))
+
+// - - Action placeholder handling
+
+// AP_STATIC
+# define BOOST_SPIRIT_RP__AP_STATIC(r,data,i,elem) static __A ## i & elem ;
+
+// AP_CTOR_PARAMS
+# define BOOST_SPIRIT_RP__AP_CTOR_PARAMS(r,data,i,elem) \
+ BOOST_SPIRIT_RP_COMMA_IF_OR(data,i) \
+ typename ::boost::call_traits< __A ## i >::param_type elem
+
+// AP_CTOR_ARGS
+# define BOOST_SPIRIT_RP__AP_CTOR_ARGS(r,data,i,elem) \
+ BOOST_SPIRIT_RP_COMMA_IF_OR(data,i) elem
+
+// AP_CTOR_INIT_LIST
+# define BOOST_SPIRIT_RP__AP_CTOR_INIT_LIST(r,data,i,elem) \
+ BOOST_SPIRIT_RP_COMMA_IF_OR(data,i) __a ## i ( elem )
+
+// AP_CTOR_COPY_INIT_LIST
+# define BOOST_SPIRIT_RP__AP_CTOR_COPY_INIT_LIST(r,data,i,elem) \
+ BOOST_SPIRIT_RP_COMMA_IF_OR(data,i) __a ## i ( that. __a ## i )
+
+// AP_TEMPLATE_PARAMS
+# define BOOST_SPIRIT_RP__AP_TEMPLATE_PARAMS(r,data,i,elem) \
+ , BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2,0,data),i) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(2,1,data), \
+ = ::BOOST_SPIRIT_CLASSIC_NS::type_of::nop_functor)
+
+// AP_REBOUND_ARGS
+# define BOOST_SPIRIT_RP__AP_REBOUND_ARGS(r,data,i,elem) \
+ BOOST_PP_COMMA_IF(i) \
+ ::BOOST_SPIRIT_CLASSIC_NS::type_of::get_placeholdee< __action_placeholder:: elem > \
+ ( __a ## i , data )
+
+// AP_REBOUND_TPL_ARGS
+# define BOOST_SPIRIT_RP__AP_REBOUND_TPL_ARGS(r,data,i,elem) \
+ , typename ::BOOST_SPIRIT_CLASSIC_NS::type_of::placeholdee< \
+ __action_placeholder:: elem , __A ## i, data >::type
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// PP_EMIT
+//
+// Performs one of the operations in the above section on an optional array.
+//
+# define BOOST_SPIRIT_RP_EMIT(op, array, data) \
+ BOOST_SPIRIT_RP_ARRAY_FOR_EACH_I(BOOST_SPIRIT_RP__ ## op,data,array)
+// --- --- - - --- - - --- - - - - --- - - - - - - - - - - - - - - - - - - - - -
+// RP_ARRAY_FOR_EACH_I
+//
+// Iterates an optional array. That is you can pass e.g.'-' or 'none' to denote
+// emptiness.
+# define BOOST_SPIRIT_RP_ARRAY_FOR_EACH_I(macro,data,optional_array) \
+ BOOST_PP_IIF(BOOST_PP_IS_BINARY(optional_array), \
+ BOOST_SPIRIT_RP_ARRAY_FOR_EACH_I_IMPL, \
+ BOOST_PP_TUPLE_EAT(3))(macro,data,optional_array)
+
+// RP_ARRAY_FOR_EACH_I_IMPL
+# define BOOST_SPIRIT_RP_ARRAY_FOR_EACH_I_IMPL(macro,data,array) \
+ BOOST_SPIRIT_RP_IF(BOOST_PP_ARRAY_SIZE(array),PP_SEQ_FOR_EACH_I,3) \
+ (macro,data, BOOST_SPIRIT_RP_IF(BOOST_PP_ARRAY_SIZE(array), \
+ PP_TUPLE_TO_SEQ,2) array)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_ARRAY_SIZE
+//
+// Expands to the size of an "optional array".
+//
+// Examples:
+//
+// BOOST_SPIRIT_RP_ARRAY_SIZE( (2,(a,b)) ) // 2
+// BOOST_SPIRIT_RP_ARRAY_SIZE( (0,()) ) // 0
+// BOOST_SPIRIT_RP_ARRAY_SIZE( none ) // 0
+// BOOST_SPIRIT_RP_ARRAY_SIZE( - ) // 0
+//
+# define BOOST_SPIRIT_RP_ARRAY_SIZE(optional_array) \
+ BOOST_PP_IIF(BOOST_PP_IS_BINARY(optional_array), \
+ BOOST_PP_ARRAY_SIZE, 0 BOOST_PP_TUPLE_EAT(1))(optional_array)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_OPTIONAL
+//
+// Expands to nothing if the argument is parenthesized.
+//
+// Examples:
+//
+// BOOST_SPIRIT_RP_OPTIONAL( foobar ) // foobar
+// BOOST_SPIRIT_RP_OPTIONAL( (none) ) // evaluates to nothing
+//
+# define BOOST_SPIRIT_RP_OPTIONAL(elem) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(BOOST_PP_IS_UNARY(elem)),elem)
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_COMMA_IF_OR
+//
+// Expands to nothing if both arguments are zero, otherwise expands to a comma.
+//
+# define BOOST_SPIRIT_RP_COMMA_IF_OR(a,b) \
+ BOOST_PP_IIF(BOOST_PP_OR(a,b),BOOST_PP_COMMA,BOOST_PP_EMPTY)()
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// RP_IF
+//
+// BOOST_SPIRIT_RP_IF(cond,name,arity)
+//
+// is equivalent to:
+//
+// BOOST_PP_IF(cond,BOOST_name,BOOST_PP_TUPLE_EAT(arity))
+//
+# define BOOST_SPIRIT_RP_IF(cond,name,arity) \
+ BOOST_PP_IF(cond,BOOST_ ## name,BOOST_PP_TUPLE_EAT(arity))
+
+//------------------------------------------------------------------------------
+// Wrapper and gernator function to embed a parser by reference
+//------------------------------------------------------------------------------
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ // Wrapper to embed a parser by reference
+
+ template<class P> class parser_reference
+ : public parser< parser_reference<P> >
+ {
+ P const & ref_that;
+ public:
+ parser_reference(P & that)
+ // we allow implicit conversion but forbid temporaries.
+ : ref_that(that)
+ { }
+
+ typedef parser_reference<P> self_t;
+ typedef self_t const & embed_t;
+ typedef typename P::parser_category_t parser_category_t;
+
+ template<typename ScannerT> struct result
+ { typedef typename P::BOOST_NESTED_TEMPLATE result<ScannerT>::type type; };
+
+ template<typename ScannerT>
+ typename result<ScannerT>::type
+ parse(ScannerT const & scan) const
+ { return this->ref_that.parse(scan); }
+ };
+
+ template<class P> parser_reference<P>
+ embed_by_reference(::BOOST_SPIRIT_CLASSIC_NS::parser<P> & p)
+ { return p; }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+} } // namespace ::BOOST_SPIRIT_CLASSIC_NS
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::parser_reference, 1)
+
+//------------------------------------------------------------------------------
+// Expression templates for action placeholders.
+//------------------------------------------------------------------------------
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace type_of {
+
+ // No-operation functor
+
+ struct nop_functor
+ {
+ template<typename T>
+ bool operator()(T const &) const
+ { return false; }
+ template<typename T, typename U>
+ bool operator()(T const &, U const &) const
+ { return false; }
+
+ typedef bool result_type;
+ };
+
+ // Composite action
+
+ template<typename Action1, typename Action2>
+ class composite_action
+ {
+ Action1 fnc_a1;
+ Action2 fnc_a2;
+ public:
+ composite_action(Action1 const & a1, Action2 const & a2)
+ : fnc_a1(a1), fnc_a2(a2)
+ { }
+
+ template<typename T>
+ void operator()(T const & inp) const
+ { fnc_a1(inp); fnc_a2(inp); }
+
+ template<typename T, typename U>
+ void operator()(T const & inp1, U const inp2) const
+ { fnc_a1(inp1, inp2); fnc_a2(inp1, inp2); }
+ };
+
+ // Action concatenation (and optimize away nop_functorS)
+
+ template<typename Action1, typename Action2>
+ struct action_concatenator
+ {
+ typedef composite_action<Action1,Action2> type;
+
+ static type concatenate(Action1 const & a1, Action2 const & a2)
+ { return composite_action<Action1,Action2>(a1,a2); }
+ };
+ template<typename Action> struct action_concatenator<nop_functor, Action>
+ {
+ typedef Action type;
+
+ static type concatenate(nop_functor const &, Action const & a)
+ { return a; }
+ };
+ template<typename Action> struct action_concatenator<Action, nop_functor>
+ {
+ typedef Action type;
+
+ static type concatenate(Action const & a, nop_functor const &)
+ { return a; }
+ };
+ template<> struct action_concatenator<nop_functor, nop_functor>
+ {
+ typedef nop_functor type;
+
+ static type concatenate(nop_functor const &, nop_functor const &)
+ { return nop_functor(); }
+ };
+
+ template<typename Action1, typename Action2>
+ typename action_concatenator<Action1,Action2>::type
+ concatenate_actions(Action1 const & a1, Action2 const & a2)
+ {
+ return action_concatenator<Action1,Action2>::concatenate(a1,a2);
+ }
+
+ // Action chains
+
+ enum action_chain_mode { replace, append };
+
+ template<class Placeholder, action_chain_mode Mode, typename Action>
+ class action_chain
+ {
+ Action fnc_action;
+ public:
+ action_chain(Action const & a)
+ : fnc_action(a)
+ { }
+
+ typedef Action action_type;
+
+ Action const & action() const { return fnc_action; }
+ };
+
+ // This operator adds actions to an action chain definition
+ template<class PH, action_chain_mode M, typename A1, typename A2>
+ action_chain<PH, M, typename action_concatenator<A1,A2>::type>
+ operator, (action_chain<PH,M,A1> const & chain, A2 const & a)
+ {
+ return action_chain<PH,M,typename action_concatenator<A1,A2>::type>
+ ( concatenate_actions(chain.action(), a) );
+ }
+
+ // Expression template for mutiple action chain assignments
+ template<class ChainOrChains, class LastChain>
+ class action_chains
+ {
+ ChainOrChains obj_head;
+ LastChain obj_tail;
+ public:
+ action_chains(ChainOrChains const & head, LastChain const & tail)
+ : obj_head(head), obj_tail(tail)
+ { }
+
+ typedef ChainOrChains head_type;
+ typedef LastChain tail_type;
+
+ head_type const & head() const { return obj_head; }
+ tail_type const & tail() const { return obj_tail; }
+ };
+
+ // Action chain concatenation
+ template<class Head, class Tail>
+ action_chains<Head,Tail> make_chain(Head const & h, Tail const & t)
+ { return action_chains<Head,Tail>(h,t); }
+
+ template<class PH1, action_chain_mode M1, typename A1,
+ class PH2, action_chain_mode M2, typename A2>
+ action_chains< action_chain<PH1,M1,A1>, action_chain<PH2,M2,A2> >
+ operator, (action_chain<PH1,M1,A1> const & h,
+ action_chain<PH2,M2,A2> const & t)
+ { return make_chain(h,t); }
+
+ template<class Head, class Tail,class PH, action_chain_mode M, typename A>
+ action_chains< action_chains<Head,Tail>, action_chain<PH,M,A> >
+ operator, (action_chains<Head,Tail> const & h, action_chain<PH,M,A> const & t)
+ { return make_chain(h,t); }
+
+
+ // Extract the (maybe composite) action associated with an action
+ // placeholders from the chains with a fold algorithm.
+ template<class Placeholder, typename StartAction, class NewChainOrChains>
+ struct placeholdee
+ {
+ typedef StartAction type;
+
+ static type get(StartAction const & a, NewChainOrChains const &)
+ { return a; }
+ };
+
+ template<class Placeholder, // <-- non-deduced
+ typename StartAction, class NewChainOrChains>
+ typename placeholdee<Placeholder,StartAction,NewChainOrChains>::type
+ get_placeholdee(StartAction const & a, NewChainOrChains const & c)
+ { return placeholdee<Placeholder,StartAction,NewChainOrChains>::get(a,c); }
+
+ template<class Placeholder, typename StartAction, class Head, class Tail>
+ struct placeholdee
+ < Placeholder, StartAction, action_chains<Head,Tail> >
+ {
+ typedef typename placeholdee<Placeholder,
+ typename placeholdee<Placeholder,StartAction,Head>::type, Tail >::type
+ type;
+
+ static type get(StartAction const & a, action_chains<Head,Tail> const & c)
+ {
+ return get_placeholdee<Placeholder>(
+ get_placeholdee<Placeholder>(a,c.head()), c.tail() );
+ }
+ };
+
+ template<class Placeholder, typename StartAction, typename A>
+ struct placeholdee
+ < Placeholder, StartAction, action_chain<Placeholder,replace,A> >
+ {
+ typedef A type;
+
+ static type get(StartAction const &,
+ action_chain<Placeholder,replace,A> const & c)
+ { return c.action(); }
+ };
+
+ template<class Placeholder, typename StartAction, typename A>
+ struct placeholdee
+ < Placeholder, StartAction, action_chain<Placeholder,append,A> >
+ {
+ typedef typename action_concatenator<StartAction,A>::type type;
+
+ static type get(StartAction const & a,
+ action_chain<Placeholder,append,A> const & c)
+ { return concatenate_actions(a,c.action()); }
+ };
+
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+} } // namespace ::BOOST_SPIRIT_CLASSIC_NS::type_of
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::type_of::nop_functor)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::type_of::composite_action,2)
+
+//------------------------------------------------------------------------------
+// Misc.utilities
+//------------------------------------------------------------------------------
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+namespace type_of {
+
+ // Utility function to create a dependency to a template argument.
+
+ template<typename T, typename X>
+ X const & depend_on_type(X const & x)
+ { return x; }
+
+ // Utility to allow use parenthesized type expressions with commas inside
+ // as a type within macros. Thanks to Dave Abrahams for telling me this nice
+ // trick.
+
+ #define BOOST_SPIRIT_RP_TYPE(x) \
+ ::BOOST_SPIRIT_CLASSIC_NS::type_of::remove_special_fptr \
+ < ::BOOST_SPIRIT_CLASSIC_NS::type_of::special_result & (*) x >::type
+
+ struct special_result;
+
+ template<typename T> struct remove_special_fptr { };
+ template<typename T> struct remove_special_fptr< special_result & (*)(T) >
+ { typedef T type; };
+
+}
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+} } // namespace ::BOOST_SPIRIT_CLASSIC_NS::type_of
+
+//------------------------------------------------------------------------------
+#endif
+//------------------------------------------------------------------------------
+
diff --git a/boost/spirit/home/classic/utility/scoped_lock.hpp b/boost/spirit/home/classic/utility/scoped_lock.hpp
new file mode 100644
index 0000000000..952fd8785e
--- /dev/null
+++ b/boost/spirit/home/classic/utility/scoped_lock.hpp
@@ -0,0 +1,112 @@
+/*=============================================================================
+ Copyright (c) 2003 Martin Wille
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_UTILITY_SCOPED_LOCK_HPP
+#define BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/classic/namespace.hpp>
+#if !defined(BOOST_SPIRIT_COMPOSITE_HPP)
+#include <boost/spirit/home/classic/core/composite.hpp>
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scoped_lock_parser class
+ //
+ // implements locking of a mutex during execution of
+ // the parse method of an embedded parser
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename MutexT, typename ParserT>
+ struct scoped_lock_parser
+ : public unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >
+ {
+ typedef scoped_lock_parser<MutexT, ParserT> self_t;
+ typedef MutexT mutex_t;
+ typedef ParserT parser_t;
+
+ template <typename ScannerT>
+ struct result
+ {
+ typedef typename parser_result<parser_t, ScannerT>::type type;
+ };
+
+ scoped_lock_parser(mutex_t &m, parser_t const &p)
+ : unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >(p)
+ , mutex(m)
+ {}
+
+
+ template <typename ScannerT>
+ typename parser_result<self_t, ScannerT>::type
+ parse(ScannerT const &scan) const
+ {
+ typedef typename mutex_t::scoped_lock scoped_lock_t;
+ scoped_lock_t lock(mutex);
+ return this->subject().parse(scan);
+ }
+
+ mutex_t &mutex;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scoped_lock_parser_gen
+ //
+ // generator for scoped_lock_parser objects
+ // operator[] returns scoped_lock_parser according to its argument
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename MutexT>
+ struct scoped_lock_parser_gen
+ {
+ typedef MutexT mutex_t;
+ explicit scoped_lock_parser_gen(mutex_t &m) : mutex(m) {}
+
+ template<typename ParserT>
+ scoped_lock_parser
+ <
+ MutexT,
+ typename as_parser<ParserT>::type
+ >
+ operator[](ParserT const &p) const
+ {
+ typedef ::BOOST_SPIRIT_CLASSIC_NS::as_parser<ParserT> as_parser_t;
+ typedef typename as_parser_t::type parser_t;
+
+ return scoped_lock_parser<mutex_t, parser_t>
+ (mutex, as_parser_t::convert(p));
+ }
+
+ mutex_t &mutex;
+ };
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // scoped_lock_d parser directive
+ //
+ // constructs a scoped_lock_parser generator from its argument
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename MutexT>
+ scoped_lock_parser_gen<MutexT>
+ scoped_lock_d(MutexT &mutex)
+ {
+ return scoped_lock_parser_gen<MutexT>(mutex);
+ }
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+#endif // BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
diff --git a/boost/spirit/home/classic/utility/typeof.hpp b/boost/spirit/home/classic/utility/typeof.hpp
new file mode 100644
index 0000000000..9c70619b52
--- /dev/null
+++ b/boost/spirit/home/classic/utility/typeof.hpp
@@ -0,0 +1,150 @@
+/*=============================================================================
+ Copyright (c) 2006 Tobias Schwinger
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_UTILITY_TYPEOF_HPP)
+#define BOOST_SPIRIT_UTILITY_TYPEOF_HPP
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/typeof.hpp>
+
+#include <boost/spirit/home/classic/utility/escape_char_fwd.hpp>
+#include <boost/spirit/home/classic/utility/confix_fwd.hpp>
+#include <boost/spirit/home/classic/utility/lists_fwd.hpp>
+#include <boost/spirit/home/classic/utility/distinct_fwd.hpp>
+#include <boost/spirit/home/classic/utility/grammar_def_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ // chset.hpp
+ template<typename CharT> class chset;
+
+ // functor_parser.hpp
+ template<typename FunctorT> struct functor_parser;
+
+ // loops.hpp
+ template<class ParserT, typename ExactT> class fixed_loop;
+ template<class ParserT, typename MinT, typename MaxT> class finite_loop;
+ template<class ParserT, typename MinT> class infinite_loop;
+
+ // regex.hpp
+ template<typename CharT> struct rxstrlit;
+
+ // flush_multi_pass.hpp
+ class flush_multi_pass_parser;
+
+ // scoped_lock.hpp
+ template<class MutexT, class ParserT> struct scoped_lock_parser;
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+
+// chset.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::chset,1)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::chset<char>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::chset<wchar_t>)
+
+
+// escape_char.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::escape_char_parser,(BOOST_TYPEOF_INTEGRAL(unsigned long))(typename))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::escape_char_action,(class)(typename)(BOOST_TYPEOF_INTEGRAL(unsigned long))(typename))
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::escape_char_parser,(BOOST_TYPEOF_INTEGRAL(unsigned long)))
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::escape_char_action,(class)(typename)(BOOST_TYPEOF_INTEGRAL(unsigned long)))
+
+
+// functor_parser.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::functor_parser,1)
+
+
+// loops.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::fixed_loop,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::finite_loop,3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::infinite_loop,2)
+
+
+// regex.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::rxstrlit,1)
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::rxstrlit<char>)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::rxstrlit<wchar_t>)
+
+
+// confix.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::confix_parser, 6)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::confix_parser, 5)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::confix_parser, 4)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::confix_parser, 3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::comment_nest_parser, 2)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::is_nested)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::non_nested)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::is_lexeme)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::non_lexeme)
+
+
+// lists.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::list_parser,4)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::list_parser,3)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::list_parser,2)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::no_list_endtoken)
+
+
+// distinct.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::distinct_parser,2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::distinct_parser,1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::dynamic_distinct_parser,1)
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::distinct_parser<>)
+
+
+// flush_multi_pass.hpp
+
+BOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::flush_multi_pass_parser)
+
+
+// scoped_lock.hpp
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::scoped_lock_parser,2)
+
+
+// grammar_gen.hpp (has forward header)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::grammar_def,BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT)
+
+#if BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 12
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::grammar_def,12)
+#endif
+#if BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 9
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::grammar_def, 9)
+#endif
+#if BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 6
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::grammar_def, 6)
+#endif
+#if BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT > 3
+BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::grammar_def, 3)
+#endif
+
+
+#endif
+
+
diff --git a/boost/spirit/home/classic/version.hpp b/boost/spirit/home/classic/version.hpp
new file mode 100644
index 0000000000..77371ed37c
--- /dev/null
+++ b/boost/spirit/home/classic/version.hpp
@@ -0,0 +1,30 @@
+/*=============================================================================
+ Copyright (c) 2001-2003 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(SPIRIT_CLASSIC_VERSION_HPP)
+#define SPIRIT_CLASSIC_VERSION_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// This checks, whether the used Boost library is at least V1.32.0
+//
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/version.hpp>
+
+#if BOOST_VERSION < 103200
+#error "Spirit v1.8.x needs at least Boost V1.32.0 to compile successfully."
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// This is the version of the current Spirit distribution
+//
+///////////////////////////////////////////////////////////////////////////////
+#define SPIRIT_VERSION 0x1806
+#define SPIRIT_PIZZA_VERSION SPIRIT_MEGA_VEGGI // :-)
+
+#endif // defined(SPIRIT_VERSION_HPP)
diff --git a/boost/spirit/home/karma.hpp b/boost/spirit/home/karma.hpp
new file mode 100644
index 0000000000..90bb3fd393
--- /dev/null
+++ b/boost/spirit/home/karma.hpp
@@ -0,0 +1,31 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_KARMA_CORE_MARCH_06_2007_0833PM)
+#define SPIRIT_KARMA_CORE_MARCH_06_2007_0833PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/char.hpp>
+#include <boost/spirit/home/karma/string.hpp>
+#include <boost/spirit/home/karma/numeric.hpp>
+#include <boost/spirit/home/karma/operator.hpp>
+#include <boost/spirit/home/karma/nonterminal.hpp>
+#include <boost/spirit/home/karma/action.hpp>
+#include <boost/spirit/home/karma/directive.hpp>
+#include <boost/spirit/home/karma/auxiliary.hpp>
+#include <boost/spirit/home/karma/binary.hpp>
+#include <boost/spirit/home/karma/generate.hpp>
+#include <boost/spirit/home/karma/generate_attr.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/what.hpp>
+#include <boost/spirit/home/karma/stream.hpp>
+#include <boost/spirit/home/karma/auto.hpp>
+#include <boost/spirit/home/karma/format.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/action.hpp b/boost/spirit/home/karma/action.hpp
new file mode 100644
index 0000000000..dd6208e8cc
--- /dev/null
+++ b/boost/spirit/home/karma/action.hpp
@@ -0,0 +1,15 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_ACTION_MAR_04_2007_0912AM)
+#define BOOST_SPIRIT_KARMA_ACTION_MAR_04_2007_0912AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/action/action.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/action/action.hpp b/boost/spirit/home/karma/action/action.hpp
new file mode 100644
index 0000000000..23d621a138
--- /dev/null
+++ b/boost/spirit/home/karma/action/action.hpp
@@ -0,0 +1,137 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_ACTION_MAR_07_2007_0851AM)
+#define BOOST_SPIRIT_KARMA_ACTION_MAR_07_2007_0851AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/context.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/action_dispatch.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_PP_REPEAT(SPIRIT_ARGUMENTS_LIMIT, SPIRIT_USING_ARGUMENT, _)
+
+ template <typename Subject, typename Action>
+ struct action : unary_generator<action<Subject, Action> >
+ {
+ typedef Subject subject_type;
+ typedef typename subject_type::properties properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<Subject, Context, Iterator>
+ {};
+
+ action(Subject const& subject, Action f)
+ : subject(subject), f(f) {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr_) const
+ {
+ typedef typename attribute<Context, unused_type>::type attr_type;
+ typedef traits::make_attribute<attr_type, Attribute> make_attribute;
+
+ // create a attribute if none is supplied
+ // this creates a _copy_ of the attribute because the semantic
+ // action will likely change parts of this
+ typedef traits::transform_attribute<
+ typename make_attribute::type, attr_type, domain> transform;
+
+ typename transform::type attr =
+ traits::pre_transform<domain, attr_type>(make_attribute::call(attr_));
+
+ // call the function, passing the attribute, the context and a bool
+ // flag that the client can set to false to fail generating.
+ return traits::action_dispatch<Subject>()(f, attr, ctx) &&
+ subject.generate(sink, ctx, d, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ // the action is transparent (does not add any info)
+ return subject.what(context);
+ }
+
+ subject_type subject;
+ Action f;
+ };
+
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Karma action meta-compiler
+ template <>
+ struct make_component<karma::domain, tag::action>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ remove_const<typename Elements::car_type>::type
+ subject_type;
+
+ typedef typename
+ remove_const<typename Elements::cdr_type::car_type>::type
+ action_type;
+
+ typedef karma::action<subject_type, action_type> type;
+ };
+
+ template <typename Elements>
+ typename result<make_component(Elements, unused_type)>::type
+ operator()(Elements const& elements, unused_type) const
+ {
+ typename result<make_component(Elements, unused_type)>::type
+ result(elements.car, elements.cdr.car);
+ return result;
+ }
+ };
+}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Action>
+ struct has_semantic_action<karma::action<Subject, Action> >
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Action, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::action<Subject, Action>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/auto.hpp b/boost/spirit/home/karma/auto.hpp
new file mode 100644
index 0000000000..0996306bdf
--- /dev/null
+++ b/boost/spirit/home/karma/auto.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_AUTO_NOV_29_2009_0324PM)
+#define BOOST_SPIRIT_KARMA_AUTO_NOV_29_2009_0324PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auto/auto.hpp>
+#include <boost/spirit/home/karma/detail/generate_auto.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/auto/auto.hpp b/boost/spirit/home/karma/auto/auto.hpp
new file mode 100644
index 0000000000..acbfcee340
--- /dev/null
+++ b/boost/spirit/home/karma/auto/auto.hpp
@@ -0,0 +1,188 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_AUTO_NOV_29_2009_0339PM)
+#define BOOST_SPIRIT_KARMA_AUTO_NOV_29_2009_0339PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/support/detail/hold_any.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/auto/create_generator.hpp>
+#include <boost/mpl/bool.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, tag::auto_> // enables auto_
+ : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables auto_(...)
+ , terminal_ex<tag::auto_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <> // enables auto_(f)
+ struct use_lazy_terminal<
+ karma::domain, tag::auto_, 1 /*arity*/
+ > : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::auto_;
+#endif
+ using spirit::auto_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct auto_generator
+ : generator<auto_generator<Modifiers> >
+ {
+ typedef mpl::int_<generator_properties::all_properties> properties;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef spirit::basic_hold_any<char> type;
+ };
+
+ auto_generator(Modifiers const& modifiers)
+ : modifiers_(modifiers) {}
+
+ // auto_generator has an attached attribute
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ return compile<karma::domain>(create_generator<Attribute>(), modifiers_)
+ .generate(sink, context, d, attr);
+ }
+
+ // this auto_generator has no attribute attached, it needs to have been
+ // initialized from a value/variable
+ template <typename OutputIterator, typename Context
+ , typename Delimiter>
+ static bool
+ generate(OutputIterator&, Context&, Delimiter const&, unused_type)
+ {
+ // It is not possible (doesn't make sense) to use auto_ generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false, auto_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("auto_");
+ }
+
+ Modifiers modifiers_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Modifiers>
+ struct lit_auto_generator
+ : generator<lit_auto_generator<T, Modifiers> >
+ {
+ typedef mpl::int_<generator_properties::all_properties> properties;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ lit_auto_generator(typename add_reference<T>::type t, Modifiers const& modifiers)
+ : t_(t)
+ , generator_(compile<karma::domain>(create_generator<T>(), modifiers))
+ {}
+
+ // auto_generator has an attached attribute
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const&) const
+ {
+ return generator_.generate(sink, context, d, t_);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("auto_");
+ }
+
+ typedef typename spirit::result_of::create_generator<T>::type
+ generator_type;
+
+ typedef typename spirit::result_of::compile<
+ karma::domain, generator_type, Modifiers>::type generator_impl_type;
+
+ T t_;
+ generator_impl_type generator_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ lit_auto_generator& operator= (lit_auto_generator const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // auto_
+ template <typename Modifiers>
+ struct make_primitive<tag::auto_, Modifiers>
+ {
+ typedef auto_generator<Modifiers> result_type;
+
+ result_type operator()(unused_type, Modifiers const& modifiers) const
+ {
+ return result_type(modifiers);
+ }
+ };
+
+ // auto_(...)
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::auto_, fusion::vector1<A0> >, Modifiers>
+ {
+ typedef typename add_const<A0>::type const_attribute;
+
+ typedef lit_auto_generator<const_attribute, Modifiers> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Modifiers const& modifiers) const
+ {
+ return result_type(fusion::at_c<0>(term.args), modifiers);
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/auto/create_generator.hpp b/boost/spirit/home/karma/auto/create_generator.hpp
new file mode 100644
index 0000000000..7c2551b1be
--- /dev/null
+++ b/boost/spirit/home/karma/auto/create_generator.hpp
@@ -0,0 +1,46 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_CREATE_NOV_21_2009_0340PM)
+#define BOOST_SPIRIT_KARMA_CREATE_NOV_21_2009_0340PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auto/meta_create.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace result_of
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct create_generator
+ : spirit::traits::meta_create<karma::domain, T> {};
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ // Main API function for generator creation from data type
+ template <typename T>
+ typename result_of::create_generator<T>::type
+ create_generator()
+ {
+ return spirit::traits::meta_create<karma::domain, T>::call();
+ }
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ // Meta function returning true if create_generator does return a valid
+ // generator for the given type T.
+ template <typename T>
+ struct create_generator_exists
+ : meta_create_exists<karma::domain, T> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/auto/meta_create.hpp b/boost/spirit/home/karma/auto/meta_create.hpp
new file mode 100644
index 0000000000..c101a6347a
--- /dev/null
+++ b/boost/spirit/home/karma/auto/meta_create.hpp
@@ -0,0 +1,339 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_META_CREATE_NOV_21_2009_0425PM)
+#define BOOST_SPIRIT_KARMA_META_CREATE_NOV_21_2009_0425PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/auto/meta_create.hpp>
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/variant.hpp>
+#include <boost/optional.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // compatible STL containers
+ template <typename Container>
+ struct meta_create_container
+ {
+ typedef make_unary_proto_expr<
+ typename Container::value_type
+ , proto::tag::dereference, karma::domain
+ > make_proto_expr;
+
+ typedef typename make_proto_expr::type type;
+
+ static type call()
+ {
+ return make_proto_expr::call();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // String types
+ template <typename String>
+ struct meta_create_string
+ {
+ typedef spirit::standard::string_type type;
+ static type const call() { return type(); }
+ };
+
+ template <>
+ struct meta_create_string<wchar_t*>
+ {
+ typedef spirit::standard_wide::string_type type;
+ static type const call() { return type(); }
+ };
+
+ template <>
+ struct meta_create_string<wchar_t const*>
+ {
+ typedef spirit::standard_wide::string_type type;
+ static type const call() { return type(); }
+ };
+
+ template <int N>
+ struct meta_create_string<wchar_t[N]>
+ {
+ typedef spirit::standard_wide::string_type type;
+ static type const call() { return type(); }
+ };
+
+ template <int N>
+ struct meta_create_string<wchar_t const[N]>
+ {
+ typedef spirit::standard_wide::string_type type;
+ static type const call() { return type(); }
+ };
+
+ template <int N>
+ struct meta_create_string<wchar_t(&)[N]>
+ {
+ typedef spirit::standard_wide::string_type type;
+ static type const call() { return type(); }
+ };
+
+ template <int N>
+ struct meta_create_string<wchar_t const(&)[N]>
+ {
+ typedef spirit::standard_wide::string_type type;
+ static type const call() { return type(); }
+ };
+
+ template <typename Traits, typename Allocator>
+ struct meta_create_string<std::basic_string<wchar_t, Traits, Allocator> >
+ {
+ typedef spirit::standard_wide::string_type type;
+ static type const call() { return type(); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Fusion sequences
+ template <typename Sequence>
+ struct meta_create_sequence
+ {
+ // create a mpl sequence from the given fusion sequence
+ typedef typename mpl::fold<
+ typename fusion::result_of::as_vector<Sequence>::type
+ , mpl::vector<>, mpl::push_back<mpl::_, mpl::_>
+ >::type sequence_type;
+
+ typedef make_nary_proto_expr<
+ sequence_type, proto::tag::shift_left, karma::domain
+ > make_proto_expr;
+
+ typedef typename make_proto_expr::type type;
+
+ static type call()
+ {
+ return make_proto_expr::call();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // the default is to use the standard streaming operator unless it's a
+ // STL container or a fusion sequence
+
+ // The default implementation will be chosen if no predefined mapping of
+ // the data type T to a Karma component is defined.
+ struct no_auto_mapping_exists {};
+
+ template <typename T, typename Enable = void>
+ struct meta_create_impl : mpl::identity<no_auto_mapping_exists> {};
+
+ template <typename T>
+ struct meta_create_impl<T
+ , typename enable_if<
+ mpl::and_<
+ traits::is_container<T>
+ , mpl::not_<traits::is_string<T> >
+ , mpl::not_<fusion::traits::is_sequence<T> >
+ > >::type>
+ : meta_create_container<T> {};
+
+ template <typename T>
+ struct meta_create_impl<T
+ , typename enable_if<traits::is_string<T> >::type>
+ : meta_create_string<T> {};
+
+ template <typename T>
+ struct meta_create_impl<T, typename enable_if<
+ spirit::detail::is_fusion_sequence_but_not_proto_expr<T>
+ >::type>
+ : meta_create_sequence<T> {};
+
+ template <typename T, typename Enable = void>
+ struct meta_create : meta_create_impl<T> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // optional
+ template <typename T>
+ struct meta_create<boost::optional<T> >
+ {
+ typedef make_unary_proto_expr<
+ T, proto::tag::negate, karma::domain
+ > make_proto_expr;
+
+ typedef typename make_proto_expr::type type;
+
+ static type call()
+ {
+ return make_proto_expr::call();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // alternatives
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct meta_create<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ {
+ typedef make_nary_proto_expr<
+ typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types
+ , proto::tag::bitwise_or, karma::domain
+ > make_proto_expr;
+
+ typedef typename make_proto_expr::type type;
+
+ static type call()
+ {
+ return make_proto_expr::call();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // predefined specializations for primitive components
+
+ // character generator
+ template <>
+ struct meta_create<char>
+ {
+ typedef spirit::standard::char_type type;
+ static type const call() { return type(); }
+ };
+ template <>
+ struct meta_create<signed char>
+ {
+ typedef spirit::standard::char_type type;
+ static type const call() { return type(); }
+ };
+ template <>
+ struct meta_create<wchar_t>
+ {
+ typedef spirit::standard_wide::char_type type;
+ static type const call() { return type(); }
+ };
+
+ template <>
+ struct meta_create<unsigned char>
+ {
+ typedef spirit::standard::char_type type;
+ static type const call() { return type(); }
+ };
+
+ // boolean generator
+ template <>
+ struct meta_create<bool>
+ {
+ typedef spirit::bool_type type;
+ static type call() { return type(); }
+ };
+
+ // integral generators
+ template <>
+ struct meta_create<int>
+ {
+ typedef spirit::int_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<short>
+ {
+ typedef spirit::short_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<long>
+ {
+ typedef spirit::long_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<unsigned int>
+ {
+ typedef spirit::uint_type type;
+ static type call() { return type(); }
+ };
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+ template <>
+ struct meta_create<unsigned short>
+ {
+ typedef spirit::ushort_type type;
+ static type call() { return type(); }
+ };
+#endif
+ template <>
+ struct meta_create<unsigned long>
+ {
+ typedef spirit::ulong_type type;
+ static type call() { return type(); }
+ };
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct meta_create<boost::long_long_type>
+ {
+ typedef spirit::long_long_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<boost::ulong_long_type>
+ {
+ typedef spirit::ulong_long_type type;
+ static type call() { return type(); }
+ };
+#endif
+
+ // floating point generators
+ template <>
+ struct meta_create<float>
+ {
+ typedef spirit::float_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<double>
+ {
+ typedef spirit::double_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<long double>
+ {
+ typedef spirit::long_double_type type;
+ static type call() { return type(); }
+ };
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // main customization point for create_generator
+ template <typename T, typename Enable = void>
+ struct create_generator : karma::meta_create<T> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // dispatch this to the karma related specializations
+ template <typename T>
+ struct meta_create<karma::domain, T>
+ : create_generator<typename spirit::detail::remove_const_ref<T>::type> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Check whether a valid mapping exits for the given data type to a Karma
+ // component
+ template <typename T>
+ struct meta_create_exists<karma::domain, T>
+ : mpl::not_<is_same<
+ karma::no_auto_mapping_exists
+ , typename meta_create<karma::domain, T>::type
+ > > {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/auxiliary.hpp b/boost/spirit/home/karma/auxiliary.hpp
new file mode 100644
index 0000000000..da116c5457
--- /dev/null
+++ b/boost/spirit/home/karma/auxiliary.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_AUXILIARY_MAR_26_2007_1225PM)
+#define BOOST_SPIRIT_KARMA_AUXILIARY_MAR_26_2007_1225PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auxiliary/eps.hpp>
+#include <boost/spirit/home/karma/auxiliary/eol.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/auxiliary/attr_cast.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/auxiliary/attr_cast.hpp b/boost/spirit/home/karma/auxiliary/attr_cast.hpp
new file mode 100644
index 0000000000..2e67b6b391
--- /dev/null
+++ b/boost/spirit/home/karma/auxiliary/attr_cast.hpp
@@ -0,0 +1,120 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_KARMA_ATTR_CAST_SEP_26_2009_0348PM)
+#define SPIRIT_KARMA_ATTR_CAST_SEP_26_2009_0348PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/auxiliary/attr_cast.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // enables attr_cast<>() pseudo generator
+ template <typename Expr, typename Exposed, typename Transformed>
+ struct use_terminal<karma::domain
+ , tag::stateful_tag<Expr, tag::attr_cast, Exposed, Transformed> >
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::attr_cast;
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // attr_cast_generator consumes the attribute of subject generator without
+ // generating anything
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Exposed, typename Transformed, typename Subject>
+ struct attr_cast_generator
+ : unary_generator<attr_cast_generator<Exposed, Transformed, Subject> >
+ {
+ typedef typename result_of::compile<karma::domain, Subject>::type
+ subject_type;
+
+ typedef mpl::int_<subject_type::properties::value> properties;
+
+ typedef typename mpl::eval_if<
+ traits::not_is_unused<Transformed>
+ , mpl::identity<Transformed>
+ , traits::attribute_of<subject_type> >::type
+ transformed_attribute_type;
+
+ attr_cast_generator(Subject const& subject)
+ : subject(subject)
+ {
+ // If you got an error_invalid_expression error message here,
+ // then the expression (Subject) is not a valid spirit karma
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Subject);
+ }
+
+ // If Exposed is given, we use the given type, otherwise all we can do
+ // is to guess, so we expose our inner type as an attribute and
+ // deal with the passed attribute inside the parse function.
+ template <typename Context, typename Unused>
+ struct attribute
+ : mpl::if_<traits::not_is_unused<Exposed>, Exposed
+ , transformed_attribute_type>
+ {};
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ typedef traits::transform_attribute<
+ Attribute const, transformed_attribute_type, domain>
+ transform;
+
+ return compile<karma::domain>(subject).generate(
+ sink, ctx, d, transform::pre(attr));
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("attr_cast"
+ , compile<karma::domain>(subject).what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generator: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Exposed, typename Transformed
+ , typename Modifiers>
+ struct make_primitive<
+ tag::stateful_tag<Expr, tag::attr_cast, Exposed, Transformed>, Modifiers>
+ {
+ typedef attr_cast_generator<Exposed, Transformed, Expr> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ typedef tag::stateful_tag<
+ Expr, tag::attr_cast, Exposed, Transformed> tag_type;
+ using spirit::detail::get_stateful_data;
+ return result_type(get_stateful_data<tag_type>::call(term));
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/auxiliary/eol.hpp b/boost/spirit/home/karma/auxiliary/eol.hpp
new file mode 100644
index 0000000000..3aba64bc75
--- /dev/null
+++ b/boost/spirit/home/karma/auxiliary/eol.hpp
@@ -0,0 +1,81 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_EOL_JUL_08_2008_1014AM)
+#define BOOST_SPIRIT_KARMA_EOL_JUL_08_2008_1014AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, tag::eol> // enables eol
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using boost::spirit::eol;
+#endif
+ using boost::spirit::eol_type;
+
+ struct eol_generator : primitive_generator<eol_generator>
+ {
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ static bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , Attribute const& /*attr*/)
+ {
+ return detail::generate_to(sink, '\n') &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ template <typename Context>
+ info what(Context const& /*context*/) const
+ {
+ return info("eol");
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::eol, Modifiers>
+ {
+ typedef eol_generator result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/auxiliary/eps.hpp b/boost/spirit/home/karma/auxiliary/eps.hpp
new file mode 100644
index 0000000000..a8c57b3f7c
--- /dev/null
+++ b/boost/spirit/home/karma/auxiliary/eps.hpp
@@ -0,0 +1,137 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_EPS_APRIL_21_2007_0246PM)
+#define BOOST_SPIRIT_KARMA_EPS_APRIL_21_2007_0246PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/fusion/include/at.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables eps
+ template <>
+ struct use_terminal<karma::domain, tag::eps>
+ : mpl::true_ {};
+
+ // enables eps(bool-condition)
+ template <typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::eps, fusion::vector1<A0> > >
+ : is_convertible<A0, bool> {};
+
+ // enables lazy eps(f)
+ template <>
+ struct use_lazy_terminal<karma::domain, tag::eps, 1>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using boost::spirit::eps;
+#endif
+ using boost::spirit::eps_type;
+
+ struct eps_generator : primitive_generator<eps_generator>
+ {
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ static bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , Attribute const& /*attr*/)
+ {
+ return karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ template <typename Context>
+ info what(Context const& /*context*/) const
+ {
+ return info("eps");
+ }
+ };
+
+ struct semantic_predicate : primitive_generator<semantic_predicate>
+ {
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ semantic_predicate(bool predicate)
+ : predicate_(predicate)
+ {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , Attribute const& /*attr*/) const
+ {
+ // only do post-delimiting when predicate is true
+ return predicate_ && karma::delimit_out(sink, d);
+ }
+
+ template <typename Context>
+ info what(Context const& /*context*/) const
+ {
+ return info("semantic-predicate");
+ }
+
+ bool predicate_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::eps, Modifiers>
+ {
+ typedef eps_generator result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::eps, fusion::vector1<A0> >
+ , Modifiers>
+ {
+ typedef semantic_predicate result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/auxiliary/lazy.hpp b/boost/spirit/home/karma/auxiliary/lazy.hpp
new file mode 100644
index 0000000000..32d55fa49a
--- /dev/null
+++ b/boost/spirit/home/karma/auxiliary/lazy.hpp
@@ -0,0 +1,267 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_KARMA_LAZY_MARCH_27_2007_1231PM)
+#define BOOST_SPIRIT_KARMA_LAZY_MARCH_27_2007_1231PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/lazy.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/utility/result_of.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/not.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Eval>
+ struct use_terminal<karma::domain, phoenix::actor<Eval> > // enables phoenix actors
+ : mpl::true_ {};
+
+ // forward declaration
+ template <typename Terminal, typename Actor, int Arity>
+ struct lazy_terminal;
+
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+ using spirit::lazy;
+ typedef modify<karma::domain> karma_modify;
+
+ namespace detail
+ {
+ template <typename Generator, typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool lazy_generate_impl(Generator const& g, OutputIterator& sink
+ , Context& context, Delimiter const& delim
+ , Attribute const& attr, mpl::false_)
+ {
+ return g.generate(sink, context, delim, attr);
+ }
+
+ template <typename Generator, typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool lazy_generate_impl(Generator const& g, OutputIterator& sink
+ , Context& context, Delimiter const& delim
+ , Attribute const& attr, mpl::true_)
+ {
+ // If DeducedAuto is false (semantic actions is present), the
+ // component's attribute is unused.
+ return g.generate(sink, context, delim, unused);
+ }
+
+ template <typename Generator, typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool lazy_generate_impl_main(Generator const& g, OutputIterator& sink
+ , Context& context, Delimiter const& delim, Attribute const& attr)
+ {
+ // If DeducedAuto is true (no semantic action), we pass the parser's
+ // attribute on to the component.
+ typedef typename traits::has_semantic_action<Generator>::type auto_rule;
+ return lazy_generate_impl(g, sink, context, delim, attr, auto_rule());
+ }
+ }
+
+ template <typename Function, typename Modifiers>
+ struct lazy_generator : generator<lazy_generator<Function, Modifiers> >
+ {
+ typedef mpl::int_<generator_properties::all_properties> properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ boost::result_of<karma_modify(tag::lazy_eval, Modifiers)>::type
+ modifier;
+
+ typedef typename
+ remove_reference<
+ typename boost::result_of<Function(unused_type, Context)>::type
+ >::type
+ expr_type;
+
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr_type) is not a valid spirit karma
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, expr_type);
+
+ typedef typename
+ result_of::compile<karma::domain, expr_type, modifier>::type
+ generator_type;
+
+ typedef typename
+ traits::attribute_of<generator_type, Context, Iterator>::type
+ type;
+ };
+
+ lazy_generator(Function const& func, Modifiers const& modifiers)
+ : func(func), modifiers(modifiers) {}
+
+ template <
+ typename OutputIterator, typename Context,
+ typename Delimiter, typename Attribute
+ >
+ bool generate(OutputIterator& sink, Context& context,
+ Delimiter const& d, Attribute const& attr) const
+ {
+ return detail::lazy_generate_impl_main(
+ compile<karma::domain>(func(unused, context)
+ , karma_modify()(tag::lazy_eval(), modifiers))
+ , sink, context, d, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("lazy"
+ , compile<karma::domain>(func(unused, context)
+ , karma_modify()(tag::lazy_eval(), modifiers))
+ .what(context)
+ );
+ }
+
+ Function func;
+ Modifiers modifiers;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ lazy_generator& operator= (lazy_generator const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Function, typename Subject, typename Modifiers>
+ struct lazy_directive
+ : unary_generator<lazy_directive<Function, Subject, Modifiers> >
+ {
+ typedef mpl::int_<generator_properties::all_properties> properties;
+
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ boost::result_of<karma_modify(tag::lazy_eval, Modifiers)>::type
+ modifier;
+
+ typedef typename
+ remove_reference<
+ typename boost::result_of<Function(unused_type, Context)>::type
+ >::type
+ directive_expr_type;
+
+ typedef typename
+ proto::result_of::make_expr<
+ proto::tag::subscript
+ , directive_expr_type
+ , Subject
+ >::type
+ expr_type;
+
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr_type) is not a valid spirit karma
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, expr_type);
+
+ typedef typename
+ result_of::compile<karma::domain, expr_type, modifier>::type
+ generator_type;
+
+ typedef typename
+ traits::attribute_of<generator_type, Context, Iterator>::type
+ type;
+ };
+
+ lazy_directive(Function const& function, Subject const& subject
+ , Modifiers const& modifiers)
+ : function(function), subject(subject), modifiers(modifiers) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ return detail::lazy_generate_impl_main(compile<karma::domain>(
+ proto::make_expr<proto::tag::subscript>(
+ function(unused, ctx), subject)
+ , karma_modify()(tag::lazy_eval(), modifiers))
+ , sink, ctx, d, attr);
+ }
+
+ template <typename Context>
+ info what(Context& ctx) const
+ {
+ return info("lazy-directive"
+ , compile<karma::domain>(
+ proto::make_expr<proto::tag::subscript>(
+ function(unused, ctx), subject)
+ , karma_modify()(tag::lazy_eval(), modifiers))
+ .what(ctx)
+ );
+ }
+
+ Function function;
+ Subject subject;
+ Modifiers modifiers;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Eval, typename Modifiers>
+ struct make_primitive<phoenix::actor<Eval>, Modifiers>
+ {
+ typedef lazy_generator<phoenix::actor<Eval>, Modifiers> result_type;
+ result_type operator()(phoenix::actor<Eval> const& f
+ , Modifiers const& modifiers) const
+ {
+ return result_type(f, modifiers);
+ }
+ };
+
+ template <typename Terminal, typename Actor, int Arity, typename Modifiers>
+ struct make_primitive<lazy_terminal<Terminal, Actor, Arity>, Modifiers>
+ {
+ typedef lazy_generator<Actor, Modifiers> result_type;
+ result_type operator()(
+ lazy_terminal<Terminal, Actor, Arity> const& lt
+ , Modifiers const& modifiers) const
+ {
+ return result_type(lt.actor, modifiers);
+ }
+ };
+
+ template <
+ typename Terminal, typename Actor, int Arity, typename Subject
+ , typename Modifiers>
+ struct make_directive<lazy_terminal<Terminal, Actor, Arity>
+ , Subject, Modifiers>
+ {
+ typedef lazy_directive<Actor, Subject, Modifiers> result_type;
+ result_type operator()(
+ lazy_terminal<Terminal, Actor, Arity> const& lt
+ , Subject const& subject, Modifiers const& modifiers) const
+ {
+ return result_type(lt.actor, subject, modifiers);
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/binary.hpp b/boost/spirit/home/karma/binary.hpp
new file mode 100644
index 0000000000..50b8e70fec
--- /dev/null
+++ b/boost/spirit/home/karma/binary.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_BINARY_MAY_04_2007_0859AM)
+#define BOOST_SPIRIT_KARMA_BINARY_MAY_04_2007_0859AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/binary/binary.hpp>
+#include <boost/spirit/home/karma/binary/padding.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/binary/binary.hpp b/boost/spirit/home/karma/binary/binary.hpp
new file mode 100644
index 0000000000..cbb190018e
--- /dev/null
+++ b/boost/spirit/home/karma/binary/binary.hpp
@@ -0,0 +1,438 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_BINARY_MAY_04_2007_0904AM)
+#define BOOST_SPIRIT_KARMA_BINARY_MAY_04_2007_0904AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/detail/endian.hpp>
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+#include <boost/config.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+#define BOOST_SPIRIT_ENABLE_BINARY(name) \
+ template <> \
+ struct use_terminal<karma::domain, tag::name> \
+ : mpl::true_ {}; \
+ \
+ template <typename A0> \
+ struct use_terminal<karma::domain \
+ , terminal_ex<tag::name, fusion::vector1<A0> > > \
+ : mpl::or_<is_integral<A0>, is_enum<A0> > {}; \
+ \
+ template <> \
+ struct use_lazy_terminal<karma::domain, tag::name, 1> : mpl::true_ {}; \
+ \
+/***/
+
+#define BOOST_SPIRIT_ENABLE_BINARY_IEEE754(name) \
+ template<> \
+ struct use_terminal<karma::domain, tag::name>: mpl::true_ {}; \
+ \
+ template<typename A0> \
+ struct use_terminal<karma::domain, terminal_ex<tag::name, \
+ fusion::vector1<A0> > >: is_floating_point<A0> {}; \
+ \
+ template<> \
+ struct use_lazy_terminal<karma::domain, tag::name, 1> : mpl::true_ {}; \
+ \
+/***/
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ BOOST_SPIRIT_ENABLE_BINARY(byte_) // enables byte_
+ BOOST_SPIRIT_ENABLE_BINARY(word) // enables word
+ BOOST_SPIRIT_ENABLE_BINARY(big_word) // enables big_word
+ BOOST_SPIRIT_ENABLE_BINARY(little_word) // enables little_word
+ BOOST_SPIRIT_ENABLE_BINARY(dword) // enables dword
+ BOOST_SPIRIT_ENABLE_BINARY(big_dword) // enables big_dword
+ BOOST_SPIRIT_ENABLE_BINARY(little_dword) // enables little_dword
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_SPIRIT_ENABLE_BINARY(qword) // enables qword
+ BOOST_SPIRIT_ENABLE_BINARY(big_qword) // enables big_qword
+ BOOST_SPIRIT_ENABLE_BINARY(little_qword) // enables little_qword
+#endif
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(bin_float)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(big_bin_float)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(little_bin_float)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(bin_double)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(big_bin_double)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(little_bin_double)
+}}
+
+#undef BOOST_SPIRIT_ENABLE_BINARY
+#undef BOOST_SPIRIT_ENABLE_BINARY_IEEE754
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using boost::spirit::byte_;
+ using boost::spirit::word;
+ using boost::spirit::big_word;
+ using boost::spirit::little_word;
+ using boost::spirit::dword;
+ using boost::spirit::big_dword;
+ using boost::spirit::little_dword;
+#ifdef BOOST_HAS_LONG_LONG
+ using boost::spirit::qword;
+ using boost::spirit::big_qword;
+ using boost::spirit::little_qword;
+#endif
+ using boost::spirit::bin_float;
+ using boost::spirit::big_bin_float;
+ using boost::spirit::little_bin_float;
+ using boost::spirit::bin_double;
+ using boost::spirit::big_bin_double;
+ using boost::spirit::little_bin_double;
+#endif
+
+ using boost::spirit::byte_type;
+ using boost::spirit::word_type;
+ using boost::spirit::big_word_type;
+ using boost::spirit::little_word_type;
+ using boost::spirit::dword_type;
+ using boost::spirit::big_dword_type;
+ using boost::spirit::little_dword_type;
+#ifdef BOOST_HAS_LONG_LONG
+ using boost::spirit::qword_type;
+ using boost::spirit::big_qword_type;
+ using boost::spirit::little_qword_type;
+#endif
+ using boost::spirit::bin_float_type;
+ using boost::spirit::big_bin_float_type;
+ using boost::spirit::little_bin_float_type;
+ using boost::spirit::bin_double_type;
+ using boost::spirit::big_bin_double_type;
+ using boost::spirit::little_bin_double_type;
+
+ namespace detail
+ {
+ template <int bits>
+ struct integer
+ {
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_SPIRIT_ASSERT_MSG(
+ bits == 8 || bits == 16 || bits == 32 || bits == 64,
+ not_supported_binary_size, ());
+#else
+ BOOST_SPIRIT_ASSERT_MSG(
+ bits == 8 || bits == 16 || bits == 32,
+ not_supported_binary_size, ());
+#endif
+ };
+
+ template <>
+ struct integer<8>
+ {
+ typedef uint_least8_t type;
+ };
+
+ template <>
+ struct integer<16>
+ {
+ typedef uint_least16_t type;
+ };
+
+ template <>
+ struct integer<32>
+ {
+ typedef uint_least32_t type;
+ };
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct integer<64>
+ {
+ typedef uint_least64_t type;
+ };
+#endif
+
+ template <int bits>
+ struct floating_point
+ {
+ BOOST_SPIRIT_ASSERT_MSG(
+ bits == 32 || bits == 64,
+ not_supported_binary_size, ());
+ };
+
+ template <>
+ struct floating_point<32>
+ {
+ typedef float type;
+ };
+
+ template <>
+ struct floating_point<64>
+ {
+ typedef double type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <BOOST_SCOPED_ENUM(boost::endian::endianness) bits>
+ struct what;
+
+ template <>
+ struct what<boost::endian::endianness::native>
+ {
+ static info is()
+ {
+ return info("native-endian binary");
+ }
+ };
+
+ template <>
+ struct what<boost::endian::endianness::little>
+ {
+ static info is()
+ {
+ return info("little-endian binary");
+ }
+ };
+
+ template <>
+ struct what<boost::endian::endianness::big>
+ {
+ static info is()
+ {
+ return info("big-endian binary");
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, BOOST_SCOPED_ENUM(boost::endian::endianness) endian, int bits>
+ struct any_binary_generator
+ : primitive_generator<any_binary_generator<T, endian, bits> >
+ {
+ template <typename Context, typename Unused = unused_type>
+ struct attribute: T {};
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ static bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr)
+ {
+ if (!traits::has_optional_value(attr))
+ return false;
+
+ // Even if the endian types are not pod's (at least not in the
+ // definition of C++03) it seems to be safe to assume they are.
+ // This allows us to treat them as a sequence of consecutive bytes.
+ boost::endian::endian<endian, typename T::type, bits> p;
+
+#if defined(BOOST_MSVC)
+// warning C4244: 'argument' : conversion from 'const int' to 'foo', possible loss of data
+#pragma warning(push)
+#pragma warning(disable: 4244)
+#endif
+ typedef typename T::type attribute_type;
+ p = traits::extract_from<attribute_type>(attr, context);
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+ unsigned char const* bytes =
+ reinterpret_cast<unsigned char const*>(&p);
+
+ for (unsigned int i = 0; i < sizeof(p); ++i)
+ {
+ if (!detail::generate_to(sink, *bytes++))
+ return false;
+ }
+ return karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // this any_byte_director has no parameter attached, it needs to have
+ // been initialized from a direct literal
+ template <
+ typename OutputIterator, typename Context, typename Delimiter>
+ static bool generate(OutputIterator&, Context&, Delimiter const&
+ , unused_type)
+ {
+ // It is not possible (doesn't make sense) to use binary generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false,
+ binary_generator_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return karma::detail::what<endian>::is();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, BOOST_SCOPED_ENUM(boost::endian::endianness) endian, int bits>
+ struct literal_binary_generator
+ : primitive_generator<literal_binary_generator<T, endian, bits> >
+ {
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ template <typename V>
+ literal_binary_generator(V const& v)
+ {
+#if defined(BOOST_MSVC)
+// warning C4244: 'argument' : conversion from 'const int' to 'foo', possible loss of data
+#pragma warning(push)
+#pragma warning(disable: 4244)
+#endif
+ data_ = v;
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+ }
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , Attribute const&) const
+ {
+ // Even if the endian types are not pod's (at least not in the
+ // definition of C++03) it seems to be safe to assume they are
+ // (but in C++0x the endian types _are_ PODs).
+ // This allows us to treat them as a sequence of consecutive bytes.
+ unsigned char const* bytes =
+ reinterpret_cast<unsigned char const*>(&data_);
+
+ for (unsigned int i = 0; i < sizeof(data_type); ++i)
+ {
+ if (!detail::generate_to(sink, *bytes++))
+ return false;
+ }
+ return karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return karma::detail::what<endian>::is();
+ }
+
+ typedef boost::endian::endian<endian, typename T::type,
+ bits> data_type;
+
+ data_type data_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, BOOST_SCOPED_ENUM(boost::endian::endianness) endian
+ , int bits>
+ struct basic_binary
+ {
+ typedef any_binary_generator<T, endian, bits> result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ template <typename Modifiers, typename T
+ , BOOST_SCOPED_ENUM(boost::endian::endianness) endian, int bits>
+ struct basic_binary_literal
+ {
+ typedef literal_binary_generator<T, endian, bits> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+ }
+
+#define BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(name, endiantype, bits) \
+ template <typename Modifiers> \
+ struct make_primitive<tag::name, Modifiers> \
+ : detail::basic_binary<detail::integer<bits>, \
+ boost::endian::endianness::endiantype, bits> {}; \
+ \
+ template <typename Modifiers, typename A0> \
+ struct make_primitive<terminal_ex<tag::name, fusion::vector1<A0> > \
+ , Modifiers> \
+ : detail::basic_binary_literal<Modifiers, detail::integer<bits> \
+ , boost::endian::endianness::endiantype, bits> {}; \
+ \
+ /***/
+
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(byte_, native, 8)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(word, native, 16)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(big_word, big, 16)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(little_word, little, 16)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(dword, native, 32)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(big_dword, big, 32)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(little_dword, little, 32)
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(qword, native, 64)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(big_qword, big, 64)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(little_qword, little, 64)
+#endif
+
+#undef BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE
+
+#define BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(name, endiantype, bits) \
+ template <typename Modifiers> \
+ struct make_primitive<tag::name, Modifiers> \
+ : detail::basic_binary<detail::floating_point<bits>, \
+ boost::endian::endianness::endiantype, bits> {}; \
+ \
+ template <typename Modifiers, typename A0> \
+ struct make_primitive<terminal_ex<tag::name, fusion::vector1<A0> > \
+ , Modifiers> \
+ : detail::basic_binary_literal<Modifiers, detail::floating_point<bits> \
+ , boost::endian::endianness::endiantype, bits> {}; \
+ \
+ /***/
+
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(bin_float, native, 32)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(big_bin_float, big, 32)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(little_bin_float, little, 32)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(bin_double, native, 64)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(big_bin_double, big, 64)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(little_bin_double, little, 64)
+
+#undef BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/binary/padding.hpp b/boost/spirit/home/karma/binary/padding.hpp
new file mode 100644
index 0000000000..c5b375cbad
--- /dev/null
+++ b/boost/spirit/home/karma/binary/padding.hpp
@@ -0,0 +1,115 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_PADDING_MAY_06_2008_0436PM)
+#define BOOST_SPIRIT_KARMA_PADDING_MAY_06_2008_0436PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables pad(...)
+ template <typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::pad, fusion::vector1<A0> > >
+ : mpl::true_ {};
+
+ // enables lazy pad(...)
+ template <>
+ struct use_lazy_terminal<karma::domain, tag::pad, 1>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using boost::spirit::pad;
+#endif
+ using boost::spirit::pad_type;
+
+ struct binary_padding_generator
+ : primitive_generator<binary_padding_generator>
+ {
+ typedef mpl::int_<generator_properties::tracking> properties;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ binary_padding_generator(int numpadbytes)
+ : numpadbytes_(numpadbytes)
+ {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , Attribute const& /*attr*/) const
+ {
+ std::size_t count = sink.get_out_count() % numpadbytes_;
+ if (count)
+ count = numpadbytes_ - count;
+
+ bool result = true;
+ while (result && count-- != 0)
+ result = detail::generate_to(sink, '\0');
+
+ if (result)
+ result = karma::delimit_out(sink, d); // always do post-delimiting
+ return result;
+ }
+
+ template <typename Context>
+ static info what(Context const&)
+ {
+ return info("pad");
+ }
+
+ int numpadbytes_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::pad, fusion::vector1<A0> >
+ , Modifiers>
+ {
+ typedef binary_padding_generator result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/char.hpp b/boost/spirit/home/karma/char.hpp
new file mode 100644
index 0000000000..dd82b7f319
--- /dev/null
+++ b/boost/spirit/home/karma/char.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_CHAR_FEB_21_2007_0547PM)
+#define BOOST_SPIRIT_KARMA_CHAR_FEB_21_2007_0547PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/char/char.hpp>
+#include <boost/spirit/home/karma/char/char_class.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/char/char.hpp b/boost/spirit/home/karma/char/char.hpp
new file mode 100644
index 0000000000..de26cf476f
--- /dev/null
+++ b/boost/spirit/home/karma/char/char.hpp
@@ -0,0 +1,547 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// 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)
+
+#if !defined(BOOST_SPIRIT_KARMA_CHAR_FEB_21_2007_0543PM)
+#define BOOST_SPIRIT_KARMA_CHAR_FEB_21_2007_0543PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/support/char_set/basic_chset.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/char/char_generator.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/spirit/home/karma/detail/enable_lit.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <string>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct use_terminal<karma::domain
+ , tag::char_code<tag::char_, CharEncoding> // enables char_
+ > : mpl::true_ {};
+
+ template <typename CharEncoding, typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<
+ tag::char_code<tag::char_, CharEncoding> // enables char_('x'), char_("x")
+ , fusion::vector1<A0>
+ >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> > // enables lit('x')
+ , typename enable_if<traits::is_char<A0> >::type>
+ : mpl::true_ {};
+
+ template <typename CharEncoding, typename A0, typename A1>
+ struct use_terminal<karma::domain
+ , terminal_ex<
+ tag::char_code<tag::char_, CharEncoding> // enables char_('a','z')
+ , fusion::vector2<A0, A1>
+ >
+ > : mpl::true_ {};
+
+ template <typename CharEncoding> // enables *lazy* char_('x'), char_("x")
+ struct use_lazy_terminal<
+ karma::domain
+ , tag::char_code<tag::char_, CharEncoding>
+ , 1 // arity
+ > : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, char> // enables 'x'
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, char[2]> // enables "x"
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, wchar_t> // enables L'x'
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, wchar_t[2]> // enables L"x"
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::lit; // lit('x') is equivalent to 'x'
+#endif
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // any_char
+ // generates a single character from the associated attribute
+ //
+ // Note: this generator has to have an associated attribute
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag>
+ struct any_char
+ : char_generator<any_char<CharEncoding, Tag>, CharEncoding, Tag>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef char_type type;
+ };
+
+ // any_char has an attached parameter
+ template <typename Attribute, typename CharParam, typename Context>
+ bool test(Attribute const& attr, CharParam& ch, Context&) const
+ {
+ ch = CharParam(attr);
+ return true;
+ }
+
+ // any_char has no attribute attached, it needs to have been
+ // initialized from a direct literal
+ template <typename CharParam, typename Context>
+ bool test(unused_type, CharParam&, Context&) const
+ {
+ // It is not possible (doesn't make sense) to use char_ without
+ // providing any attribute, as the generator doesn't 'know' what
+ // character to output. The following assertion fires if this
+ // situation is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false, char_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("any-char");
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // literal_char
+ // generates a single character given by a literal it was initialized
+ // from
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag, bool no_attribute>
+ struct literal_char
+ : char_generator<literal_char<CharEncoding, Tag, no_attribute>
+ , CharEncoding, Tag>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ literal_char(char_type ch)
+ : ch (spirit::char_class::convert<char_encoding>::to(Tag(), ch))
+ {}
+
+ template <typename Context, typename Unused>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, char_type>
+ {};
+
+ // A char_('x') which additionally has an associated attribute emits
+ // its immediate literal only if it matches the attribute, otherwise
+ // it fails.
+ // any_char has an attached parameter
+ template <typename Attribute, typename CharParam, typename Context>
+ bool test(Attribute const& attr, CharParam& ch_, Context&) const
+ {
+ // fail if attribute isn't matched my immediate literal
+ ch_ = attr;
+ return attr == ch;
+ }
+
+ // A char_('x') without any associated attribute just emits its
+ // immediate literal
+ template <typename CharParam, typename Context>
+ bool test(unused_type, CharParam& ch_, Context&) const
+ {
+ ch_ = ch;
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context const& /*context*/) const
+ {
+ return info("literal-char", char_encoding::toucs4(ch));
+ }
+
+ char_type ch;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // char range generator
+ template <typename CharEncoding, typename Tag>
+ struct char_range
+ : char_generator<char_range<CharEncoding, Tag>, CharEncoding, Tag>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ char_range(char_type from, char_type to)
+ : from(spirit::char_class::convert<char_encoding>::to(Tag(), from))
+ , to(spirit::char_class::convert<char_encoding>::to(Tag(), to))
+ {}
+
+ // A char_('a', 'z') which has an associated attribute emits it only if
+ // it matches the character range, otherwise it fails.
+ template <typename Attribute, typename CharParam, typename Context>
+ bool test(Attribute const& attr, CharParam& ch, Context&) const
+ {
+ // fail if attribute doesn't belong to character range
+ ch = attr;
+ return (from <= char_type(attr)) && (char_type(attr) <= to);
+ }
+
+ // A char_('a', 'z') without any associated attribute fails compiling
+ template <typename CharParam, typename Context>
+ bool test(unused_type, CharParam&, Context&) const
+ {
+ // It is not possible (doesn't make sense) to use char_ generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false
+ , char_range_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ info result("char-range", char_encoding::toucs4(from));
+ boost::get<std::string>(result.value) += '-';
+ boost::get<std::string>(result.value) += to_utf8(char_encoding::toucs4(to));
+ return result;
+ }
+
+ char_type from, to;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // character set generator
+ template <typename CharEncoding, typename Tag, bool no_attribute>
+ struct char_set
+ : char_generator<char_set<CharEncoding, Tag, no_attribute>
+ , CharEncoding, Tag>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, char_type>
+ {};
+
+ template <typename String>
+ char_set(String const& str)
+ {
+ typedef typename traits::char_type_of<String>::type in_type;
+
+ BOOST_SPIRIT_ASSERT_MSG((
+ (sizeof(char_type) == sizeof(in_type))
+ ), cannot_convert_string, (String));
+
+ typedef spirit::char_class::convert<char_encoding> convert_type;
+
+ char_type const* definition =
+ (char_type const*)traits::get_c_string(str);
+ char_type ch = convert_type::to(Tag(), *definition++);
+ while (ch)
+ {
+ char_type next = convert_type::to(Tag(), *definition++);
+ if (next == '-')
+ {
+ next = convert_type::to(Tag(), *definition++);
+ if (next == 0)
+ {
+ chset.set(ch);
+ chset.set('-');
+ break;
+ }
+ chset.set(ch, next);
+ }
+ else
+ {
+ chset.set(ch);
+ }
+ ch = next;
+ }
+ }
+
+ // A char_("a-z") which has an associated attribute emits it only if
+ // it matches the character set, otherwise it fails.
+ template <typename Attribute, typename CharParam, typename Context>
+ bool test(Attribute const& attr, CharParam& ch, Context&) const
+ {
+ // fail if attribute doesn't belong to character set
+ ch = attr;
+ return chset.test(char_type(attr));
+ }
+
+ // A char_("a-z") without any associated attribute fails compiling
+ template <typename CharParam, typename Context>
+ bool test(unused_type, CharParam&, Context&) const
+ {
+ // It is not possible (doesn't make sense) to use char_ generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false
+ , char_set_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("char-set");
+ }
+
+ support::detail::basic_chset<char_type> chset;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Modifiers, typename Encoding>
+ struct basic_literal
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_char<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers, Encoding, lower || upper>::type
+ , typename get_casetag<Modifiers, lower || upper>::type
+ , true>
+ result_type;
+
+ template <typename Char>
+ result_type operator()(Char ch, unused_type) const
+ {
+ return result_type(ch);
+ }
+
+ template <typename Char>
+ result_type operator()(Char const* str, unused_type) const
+ {
+ return result_type(str[0]);
+ }
+ };
+ }
+
+ // literals: 'x', "x"
+ template <typename Modifiers>
+ struct make_primitive<char, Modifiers>
+ : detail::basic_literal<Modifiers, char_encoding::standard> {};
+
+ template <typename Modifiers>
+ struct make_primitive<char const(&)[2], Modifiers>
+ : detail::basic_literal<Modifiers, char_encoding::standard> {};
+
+ // literals: L'x', L"x"
+ template <typename Modifiers>
+ struct make_primitive<wchar_t, Modifiers>
+ : detail::basic_literal<Modifiers, char_encoding::standard_wide> {};
+
+ template <typename Modifiers>
+ struct make_primitive<wchar_t const(&)[2], Modifiers>
+ : detail::basic_literal<Modifiers, char_encoding::standard_wide> {};
+
+ // char_
+ template <typename CharEncoding, typename Modifiers>
+ struct make_primitive<tag::char_code<tag::char_, CharEncoding>, Modifiers>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef any_char<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers, CharEncoding, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ > result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename CharEncoding, typename Modifiers, typename A0
+ , bool no_attribute>
+ struct make_char_direct
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef typename spirit::detail::get_encoding_with_case<
+ Modifiers, CharEncoding, lower || upper>::type encoding;
+ typedef typename detail::get_casetag<
+ Modifiers, lower || upper>::type tag;
+
+ typedef typename mpl::if_<
+ traits::is_string<A0>
+ , char_set<encoding, tag, no_attribute>
+ , literal_char<encoding, tag, no_attribute>
+ >::type result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+ }
+
+ // char_(...), lit(...)
+ template <typename CharEncoding, typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector1<A0> >
+ , Modifiers>
+ : detail::make_char_direct<CharEncoding, Modifiers, A0, false>
+ {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers
+ , typename enable_if<traits::is_char<A0> >::type>
+ : detail::make_char_direct<
+ typename traits::char_encoding_from_char<
+ typename traits::char_type_of<A0>::type>::type
+ , Modifiers, A0, true>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // char_("x")
+ template <typename CharEncoding, typename Modifiers, typename Char>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector1<Char(&)[2]> > // For single char strings
+ , Modifiers>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_char<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers, CharEncoding, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , false
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args)[0]);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // char_('a', 'z')
+ template <typename CharEncoding, typename Modifiers, typename A0, typename A1>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector2<A0, A1>
+ >
+ , Modifiers>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef char_range<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers, CharEncoding, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args));
+ }
+ };
+
+ template <typename CharEncoding, typename Modifiers, typename Char>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector2<Char(&)[2], Char(&)[2]> // For single char strings
+ >
+ , Modifiers>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef char_range<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers, CharEncoding, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args)[0]
+ , fusion::at_c<1>(term.args)[0]);
+ }
+ };
+}}} // namespace boost::spirit::karma
+
+#endif
diff --git a/boost/spirit/home/karma/char/char_class.hpp b/boost/spirit/home/karma/char/char_class.hpp
new file mode 100644
index 0000000000..f3c7ab1821
--- /dev/null
+++ b/boost/spirit/home/karma/char/char_class.hpp
@@ -0,0 +1,226 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_CHAR_CLASS_AUG_10_2009_0720AM)
+#define BOOST_SPIRIT_KARMA_CHAR_CLASS_AUG_10_2009_0720AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/char/char_generator.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ // enables alnum, alpha, graph, etc.
+ template <typename CharClass, typename CharEncoding>
+ struct use_terminal<karma::domain
+ , tag::char_code<CharClass, CharEncoding> >
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ // hoist the char classification namespaces into karma sub-namespaces of
+ // the same name
+ namespace ascii { using namespace boost::spirit::ascii; }
+ namespace iso8859_1 { using namespace boost::spirit::iso8859_1; }
+ namespace standard { using namespace boost::spirit::standard; }
+ namespace standard_wide { using namespace boost::spirit::standard_wide; }
+#if defined(BOOST_SPIRIT_UNICODE)
+ namespace unicode { using namespace boost::spirit::unicode; }
+#endif
+
+ // Import the standard namespace into the karma namespace. This allows
+ // for default handling of all character/string related operations if not
+ // prefixed with a character set namespace.
+ using namespace boost::spirit::standard;
+
+ // Import encoding
+ using spirit::encoding;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // char_class
+ // generates a single character if it matches the given character
+ // class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Tag, typename CharEncoding, typename CharClass>
+ struct char_class
+ : char_generator<
+ char_class<Tag, CharEncoding, CharClass>
+ , CharEncoding, CharClass>
+ {
+ typedef typename Tag::char_encoding char_encoding;
+ typedef typename char_encoding::char_type char_type;
+ typedef typename Tag::char_class classification;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef char_type type;
+ };
+
+ // char_class needs an attached attribute
+ template <typename Attribute, typename CharParam, typename Context>
+ bool test(Attribute const& attr, CharParam& ch, Context&) const
+ {
+ ch = attr;
+
+ using spirit::char_class::classify;
+ return classify<char_encoding>::is(classification(), attr);
+ }
+
+ // char_class shouldn't be used without any associated attribute
+ template <typename CharParam, typename Context>
+ bool test(unused_type, CharParam&, Context&) const
+ {
+ // It is not possible (doesn't make sense) to use char_ generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false
+ , char_class_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ typedef spirit::char_class::what<char_encoding> what_;
+ return info(what_::is(classification()));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // space
+ // generates a single character from the associated parameter
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct any_space
+ : char_generator<any_space<CharEncoding>, CharEncoding, tag::space>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef char_type type;
+ };
+
+ // any_space has an attached parameter
+ template <typename Attribute, typename CharParam, typename Context>
+ bool test(Attribute const& attr, CharParam& ch, Context&) const
+ {
+ ch = CharParam(attr);
+
+ using spirit::char_class::classify;
+ return classify<char_encoding>::is(tag::space(), attr);
+ }
+
+ // any_space has no attribute attached, use single space character
+ template <typename CharParam, typename Context>
+ bool test(unused_type, CharParam& ch, Context&) const
+ {
+ ch = ' ';
+ return true;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("space");
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ namespace detail
+ {
+ template <typename Tag, bool lower = false, bool upper = false>
+ struct make_char_class : mpl::identity<Tag> {};
+
+ template <>
+ struct make_char_class<tag::alpha, true, false>
+ : mpl::identity<tag::lower> {};
+
+ template <>
+ struct make_char_class<tag::alpha, false, true>
+ : mpl::identity<tag::upper> {};
+
+ template <>
+ struct make_char_class<tag::alnum, true, false>
+ : mpl::identity<tag::lowernum> {};
+
+ template <>
+ struct make_char_class<tag::alnum, false, true>
+ : mpl::identity<tag::uppernum> {};
+ }
+
+ // enables alnum, alpha, graph, etc.
+ template <typename CharClass, typename CharEncoding, typename Modifiers>
+ struct make_primitive<tag::char_code<CharClass, CharEncoding>, Modifiers>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef tag::char_code<
+ typename detail::make_char_class<CharClass, lower, upper>::type
+ , CharEncoding>
+ tag_type;
+
+ typedef char_class<
+ tag_type
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, CharEncoding, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ > result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ // space is special
+ template <typename CharEncoding, typename Modifiers>
+ struct make_primitive<tag::char_code<tag::space, CharEncoding>, Modifiers>
+ {
+ typedef any_space<CharEncoding> result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+}}} // namespace boost::spirit::karma
+
+#endif // !defined(BOOST_SPIRIT_KARMA_CHAR_FEB_21_2007_0543PM)
diff --git a/boost/spirit/home/karma/char/char_generator.hpp b/boost/spirit/home/karma/char/char_generator.hpp
new file mode 100644
index 0000000000..cabd9f939d
--- /dev/null
+++ b/boost/spirit/home/karma/char/char_generator.hpp
@@ -0,0 +1,168 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_CHAR_GENERATOR_SEP_07_2009_0417PM)
+#define BOOST_SPIRIT_CHAR_GENERATOR_SEP_07_2009_0417PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/container.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::complement> // enables ~
+ : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace traits // classification
+{
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(char_generator_id)
+ }
+
+ template <typename T>
+ struct is_char_generator : detail::has_char_generator_id<T> {};
+}}}
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The base char_parser
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Derived, typename CharEncoding, typename Tag
+ , typename Char = typename CharEncoding::char_type, typename Attr = Char>
+ struct char_generator : primitive_generator<Derived>
+ {
+ typedef CharEncoding char_encoding;
+ typedef Tag tag;
+ typedef Char char_type;
+ struct char_generator_id;
+
+ // if Attr is unused_type, Derived must supply its own attribute
+ // metafunction
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef Attr type;
+ };
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ if (!traits::has_optional_value(attr))
+ return false;
+
+ Attr ch = Attr();
+ if (!this->derived().test(traits::extract_from<Attr>(attr, context), ch, context))
+ return false;
+
+ return karma::detail::generate_to(sink, ch, char_encoding(), tag()) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // Requirement: g.test(attr, ch, context) -> bool
+ //
+ // attr: associated attribute
+ // ch: character to be generated (set by test())
+ // context: enclosing rule context
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // negated_char_generator handles ~cg expressions (cg is a char_generator)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Positive>
+ struct negated_char_generator
+ : char_generator<negated_char_generator<Positive>
+ , typename Positive::char_encoding, typename Positive::tag>
+ {
+ negated_char_generator(Positive const& positive)
+ : positive(positive) {}
+
+ template <typename Attribute, typename CharParam, typename Context>
+ bool test(Attribute const& attr, CharParam& ch, Context& context) const
+ {
+ return !positive.test(attr, ch, context);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("not", positive.what(context));
+ }
+
+ Positive positive;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Positive>
+ struct make_negated_char_generator
+ {
+ typedef negated_char_generator<Positive> result_type;
+ result_type operator()(Positive const& positive) const
+ {
+ return result_type(positive);
+ }
+ };
+
+ template <typename Positive>
+ struct make_negated_char_generator<negated_char_generator<Positive> >
+ {
+ typedef Positive result_type;
+ result_type operator()(negated_char_generator<Positive> const& ncg) const
+ {
+ return ncg.positive;
+ }
+ };
+ }
+
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::complement, Elements, Modifiers>
+ {
+ typedef typename
+ fusion::result_of::value_at_c<Elements, 0>::type
+ subject;
+
+ BOOST_SPIRIT_ASSERT_MSG((
+ traits::is_char_generator<subject>::value
+ ), subject_is_not_negatable, (subject));
+
+ typedef typename
+ detail::make_negated_char_generator<subject>::result_type
+ result_type;
+
+ result_type operator()(Elements const& elements, unused_type) const
+ {
+ return detail::make_negated_char_generator<subject>()(
+ fusion::at_c<0>(elements));
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/delimit_flag.hpp b/boost/spirit/home/karma/delimit_flag.hpp
new file mode 100644
index 0000000000..ccaf688bc5
--- /dev/null
+++ b/boost/spirit/home/karma/delimit_flag.hpp
@@ -0,0 +1,27 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DELIMIT_FLAG_DEC_02_2009_1201PM)
+#define BOOST_SPIRIT_KARMA_DELIMIT_FLAG_DEC_02_2009_1201PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/detail/scoped_enum_emulation.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_SCOPED_ENUM_START(delimit_flag)
+ {
+ predelimit, // force predelimiting in generate_delimited()
+ dont_predelimit // inhibit predelimiting in generate_delimited()
+ };
+ BOOST_SCOPED_ENUM_END
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/delimit_out.hpp b/boost/spirit/home/karma/delimit_out.hpp
new file mode 100644
index 0000000000..e72e219456
--- /dev/null
+++ b/boost/spirit/home/karma/delimit_out.hpp
@@ -0,0 +1,45 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DELIMIT_FEB_20_2007_1208PM)
+#define BOOST_SPIRIT_KARMA_DELIMIT_FEB_20_2007_1208PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/karma/detail/unused_delimiter.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Do delimiting. This is equivalent to p << d. The function is a
+ // no-op if spirit::unused is passed as the delimiter-generator.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Delimiter>
+ inline bool delimit_out(OutputIterator& sink, Delimiter const& d)
+ {
+ return d.generate(sink, unused, unused, unused);
+ }
+
+ template <typename OutputIterator>
+ inline bool delimit_out(OutputIterator&, unused_type)
+ {
+ return true;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Delimiter>
+ inline bool delimit_out(OutputIterator&
+ , detail::unused_delimiter<Delimiter> const&)
+ {
+ return true;
+ }
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/detail/alternative_function.hpp b/boost/spirit/home/karma/detail/alternative_function.hpp
new file mode 100644
index 0000000000..54906b256e
--- /dev/null
+++ b/boost/spirit/home/karma/detail/alternative_function.hpp
@@ -0,0 +1,250 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_ALTERNATIVE_MAR_01_2007_1124AM)
+#define SPIRIT_KARMA_ALTERNATIVE_MAR_01_2007_1124AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/directive/buffer.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/utree/utree_traits_fwd.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/detail/hold_any.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/variant.hpp>
+#include <boost/detail/workaround.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // execute a generator if the given Attribute type is compatible
+ ///////////////////////////////////////////////////////////////////////////
+
+ // this gets instantiated if the Attribute type is _not_ compatible with
+ // the generator
+ template <typename Component, typename Attribute, typename Expected
+ , typename Enable = void>
+ struct alternative_generate
+ {
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool
+ call(Component const&, OutputIterator&, Context&, Delimiter const&
+ , Attribute const&, bool& failed)
+ {
+ failed = true;
+ return false;
+ }
+ };
+
+ template <typename Component>
+ struct alternative_generate<Component, unused_type, unused_type>
+ {
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool
+ call(Component const& component, OutputIterator& sink, Context& ctx
+ , Delimiter const& d, unused_type, bool&)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ component; // suppresses warning: C4100: 'component' : unreferenced formal parameter
+#endif
+ // return true if any of the generators succeed
+ return component.generate(sink, ctx, d, unused);
+ }
+ };
+
+ // this gets instantiated if there is no Attribute given for the
+ // alternative generator
+ template <typename Component, typename Expected>
+ struct alternative_generate<Component, unused_type, Expected>
+ : alternative_generate<Component, unused_type, unused_type> {};
+
+ // this gets instantiated if the generator does not expect to receive an
+ // Attribute (the generator is self contained).
+ template <typename Component, typename Attribute>
+ struct alternative_generate<Component, Attribute, unused_type>
+ : alternative_generate<Component, unused_type, unused_type> {};
+
+ // this gets instantiated if the Attribute type is compatible to the
+ // generator
+ template <typename Component, typename Attribute, typename Expected>
+ struct alternative_generate<Component, Attribute, Expected
+ , typename enable_if<
+ traits::compute_compatible_component<Expected, Attribute, karma::domain> >::type>
+ {
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool
+ call(Component const& component, OutputIterator& sink
+ , Context& ctx, Delimiter const& d, Attribute const& attr, bool&)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ component; // suppresses warning: C4100: 'component' : unreferenced formal parameter
+#endif
+ return call(component, sink, ctx, d, attr
+ , spirit::traits::not_is_variant<Attribute, karma::domain>());
+ }
+
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool
+ call(Component const& component, OutputIterator& sink
+ , Context& ctx, Delimiter const& d, Attribute const& attr, mpl::true_)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ component; // suppresses warning: C4100: 'component' : unreferenced formal parameter
+#endif
+ return component.generate(sink, ctx, d, attr);
+ }
+
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool
+ call(Component const& component, OutputIterator& sink
+ , Context& ctx, Delimiter const& d, Attribute const& attr, mpl::false_)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ component; // suppresses warning: C4100: 'component' : unreferenced formal parameter
+#endif
+ typedef
+ traits::compute_compatible_component<Expected, Attribute, domain>
+ component_type;
+
+ // if we got passed an empty optional, just fail generation
+ if (!traits::has_optional_value(attr))
+ return false;
+
+ // make sure, the content of the passed variant matches our
+ // expectations
+ typename traits::optional_attribute<Attribute>::type attr_ =
+ traits::optional_value(attr);
+ if (!component_type::is_compatible(spirit::traits::which(attr_)))
+ return false;
+
+ // returns true if any of the generators succeed
+ typedef typename component_type::compatible_type compatible_type;
+ return component.generate(sink, ctx, d
+ , boost::get<compatible_type>(attr_));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // alternative_generate_function: a functor supplied to fusion::any which
+ // will be executed for every generator in a given alternative generator
+ // expression
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Context, typename Delimiter,
+ typename Attribute, typename Strict>
+ struct alternative_generate_function
+ {
+ alternative_generate_function(OutputIterator& sink_, Context& ctx_
+ , Delimiter const& d, Attribute const& attr_)
+ : sink(sink_), ctx(ctx_), delim(d), attr(attr_) {}
+
+ template <typename Component>
+ bool operator()(Component const& component)
+ {
+ typedef
+ typename traits::attribute_of<Component, Context>::type
+ expected_type;
+ typedef
+ alternative_generate<Component, Attribute, expected_type>
+ generate;
+
+ // wrap the given output iterator avoid output as long as one
+ // component fails
+ detail::enable_buffering<OutputIterator> buffering(sink);
+ bool r = false;
+ bool failed = false; // will be ignored
+ {
+ detail::disable_counting<OutputIterator> nocounting(sink);
+ r = generate::call(component, sink, ctx, delim, attr, failed);
+ }
+ if (r)
+ buffering.buffer_copy();
+ return r;
+ }
+
+ // avoid double buffering
+ template <typename Component>
+ bool operator()(buffer_directive<Component> const& component)
+ {
+ typedef typename
+ traits::attribute_of<Component, Context>::type
+ expected_type;
+ typedef alternative_generate<
+ buffer_directive<Component>, Attribute, expected_type>
+ generate;
+
+ bool failed = false; // will be ignored
+ return generate::call(component, sink, ctx, delim, attr, failed);
+ }
+
+ OutputIterator& sink;
+ Context& ctx;
+ Delimiter const& delim;
+ Attribute const& attr;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ alternative_generate_function& operator= (alternative_generate_function const&);
+ };
+
+ // specialization for strict alternatives
+ template <typename OutputIterator, typename Context, typename Delimiter,
+ typename Attribute>
+ struct alternative_generate_function<
+ OutputIterator, Context, Delimiter, Attribute, mpl::true_>
+ {
+ alternative_generate_function(OutputIterator& sink_, Context& ctx_
+ , Delimiter const& d, Attribute const& attr_)
+ : sink(sink_), ctx(ctx_), delim(d), attr(attr_), failed(false) {}
+
+ template <typename Component>
+ bool operator()(Component const& component)
+ {
+ typedef
+ typename traits::attribute_of<Component, Context>::type
+ expected_type;
+ typedef
+ alternative_generate<Component, Attribute, expected_type>
+ generate;
+
+ if (failed)
+ return false; // give up when already failed
+
+ // wrap the given output iterator avoid output as long as one
+ // component fails
+ detail::enable_buffering<OutputIterator> buffering(sink);
+ bool r = false;
+ {
+ detail::disable_counting<OutputIterator> nocounting(sink);
+ r = generate::call(component, sink, ctx, delim, attr, failed);
+ }
+ if (r && !failed)
+ {
+ buffering.buffer_copy();
+ return true;
+ }
+ return false;
+ }
+
+ OutputIterator& sink;
+ Context& ctx;
+ Delimiter const& delim;
+ Attribute const& attr;
+ bool failed;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ alternative_generate_function& operator= (alternative_generate_function const&);
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/as.hpp b/boost/spirit/home/karma/detail/as.hpp
new file mode 100644
index 0000000000..e9dbd8e78b
--- /dev/null
+++ b/boost/spirit/home/karma/detail/as.hpp
@@ -0,0 +1,74 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_AS_STRING_DEC_18_0644PM)
+#define BOOST_SPIRIT_KARMA_AS_STRING_DEC_18_0644PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This file contains the attribute to string conversion utility. The
+ // utility provided also accept spirit's unused_type; all no-ops. Compiler
+ // optimization will easily strip these away.
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Attribute>
+ inline typename spirit::result_of::attribute_as<T, Attribute>::type
+ as(Attribute const& attr)
+ {
+ return attribute_as<T, Attribute>::call(attr);
+ }
+
+ template <typename T>
+ inline unused_type as(unused_type)
+ {
+ return unused;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Attribute>
+ inline bool valid_as(Attribute const& attr)
+ {
+ return attribute_as<T, Attribute>::is_valid(attr);
+ }
+
+ template <typename T>
+ inline bool valid_as(unused_type)
+ {
+ return true;
+ }
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace result_of
+{
+ template <typename T, typename Attribute>
+ struct attribute_as
+ : traits::attribute_as<T, Attribute>
+ {};
+
+ template <typename T>
+ struct attribute_as<T, unused_type>
+ {
+ typedef unused_type type;
+ };
+
+ template <typename T>
+ struct attribute_as<T, unused_type const>
+ {
+ typedef unused_type type;
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/attributes.hpp b/boost/spirit/home/karma/detail/attributes.hpp
new file mode 100644
index 0000000000..c63faace37
--- /dev/null
+++ b/boost/spirit/home/karma/detail/attributes.hpp
@@ -0,0 +1,108 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_DETAIL_ATTRIBUTES_APR_18_2010_0453PM)
+#define SPIRIT_KARMA_DETAIL_ATTRIBUTES_APR_18_2010_0453PM
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Exposed, typename Transformed, typename Enable = void>
+ struct transform_attribute
+ {
+ typedef Transformed type;
+ static Transformed pre(Exposed& val)
+ {
+ return Transformed(traits::extract_from<Transformed>(val, unused));
+ }
+ // Karma only, no post() and no fail() required
+ };
+
+ template <typename Exposed, typename Transformed>
+ struct transform_attribute<boost::optional<Exposed> const, Transformed
+ , typename disable_if<is_same<boost::optional<Exposed>, Transformed> >::type>
+ {
+ typedef Transformed const& type;
+ static Transformed const& pre(boost::optional<Exposed> const& val)
+ {
+ return boost::get<Transformed>(val);
+ }
+ };
+
+ template <typename Attribute>
+ struct transform_attribute<Attribute const, Attribute>
+ {
+ typedef Attribute const& type;
+ static Attribute const& pre(Attribute const& val) { return val; }
+ // Karma only, no post() and no fail() required
+ };
+
+ // reference types need special handling
+ template <typename Exposed, typename Transformed>
+ struct transform_attribute<Exposed&, Transformed>
+ : transform_attribute<Exposed, Transformed>
+ {};
+
+ template <typename Exposed, typename Transformed>
+ struct transform_attribute<Exposed const&, Transformed>
+ : transform_attribute<Exposed const, Transformed>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<Attribute const&, Attribute>
+ : transform_attribute<Attribute const, Attribute>
+ {};
+
+ // unused_type needs some special handling as well
+ template <>
+ struct transform_attribute<unused_type, unused_type>
+ {
+ typedef unused_type type;
+ static unused_type pre(unused_type) { return unused; }
+ };
+
+ template <>
+ struct transform_attribute<unused_type const, unused_type>
+ : transform_attribute<unused_type, unused_type>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<unused_type, Attribute>
+ : transform_attribute<unused_type, unused_type>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<unused_type const, Attribute>
+ : transform_attribute<unused_type, unused_type>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<Attribute, unused_type>
+ : transform_attribute<unused_type, unused_type>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<Attribute const, unused_type>
+ : transform_attribute<unused_type, unused_type>
+ {};
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Exposed, typename Transformed>
+ struct transform_attribute<Exposed, Transformed, karma::domain>
+ : karma::transform_attribute<Exposed, Transformed>
+ {};
+}}}
+
+#endif
+
+
diff --git a/boost/spirit/home/karma/detail/default_width.hpp b/boost/spirit/home/karma/detail/default_width.hpp
new file mode 100644
index 0000000000..52f5583d6f
--- /dev/null
+++ b/boost/spirit/home/karma/detail/default_width.hpp
@@ -0,0 +1,75 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DEFAULT_WIDTH_APR_07_2009_0912PM)
+#define BOOST_SPIRIT_KARMA_DEFAULT_WIDTH_APR_07_2009_0912PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The BOOST_KARMA_DEFAULT_FIELD_LENGTH specifies the default field length
+// to be used for padding.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_KARMA_DEFAULT_FIELD_LENGTH)
+#define BOOST_KARMA_DEFAULT_FIELD_LENGTH 10
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The BOOST_KARMA_DEFAULT_FIELD_MAXWIDTH specifies the default maximal field
+// length to be used for the maxwidth directive.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_KARMA_DEFAULT_FIELD_MAXWIDTH)
+#define BOOST_KARMA_DEFAULT_FIELD_MAXWIDTH 10
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The BOOST_KARMA_DEFAULT_COLUMNS specifies the default number of columns to
+// be used with the columns directive.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_KARMA_DEFAULT_COLUMNS)
+#define BOOST_KARMA_DEFAULT_COLUMNS 5
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ struct default_width
+ {
+ operator int() const
+ {
+ return BOOST_KARMA_DEFAULT_FIELD_LENGTH;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ struct default_max_width
+ {
+ operator int() const
+ {
+ return BOOST_KARMA_DEFAULT_FIELD_MAXWIDTH;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ struct default_columns
+ {
+ operator int() const
+ {
+ return BOOST_KARMA_DEFAULT_COLUMNS;
+ }
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/enable_lit.hpp b/boost/spirit/home/karma/detail/enable_lit.hpp
new file mode 100644
index 0000000000..2153582dce
--- /dev/null
+++ b/boost/spirit/home/karma/detail/enable_lit.hpp
@@ -0,0 +1,30 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DETAIL_ENABLE_LIT_JAN_06_2011_1009PM)
+#define BOOST_SPIRIT_KARMA_DETAIL_ENABLE_LIT_JAN_06_2011_1009PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+ // enables lazy lit(...) for karma
+ template <>
+ struct use_lazy_terminal<karma::domain, tag::lit, 1>
+ : mpl::true_ {};
+}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/detail/extract_from.hpp b/boost/spirit/home/karma/detail/extract_from.hpp
new file mode 100644
index 0000000000..558d056352
--- /dev/null
+++ b/boost/spirit/home/karma/detail/extract_from.hpp
@@ -0,0 +1,274 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_EXTRACT_FROM_SEP_30_2009_0732AM)
+#define BOOST_SPIRIT_KARMA_EXTRACT_FROM_SEP_30_2009_0732AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/container.hpp>
+
+#include <boost/ref.hpp>
+#include <boost/optional.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This file contains attribute extraction utilities. The utilities
+ // provided also accept spirit's unused_type; all no-ops. Compiler
+ // optimization will easily strip these away.
+ ///////////////////////////////////////////////////////////////////////////
+
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // extract first and second element of a fusion sequence
+ template <typename T>
+ struct add_const_ref
+ : add_reference<typename add_const<T>::type>
+ {};
+
+ template <typename T, int N>
+ struct value_at_c
+ : add_const_ref<typename fusion::result_of::value_at_c<T, N>::type>
+ {};
+ }
+
+ // This is the default case: the plain attribute values
+ template <typename Attribute, typename Exposed, typename Enable/*= void*/>
+ struct extract_from_attribute
+ {
+ typedef typename traits::one_element_sequence<Attribute>::type
+ is_one_element_sequence;
+
+ typedef typename mpl::eval_if<
+ is_one_element_sequence
+ , detail::value_at_c<Attribute, 0>
+ , mpl::identity<Attribute const&>
+ >::type type;
+
+ template <typename Context>
+ static type call(Attribute const& attr, Context&, mpl::false_)
+ {
+ return attr;
+ }
+
+ // This handles the case where the attribute is a single element fusion
+ // sequence. We silently extract the only element and treat it as the
+ // attribute to generate output from.
+ template <typename Context>
+ static type call(Attribute const& attr, Context& ctx, mpl::true_)
+ {
+ return extract_from<Exposed>(fusion::at_c<0>(attr), ctx);
+ }
+
+ template <typename Context>
+ static type call(Attribute const& attr, Context& ctx)
+ {
+ return call(attr, ctx, is_one_element_sequence());
+ }
+ };
+
+ // This handles optional attributes.
+ template <typename Attribute, typename Exposed>
+ struct extract_from_attribute<boost::optional<Attribute>, Exposed>
+ {
+ typedef Attribute const& type;
+
+ template <typename Context>
+ static type call(boost::optional<Attribute> const& attr, Context& ctx)
+ {
+ return extract_from<Exposed>(boost::get<Attribute>(attr), ctx);
+ }
+ };
+
+ template <typename Attribute, typename Exposed>
+ struct extract_from_attribute<boost::optional<Attribute const>, Exposed>
+ {
+ typedef Attribute const& type;
+
+ template <typename Context>
+ static type call(boost::optional<Attribute const> const& attr, Context& ctx)
+ {
+ return extract_from<Exposed>(boost::get<Attribute const>(attr), ctx);
+ }
+ };
+
+ // This handles attributes wrapped inside a boost::ref().
+ template <typename Attribute, typename Exposed>
+ struct extract_from_attribute<reference_wrapper<Attribute>, Exposed>
+ {
+ typedef Attribute const& type;
+
+ template <typename Context>
+ static type call(reference_wrapper<Attribute> const& attr, Context& ctx)
+ {
+ return extract_from<Exposed>(attr.get(), ctx);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Exposed, typename Enable>
+ struct extract_from_container
+ {
+ typedef typename traits::container_value<Attribute const>::type
+ value_type;
+ typedef typename is_convertible<value_type, Exposed>::type
+ is_convertible_to_value_type;
+
+ typedef typename mpl::if_<
+ mpl::or_<
+ is_same<value_type, Exposed>, is_same<Attribute, Exposed> >
+ , Exposed const&, Exposed
+ >::type type;
+
+ // handle case where container value type is convertible to result type
+ // we simply return the front element of the container
+ template <typename Context, typename Pred>
+ static type call(Attribute const& attr, Context&, mpl::true_, Pred)
+ {
+ // return first element from container
+ typedef typename traits::container_iterator<Attribute const>::type
+ iterator_type;
+
+ iterator_type it = traits::begin(attr);
+ type result = *it;
+ ++it;
+ return result;
+ }
+
+ // handle strings
+ template <typename Iterator>
+ static void append_to_string(Exposed& result, Iterator begin, Iterator end)
+ {
+ for (Iterator i = begin; i != end; ++i)
+ push_back(result, *i);
+ }
+
+ template <typename Context>
+ static type call(Attribute const& attr, Context&, mpl::false_, mpl::true_)
+ {
+ typedef typename char_type_of<Attribute>::type char_type;
+
+ Exposed result;
+ append_to_string(result, traits::get_begin<char_type>(attr)
+ , traits::get_end<char_type>(attr));
+ return result;
+ }
+
+ // everything else gets just passed through
+ template <typename Context>
+ static type call(Attribute const& attr, Context&, mpl::false_, mpl::false_)
+ {
+ return type(attr);
+ }
+
+ template <typename Context>
+ static type call(Attribute const& attr, Context& ctx)
+ {
+ typedef typename mpl::and_<
+ traits::is_string<Exposed>, traits::is_string<Attribute>
+ >::type handle_strings;
+
+ // return first element from container
+ return call(attr, ctx, is_convertible_to_value_type()
+ , handle_strings());
+ }
+ };
+
+ template <typename Attribute>
+ struct extract_from_container<Attribute, Attribute>
+ {
+ typedef Attribute const& type;
+
+ template <typename Context>
+ static type call(Attribute const& attr, Context&)
+ {
+ return attr;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ // overload for non-container attributes
+ template <typename Exposed, typename Attribute, typename Context>
+ inline typename spirit::result_of::extract_from<Exposed, Attribute>::type
+ extract_from(Attribute const& attr, Context& ctx, mpl::false_)
+ {
+ return extract_from_attribute<Attribute, Exposed>::call(attr, ctx);
+ }
+
+ // overload for containers (but not for variants or optionals
+ // holding containers)
+ template <typename Exposed, typename Attribute, typename Context>
+ inline typename spirit::result_of::extract_from<Exposed, Attribute>::type
+ extract_from(Attribute const& attr, Context& ctx, mpl::true_)
+ {
+ return extract_from_container<Attribute, Exposed>::call(attr, ctx);
+ }
+ }
+
+ template <typename Exposed, typename Attribute, typename Context>
+ inline typename spirit::result_of::extract_from<Exposed, Attribute>::type
+ extract_from(Attribute const& attr, Context& ctx
+#if (defined(__GNUC__) && (__GNUC__ < 4)) || \
+ (defined(__APPLE__) && defined(__INTEL_COMPILER))
+ , typename enable_if<traits::not_is_unused<Attribute> >::type*
+#endif
+ )
+ {
+ typedef typename mpl::and_<
+ traits::is_container<Attribute>
+ , traits::not_is_variant<Attribute>
+ , traits::not_is_optional<Attribute>
+ >::type is_not_wrapped_container;
+
+ return detail::extract_from<Exposed>(attr, ctx
+ , is_not_wrapped_container());
+ }
+
+ template <typename Exposed, typename Context>
+ inline unused_type extract_from(unused_type, Context&)
+ {
+ return unused;
+ }
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace result_of
+{
+ template <typename Exposed, typename Attribute>
+ struct extract_from
+ : mpl::if_<
+ mpl::and_<
+ traits::is_container<Attribute>
+ , traits::not_is_variant<Attribute>
+ , traits::not_is_optional<Attribute> >
+ , traits::extract_from_container<Attribute, Exposed>
+ , traits::extract_from_attribute<Attribute, Exposed> >::type
+ {};
+
+ template <typename Exposed>
+ struct extract_from<Exposed, unused_type>
+ {
+ typedef unused_type type;
+ };
+
+ template <typename Exposed>
+ struct extract_from<Exposed, unused_type const>
+ {
+ typedef unused_type type;
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/fail_function.hpp b/boost/spirit/home/karma/detail/fail_function.hpp
new file mode 100644
index 0000000000..5310d54329
--- /dev/null
+++ b/boost/spirit/home/karma/detail/fail_function.hpp
@@ -0,0 +1,60 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_SEQUENCE_FEB_28_2007_0249PM)
+#define SPIRIT_KARMA_SEQUENCE_FEB_28_2007_0249PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/config.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ struct fail_function
+ {
+ typedef Context context_type;
+
+ fail_function(OutputIterator& sink_, Context& context_
+ , Delimiter const& delim_)
+ : sink(sink_), ctx(context_), delim(delim_)
+ {}
+
+ template <typename Component, typename Attribute>
+ bool operator()(Component const& component, Attribute const& attr) const
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ component; // suppresses warning: C4100: 'component' : unreferenced formal parameter
+#endif
+ // return true if any of the generators fail
+ return !component.generate(sink, ctx, delim, attr);
+ }
+
+ template <typename Component>
+ bool operator()(Component const& component) const
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ component; // suppresses warning: C4100: 'component' : unreferenced formal parameter
+#endif
+ // return true if any of the generators fail
+ return !component.generate(sink, ctx, delim, unused);
+ }
+
+ OutputIterator& sink;
+ Context& ctx;
+ Delimiter const& delim;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ fail_function& operator= (fail_function const&);
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/generate.hpp b/boost/spirit/home/karma/detail/generate.hpp
new file mode 100644
index 0000000000..7c8b9f4d7b
--- /dev/null
+++ b/boost/spirit/home/karma/detail/generate.hpp
@@ -0,0 +1,131 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DETAIL_GENERATE_FEB_20_2007_0959AM)
+#define BOOST_SPIRIT_KARMA_DETAIL_GENERATE_FEB_20_2007_0959AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/delimit_flag.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Enable = void>
+ struct generate_impl
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (Expr) is not a valid spirit karma expression.
+ // Did you intend to use the auto_ facilities while forgetting to
+ // #include <boost/spirit/include/karma_auto.hpp>?
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ };
+
+ template <typename Expr>
+ struct generate_impl<Expr
+ , typename enable_if<traits::matches<karma::domain, Expr> >::type>
+ {
+ template <typename OutputIterator>
+ static bool call(
+ OutputIterator& target_sink
+ , Expr const& expr)
+ {
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Expr>::type
+ > properties;
+
+ // wrap user supplied iterator into our own output iterator
+ output_iterator<OutputIterator
+ , mpl::int_<properties::value> > sink(target_sink);
+ return compile<karma::domain>(expr).
+ generate(sink, unused, unused, unused);
+ }
+
+ template <typename OutputIterator, typename Properties>
+ static bool call(
+ detail::output_iterator<OutputIterator, Properties>& sink
+ , Expr const& expr)
+ {
+ return compile<karma::domain>(expr).
+ generate(sink, unused, unused, unused);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Enable = void>
+ struct generate_delimited_impl
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (Expr) is not a valid spirit karma expression.
+ // Did you intend to use the auto_ facilities while forgetting to
+ // #include <boost/spirit/include/karma_auto.hpp>?
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ };
+
+ template <typename Expr>
+ struct generate_delimited_impl<Expr
+ , typename enable_if<traits::matches<karma::domain, Expr> >::type>
+ {
+ template <typename OutputIterator, typename Delimiter>
+ static bool call(
+ OutputIterator& target_sink
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit)
+ {
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Expr>::type
+ > properties;
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Delimiter>::type
+ > delimiter_properties;
+
+ // wrap user supplied iterator into our own output iterator
+ detail::output_iterator<OutputIterator
+ , mpl::int_<properties::value | delimiter_properties::value>
+ > sink(target_sink);
+ return call(sink, expr, delimiter, pre_delimit);
+ }
+
+ template <typename OutputIterator, typename Properties
+ , typename Delimiter>
+ static bool call(
+ detail::output_iterator<OutputIterator, Properties>& sink
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the delimiter is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
+
+ typename result_of::compile<karma::domain, Delimiter>::type const
+ delimiter_ = compile<karma::domain>(delimiter);
+
+ if (pre_delimit == delimit_flag::predelimit &&
+ !karma::delimit_out(sink, delimiter_))
+ {
+ return false;
+ }
+ return compile<karma::domain>(expr).
+ generate(sink, unused, delimiter_, unused);
+ }
+ };
+
+}}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/detail/generate_auto.hpp b/boost/spirit/home/karma/detail/generate_auto.hpp
new file mode 100644
index 0000000000..c11803f7d7
--- /dev/null
+++ b/boost/spirit/home/karma/detail/generate_auto.hpp
@@ -0,0 +1,63 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DETAIL_GENERATE_AUTO_DEC_01_2009_0743PM)
+#define BOOST_SPIRIT_KARMA_DETAIL_GENERATE_AUTO_DEC_01_2009_0743PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/generate.hpp>
+#include <boost/spirit/home/karma/auto/create_generator.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/and.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ struct generate_impl<Expr
+ , typename enable_if<
+ mpl::and_<
+ traits::meta_create_exists<karma::domain, Expr>
+ , mpl::not_<traits::matches<karma::domain, Expr> > >
+ >::type>
+ {
+ template <typename OutputIterator>
+ static bool call(
+ OutputIterator& sink
+ , Expr const& expr)
+ {
+ return karma::generate(sink, create_generator<Expr>(), expr);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ struct generate_delimited_impl<Expr
+ , typename enable_if<
+ mpl::and_<
+ traits::meta_create_exists<karma::domain, Expr>
+ , mpl::not_<traits::matches<karma::domain, Expr> > >
+ >::type>
+ {
+ template <typename OutputIterator, typename Delimiter>
+ static bool call(
+ OutputIterator& sink
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit)
+ {
+ return karma::generate_delimited(
+ sink, create_generator<Expr>(), delimiter, pre_delimit, expr);
+ }
+ };
+
+}}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/detail/generate_to.hpp b/boost/spirit/home/karma/detail/generate_to.hpp
new file mode 100644
index 0000000000..05c715713b
--- /dev/null
+++ b/boost/spirit/home/karma/detail/generate_to.hpp
@@ -0,0 +1,67 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DETAIL_GENERATE_TO_FEB_20_2007_0417PM)
+#define BOOST_SPIRIT_KARMA_DETAIL_GENERATE_TO_FEB_20_2007_0417PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // These utility functions insert the given parameter into the supplied
+ // output iterator.
+ // If the attribute is spirit's unused_type, this is a no_op.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename OutputIterator, typename Attribute, typename CharEncoding
+ , typename Tag>
+ inline bool
+ generate_to(OutputIterator& sink, Attribute const& p, CharEncoding, Tag)
+ {
+ *sink = spirit::char_class::convert<CharEncoding>::to(Tag(), p);
+ ++sink;
+ return detail::sink_is_good(sink);
+ }
+
+ template <typename OutputIterator, typename Attribute>
+ inline bool
+ generate_to(OutputIterator& sink, Attribute const& p, unused_type, unused_type)
+ {
+ *sink = p;
+ ++sink;
+ return detail::sink_is_good(sink);
+ }
+
+ template <typename OutputIterator, typename CharEncoding, typename Tag>
+ inline bool generate_to(OutputIterator&, unused_type, CharEncoding, Tag)
+ {
+ return true;
+ }
+
+ template <typename OutputIterator, typename Attribute>
+ inline bool
+ generate_to(OutputIterator& sink, Attribute const& p)
+ {
+ *sink = p;
+ ++sink;
+ return detail::sink_is_good(sink);
+ }
+
+ template <typename OutputIterator>
+ inline bool generate_to(OutputIterator&, unused_type)
+ {
+ return true;
+ }
+
+}}}} // namespace boost::spirit::karma::detail
+
+#endif // KARMA_CORE_DETAIL_INSERT_TO_HPP
diff --git a/boost/spirit/home/karma/detail/get_casetag.hpp b/boost/spirit/home/karma/detail/get_casetag.hpp
new file mode 100644
index 0000000000..1d5a464fa4
--- /dev/null
+++ b/boost/spirit/home/karma/detail/get_casetag.hpp
@@ -0,0 +1,29 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_KARMA_GET_CASETAG_JANUARY_19_2009_1107AM)
+#define BOOST_SPIRIT_KARMA_GET_CASETAG_JANUARY_19_2009_1107AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/identity.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ template <typename Modifiers, bool case_modifier = false>
+ struct get_casetag : mpl::identity<unused_type> {};
+
+ template <typename Modifiers>
+ struct get_casetag<Modifiers, true>
+ : mpl::if_<has_modifier<Modifiers, tag::char_code_base<tag::lower> >
+ , tag::lower, tag::upper> {};
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/get_stricttag.hpp b/boost/spirit/home/karma/detail/get_stricttag.hpp
new file mode 100644
index 0000000000..5f03c210a6
--- /dev/null
+++ b/boost/spirit/home/karma/detail/get_stricttag.hpp
@@ -0,0 +1,33 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_GET_STRICTTAG_APR_22_2010_1007AM)
+#define BOOST_SPIRIT_KARMA_GET_STRICTTAG_APR_22_2010_1007AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ // the default mode for Karma is 'relaxed'
+ template <
+ typename Modifiers
+ , typename StrictModifier = typename mpl::or_<
+ has_modifier<Modifiers, tag::strict>
+ , has_modifier<Modifiers, tag::relaxed> >::type>
+ struct get_stricttag : mpl::false_ {};
+
+ // strict mode is enforced only when tag::strict is on the modifiers list
+ template <typename Modifiers>
+ struct get_stricttag<Modifiers, mpl::true_>
+ : has_modifier<Modifiers, tag::strict> {};
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/indirect_iterator.hpp b/boost/spirit/home/karma/detail/indirect_iterator.hpp
new file mode 100644
index 0000000000..fdd12f3b49
--- /dev/null
+++ b/boost/spirit/home/karma/detail/indirect_iterator.hpp
@@ -0,0 +1,96 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM)
+#define SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////
+ // This is a wrapper for any iterator allowing to pass a reference of it
+ // to the components of the sequence
+ template <typename Iterator>
+ class indirect_iterator
+ : public boost::iterator_facade<
+ indirect_iterator<Iterator>
+ , typename boost::detail::iterator_traits<Iterator>::value_type
+ , boost::forward_traversal_tag
+ , typename boost::detail::iterator_traits<Iterator>::value_type const&>
+ {
+ typedef typename boost::detail::iterator_traits<Iterator>::value_type
+ base_value_type;
+
+ typedef boost::iterator_facade<
+ indirect_iterator<Iterator>, base_value_type
+ , boost::forward_traversal_tag, base_value_type const&
+ > base_type;
+
+ public:
+ indirect_iterator(Iterator& iter)
+ : iter_(&iter)
+ {}
+ indirect_iterator(indirect_iterator const& iter)
+ : iter_(iter.iter_)
+ {}
+
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment()
+ {
+ ++*iter_;
+ }
+
+ bool equal(indirect_iterator const& other) const
+ {
+ return *iter_ == *other.iter_;
+ }
+
+ typename base_type::reference dereference() const
+ {
+ return **iter_;
+ }
+
+ private:
+ Iterator* iter_;
+ };
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Iterator>
+ struct make_indirect_iterator
+ {
+ typedef karma::detail::indirect_iterator<Iterator> type;
+ };
+
+ template <typename Iterator>
+ struct make_indirect_iterator<karma::detail::indirect_iterator<Iterator> >
+ {
+ typedef karma::detail::indirect_iterator<Iterator> type;
+ };
+
+ template <>
+ struct make_indirect_iterator<unused_type const*>
+ {
+ typedef unused_type const* type;
+ };
+
+ template <typename Iterator>
+ struct make_indirect_iterator<Iterator const&>
+ : make_indirect_iterator<Iterator const>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/output_iterator.hpp b/boost/spirit/home/karma/detail/output_iterator.hpp
new file mode 100644
index 0000000000..34dc070f44
--- /dev/null
+++ b/boost/spirit/home/karma/detail/output_iterator.hpp
@@ -0,0 +1,616 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_OUTPUT_ITERATOR_MAY_26_2007_0506PM)
+#define BOOST_SPIRIT_KARMA_OUTPUT_ITERATOR_MAY_26_2007_0506PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <iterator>
+#include <vector>
+#include <algorithm>
+
+#include <boost/config.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/support/iterators/ostream_iterator.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This class is used to keep track of the current position in the output.
+ ///////////////////////////////////////////////////////////////////////////
+ class position_sink
+ {
+ public:
+ position_sink() : count(0), line(1), column(1) {}
+ void tidy() { count = 0; line = 1; column = 1; }
+
+ template <typename T>
+ void output(T const& value)
+ {
+ ++count;
+ if (value == '\n') {
+ ++line;
+ column = 1;
+ }
+ else {
+ ++column;
+ }
+ }
+ std::size_t get_count() const { return count; }
+ std::size_t get_line() const { return line; }
+ std::size_t get_column() const { return column; }
+
+ private:
+ std::size_t count;
+ std::size_t line;
+ std::size_t column;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ struct position_policy
+ {
+ position_policy() {}
+ position_policy(position_policy const& rhs)
+ : track_position_data(rhs.track_position_data) {}
+
+ template <typename T>
+ void output(T const& value)
+ {
+ // track position in the output
+ track_position_data.output(value);
+ }
+
+ // return the current count in the output
+ std::size_t get_out_count() const
+ {
+ return track_position_data.get_count();
+ }
+
+ private:
+ position_sink track_position_data; // for position tracking
+ };
+
+ struct no_position_policy
+ {
+ no_position_policy() {}
+ no_position_policy(no_position_policy const&) {}
+
+ template <typename T>
+ void output(T const& /*value*/) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This class is used to count the number of characters streamed into the
+ // output.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator>
+ class counting_sink : boost::noncopyable
+ {
+ public:
+ counting_sink(OutputIterator& sink_, std::size_t count_ = 0
+ , bool enabled = true)
+ : count(count_), initial_count(count), prev_count(0), sink(sink_)
+ {
+ prev_count = sink.chain_counting(enabled ? this : NULL);
+ }
+ ~counting_sink()
+ {
+ if (prev_count) // propagate count
+ prev_count->update_count(count-initial_count);
+ sink.chain_counting(prev_count);
+ }
+
+ void output()
+ {
+ ++count;
+ }
+ std::size_t get_count() const { return count; }
+
+ // propagate count from embedded counters
+ void update_count(std::size_t c)
+ {
+ count += c;
+ }
+
+ private:
+ std::size_t count;
+ std::size_t initial_count;
+ counting_sink* prev_count; // previous counter in chain
+ OutputIterator& sink;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator>
+ struct counting_policy
+ {
+ public:
+ counting_policy() : count(NULL) {}
+ counting_policy(counting_policy const& rhs) : count(rhs.count) {}
+
+ // functions related to counting
+ counting_sink<OutputIterator>* chain_counting(
+ counting_sink<OutputIterator>* count_data)
+ {
+ counting_sink<OutputIterator>* prev_count = count;
+ count = count_data;
+ return prev_count;
+ }
+
+ template <typename T>
+ void output(T const&)
+ {
+ // count characters, if appropriate
+ if (NULL != count)
+ count->output();
+ }
+
+ private:
+ counting_sink<OutputIterator>* count; // for counting
+ };
+
+ struct no_counting_policy
+ {
+ no_counting_policy() {}
+ no_counting_policy(no_counting_policy const&) {}
+
+ template <typename T>
+ void output(T const& /*value*/) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The following classes are used to intercept the output into a buffer
+ // allowing to do things like alignment, character escaping etc.
+ ///////////////////////////////////////////////////////////////////////////
+ class buffer_sink : boost::noncopyable
+ {
+ public:
+ buffer_sink()
+ : width(0) {}
+
+ ~buffer_sink()
+ {
+ tidy();
+ }
+
+ void enable(std::size_t width_)
+ {
+ tidy(); // release existing buffer
+ width = (width_ == std::size_t(-1)) ? 0 : width_;
+ buffer.reserve(width);
+ }
+
+ void tidy()
+ {
+ buffer.clear();
+ width = 0;
+ }
+
+ template <typename T>
+ void output(T const& value)
+ {
+ BOOST_STATIC_ASSERT(sizeof(T) <= sizeof(wchar_t));
+ buffer.push_back(value);
+ }
+
+ template <typename OutputIterator_>
+ bool copy(OutputIterator_& sink, std::size_t maxwidth) const
+ {
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable: 4267)
+#endif
+ typename std::basic_string<wchar_t>::const_iterator end =
+ buffer.begin() + (std::min)(buffer.size(), maxwidth);
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+ std::copy(buffer.begin(), end, sink);
+ return true;
+ }
+ template <typename RestIterator>
+ bool copy_rest(RestIterator& sink, std::size_t start_at) const
+ {
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable: 4267)
+#endif
+ typename std::basic_string<wchar_t>::const_iterator begin =
+ buffer.begin() + (std::min)(buffer.size(), start_at);
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+ std::copy(begin, buffer.end(), sink);
+ return true;
+ }
+
+ std::size_t buffer_size() const
+ {
+ return buffer.size();
+ }
+
+ private:
+ std::size_t width;
+ std::basic_string<wchar_t> buffer;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ struct buffering_policy
+ {
+ public:
+ buffering_policy() : buffer(NULL) {}
+ buffering_policy(buffering_policy const& rhs) : buffer(rhs.buffer) {}
+
+ // functions related to buffering
+ buffer_sink* chain_buffering(buffer_sink* buffer_data)
+ {
+ buffer_sink* prev_buffer = buffer;
+ buffer = buffer_data;
+ return prev_buffer;
+ }
+
+ template <typename T>
+ bool output(T const& value)
+ {
+ // buffer characters, if appropriate
+ if (NULL != buffer) {
+ buffer->output(value);
+ return false;
+ }
+ return true;
+ }
+
+ bool has_buffer() const { return NULL != buffer; }
+
+ private:
+ buffer_sink* buffer;
+ };
+
+ struct no_buffering_policy
+ {
+ no_buffering_policy() {}
+ no_buffering_policy(no_counting_policy const&) {}
+
+ template <typename T>
+ bool output(T const& /*value*/)
+ {
+ return true;
+ }
+
+ bool has_buffer() const { return false; }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // forward declaration only
+ template <typename OutputIterator>
+ struct enable_buffering;
+
+ template <typename OutputIterator, typename Properties
+ , typename Derived = unused_type>
+ class output_iterator;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Buffering, typename Counting, typename Tracking>
+ struct output_iterator_base : Buffering, Counting, Tracking
+ {
+ typedef Buffering buffering_policy;
+ typedef Counting counting_policy;
+ typedef Tracking tracking_policy;
+
+ output_iterator_base() {}
+ output_iterator_base(output_iterator_base const& rhs)
+ : buffering_policy(rhs), counting_policy(rhs), tracking_policy(rhs)
+ {}
+
+ template <typename T>
+ bool output(T const& value)
+ {
+ this->counting_policy::output(value);
+ this->tracking_policy::output(value);
+ return this->buffering_policy::output(value);
+ }
+ };
+
+ template <typename Buffering, typename Counting, typename Tracking>
+ struct disabling_output_iterator : Buffering, Counting, Tracking
+ {
+ typedef Buffering buffering_policy;
+ typedef Counting counting_policy;
+ typedef Tracking tracking_policy;
+
+ disabling_output_iterator() : do_output(true) {}
+ disabling_output_iterator(disabling_output_iterator const& rhs)
+ : buffering_policy(rhs), counting_policy(rhs), tracking_policy(rhs)
+ , do_output(rhs.do_output)
+ {}
+
+ template <typename T>
+ bool output(T const& value)
+ {
+ if (!do_output)
+ return false;
+
+ this->counting_policy::output(value);
+ this->tracking_policy::output(value);
+ return this->buffering_policy::output(value);
+ }
+
+ bool do_output;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Properties, typename Derived>
+ struct make_output_iterator
+ {
+ // get the most derived type of this class
+ typedef typename mpl::if_<
+ traits::not_is_unused<Derived>, Derived
+ , output_iterator<OutputIterator, Properties, Derived>
+ >::type most_derived_type;
+
+ enum { properties = Properties::value };
+
+ typedef typename mpl::if_c<
+ (properties & generator_properties::tracking) ? true : false
+ , position_policy, no_position_policy
+ >::type tracking_type;
+
+ typedef typename mpl::if_c<
+ (properties & generator_properties::buffering) ? true : false
+ , buffering_policy, no_buffering_policy
+ >::type buffering_type;
+
+ typedef typename mpl::if_c<
+ (properties & generator_properties::counting) ? true : false
+ , counting_policy<most_derived_type>, no_counting_policy
+ >::type counting_type;
+
+ typedef typename mpl::if_c<
+ (properties & generator_properties::disabling) ? true : false
+ , disabling_output_iterator<buffering_type, counting_type, tracking_type>
+ , output_iterator_base<buffering_type, counting_type, tracking_type>
+ >::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Karma uses an output iterator wrapper for all output operations. This
+ // is necessary to avoid the dreaded 'scanner business' problem, i.e. the
+ // dependency of rules and grammars on the used output iterator.
+ //
+ // By default the user supplied output iterator is wrapped inside an
+ // instance of this internal output_iterator class.
+ //
+ // This output_iterator class normally just forwards to the embedded user
+ // supplied iterator. But it is possible to enable additional functionality
+ // on demand, such as counting, buffering, and position tracking.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Properties, typename Derived>
+ class output_iterator
+ : public make_output_iterator<OutputIterator, Properties, Derived>::type
+ {
+ private:
+ // base iterator type
+ typedef typename make_output_iterator<
+ OutputIterator, Properties, Derived>::type base_iterator;
+
+ public:
+ typedef std::output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+ explicit output_iterator(OutputIterator& sink_)
+ : sink(&sink_)
+ {}
+ output_iterator(output_iterator const& rhs)
+ : base_iterator(rhs), sink(rhs.sink)
+ {}
+
+ output_iterator& operator*() { return *this; }
+ output_iterator& operator++()
+ {
+ if (!this->base_iterator::has_buffer())
+ ++(*sink); // increment only if not buffering
+ return *this;
+ }
+ output_iterator operator++(int)
+ {
+ if (!this->base_iterator::has_buffer()) {
+ output_iterator t(*this);
+ ++(*sink);
+ return t;
+ }
+ return *this;
+ }
+
+#if defined(BOOST_MSVC)
+// 'argument' : conversion from '...' to '...', possible loss of data
+#pragma warning (push)
+#pragma warning (disable: 4244)
+#endif
+ template <typename T>
+ void operator=(T const& value)
+ {
+ if (this->base_iterator::output(value))
+ *(*sink) = value;
+ }
+#if defined(BOOST_MSVC)
+#pragma warning (pop)
+#endif
+
+ // plain output iterators are considered to be good all the time
+ bool good() const { return true; }
+
+ protected:
+ // this is the wrapped user supplied output iterator
+ OutputIterator* sink;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Elem, typename Traits, typename Properties>
+ class output_iterator<karma::ostream_iterator<T, Elem, Traits>, Properties>
+ : public output_iterator<karma::ostream_iterator<T, Elem, Traits>, Properties
+ , output_iterator<karma::ostream_iterator<T, Elem, Traits>, Properties> >
+ {
+ private:
+ typedef output_iterator<karma::ostream_iterator<T, Elem, Traits>, Properties
+ , output_iterator<karma::ostream_iterator<T, Elem, Traits>, Properties>
+ > base_type;
+ typedef karma::ostream_iterator<T, Elem, Traits> base_iterator_type;
+ typedef std::basic_ostream<Elem, Traits> ostream_type;
+
+ public:
+ output_iterator(base_iterator_type& sink)
+ : base_type(sink) {}
+
+ ostream_type& get_ostream() { return (*this->sink).get_ostream(); }
+ ostream_type const& get_ostream() const { return (*this->sink).get_ostream(); }
+
+ // expose good bit of underlying stream object
+ bool good() const { return (*this->sink).get_ostream().good(); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Helper class for exception safe enabling of character counting in the
+ // output iterator
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator>
+ struct enable_counting
+ {
+ enable_counting(OutputIterator& sink_, std::size_t count = 0)
+ : count_data(sink_, count) {}
+
+ // get number of characters counted since last enable
+ std::size_t count() const
+ {
+ return count_data.get_count();
+ }
+
+ private:
+ counting_sink<OutputIterator> count_data; // for counting
+ };
+
+ template <typename OutputIterator>
+ struct disable_counting
+ {
+ disable_counting(OutputIterator& sink_)
+ : count_data(sink_, 0, false) {}
+
+ private:
+ counting_sink<OutputIterator> count_data;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Helper class for exception safe enabling of character buffering in the
+ // output iterator
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator>
+ struct enable_buffering
+ {
+ enable_buffering(OutputIterator& sink_
+ , std::size_t width = std::size_t(-1))
+ : sink(sink_), prev_buffer(NULL), enabled(false)
+ {
+ buffer_data.enable(width);
+ prev_buffer = sink.chain_buffering(&buffer_data);
+ enabled = true;
+ }
+ ~enable_buffering()
+ {
+ disable();
+ }
+
+ // reset buffer chain to initial state
+ void disable()
+ {
+ if (enabled) {
+ BOOST_VERIFY(&buffer_data == sink.chain_buffering(prev_buffer));
+ enabled = false;
+ }
+ }
+
+ // copy to the underlying sink whatever is in the local buffer
+ bool buffer_copy(std::size_t maxwidth = std::size_t(-1)
+ , bool disable_ = true)
+ {
+ if (disable_)
+ disable();
+ return buffer_data.copy(sink, maxwidth) && sink.good();
+ }
+
+ // return number of characters stored in the buffer
+ std::size_t buffer_size() const
+ {
+ return buffer_data.buffer_size();
+ }
+
+ // copy to the remaining characters to the specified sink
+ template <typename RestIterator>
+ bool buffer_copy_rest(RestIterator& sink, std::size_t start_at = 0) const
+ {
+ return buffer_data.copy_rest(sink, start_at);
+ }
+
+ // copy the contents to the given output iterator
+ template <typename OutputIterator_>
+ bool buffer_copy_to(OutputIterator_& sink
+ , std::size_t maxwidth = std::size_t(-1)) const
+ {
+ return buffer_data.copy(sink, maxwidth);
+ }
+
+ private:
+ OutputIterator& sink;
+ buffer_sink buffer_data; // for buffering
+ buffer_sink* prev_buffer; // previous buffer in chain
+ bool enabled;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Helper class for exception safe disabling of output
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator>
+ struct disable_output
+ {
+ disable_output(OutputIterator& sink_)
+ : sink(sink_), prev_do_output(sink.do_output)
+ {
+ sink.do_output = false;
+ }
+ ~disable_output()
+ {
+ sink.do_output = prev_do_output;
+ }
+
+ OutputIterator& sink;
+ bool prev_do_output;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sink>
+ bool sink_is_good(Sink const&)
+ {
+ return true; // the general case is always good
+ }
+
+ template <typename OutputIterator, typename Derived>
+ bool sink_is_good(output_iterator<OutputIterator, Derived> const& sink)
+ {
+ return sink.good(); // our own output iterators are handled separately
+ }
+
+}}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/detail/pass_container.hpp b/boost/spirit/home/karma/detail/pass_container.hpp
new file mode 100644
index 0000000000..07f2dad3c1
--- /dev/null
+++ b/boost/spirit/home/karma/detail/pass_container.hpp
@@ -0,0 +1,350 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_PASS_CONTAINER_MAR_15_2009_0114PM)
+#define SPIRIT_PASS_CONTAINER_MAR_15_2009_0114PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/detail/hold_any.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/fusion/include/deduce_sequence.hpp>
+
+#include <boost/mpl/print.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ // Helper meta-function allowing to evaluate weak substitutability and
+ // negate the result if the predicate (Sequence) is not true
+ template <typename Sequence, typename Attribute, typename ValueType>
+ struct negate_weak_substitute_if_not
+ : mpl::if_<
+ Sequence
+ , typename traits::is_weak_substitute<Attribute, ValueType>::type
+ , typename mpl::not_<
+ traits::is_weak_substitute<Attribute, ValueType>
+ >::type>
+ {};
+
+ // pass_through_container: utility to check decide whether a provided
+ // container attribute needs to be passed through to the current component
+ // or of we need to split the container by passing along instances of its
+ // value type
+
+ // if the expected attribute of the current component is neither a Fusion
+ // sequence nor a container, we will pass through the provided container
+ // only if its value type is not compatible with the component
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence, typename Enable = void>
+ struct pass_through_container_base
+ : negate_weak_substitute_if_not<Sequence, ValueType, Attribute>
+ {};
+
+ // Specialization for fusion sequences, in this case we check whether all
+ // the types in the sequence are convertible to the lhs attribute.
+ //
+ // We return false if the rhs attribute itself is a fusion sequence, which
+ // is compatible with the LHS sequence (we want to pass through this
+ // attribute without it being split apart).
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence = mpl::true_>
+ struct not_compatible_element
+ : mpl::and_<
+ negate_weak_substitute_if_not<Sequence, Container, Attribute>
+ , negate_weak_substitute_if_not<Sequence, ValueType, Attribute> >
+ {};
+
+ // If the value type of the container is not a Fusion sequence, we pass
+ // through the container if each of the elements of the Attribute
+ // sequence is compatible with either the container or its value type.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence
+ , bool IsSequence = fusion::traits::is_sequence<ValueType>::value>
+ struct pass_through_container_fusion_sequence
+ {
+ typedef typename mpl::find_if<
+ Attribute, not_compatible_element<Container, ValueType, mpl::_1>
+ >::type iter;
+ typedef typename mpl::end<Attribute>::type end;
+
+ typedef typename is_same<iter, end>::type type;
+ };
+
+ // If both, the Attribute and the value type of the provided container
+ // are Fusion sequences, we pass the container only if the two
+ // sequences are not compatible.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container_fusion_sequence<
+ Container, ValueType, Attribute, Sequence, true>
+ {
+ typedef typename mpl::find_if<
+ Attribute
+ , not_compatible_element<Container, ValueType, mpl::_1, Sequence>
+ >::type iter;
+ typedef typename mpl::end<Attribute>::type end;
+
+ typedef typename is_same<iter, end>::type type;
+ };
+
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container_base<Container, ValueType, Attribute
+ , Sequence
+ , typename enable_if<fusion::traits::is_sequence<Attribute> >::type>
+ : pass_through_container_fusion_sequence<
+ Container, ValueType, Attribute, Sequence>
+ {};
+
+ // Specialization for containers
+ //
+ // If the value type of the attribute of the current component is not
+ // a Fusion sequence, we have to pass through the provided container if
+ // both are compatible.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence, typename AttributeValueType
+ , bool IsSequence = fusion::traits::is_sequence<AttributeValueType>::value>
+ struct pass_through_container_container
+ : mpl::or_<
+ traits::is_weak_substitute<Container, Attribute>
+ , traits::is_weak_substitute<Container, AttributeValueType> >
+ {};
+
+ // If the value type of the exposed container attribute is a Fusion
+ // sequence, we use the already existing logic for those.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence, typename AttributeValueType>
+ struct pass_through_container_container<
+ Container, ValueType, Attribute, Sequence, AttributeValueType, true>
+ : pass_through_container_fusion_sequence<
+ Container, ValueType, AttributeValueType, Sequence>
+ {};
+
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container_base<Container, ValueType, Attribute
+ , Sequence
+ , typename enable_if<traits::is_container<Attribute> >::type>
+ : detail::pass_through_container_container<
+ Container, ValueType, Attribute, Sequence
+ , typename traits::container_value<Attribute>::type>
+ {};
+
+ // Specialization for exposed optional attributes
+ //
+ // If the type embedded in the exposed optional is not a Fusion
+ // sequence we pass through the container attribute if it is compatible
+ // either to the optionals embedded type or to the containers value
+ // type.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence
+ , bool IsSequence = fusion::traits::is_sequence<Attribute>::value>
+ struct pass_through_container_optional
+ : mpl::or_<
+ traits::is_weak_substitute<Container, Attribute>
+ , traits::is_weak_substitute<ValueType, Attribute> >
+ {};
+
+ // If the embedded type of the exposed optional attribute is a Fusion
+ // sequence, we use the already existing logic for those.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container_optional<
+ Container, ValueType, Attribute, Sequence, true>
+ : pass_through_container_fusion_sequence<
+ Container, ValueType, Attribute, Sequence>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container
+ : pass_through_container_base<Container, ValueType, Attribute, Sequence>
+ {};
+
+ // Handle optional attributes
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container<
+ Container, ValueType, boost::optional<Attribute>, Sequence>
+ : pass_through_container_optional<
+ Container, ValueType, Attribute, Sequence>
+ {};
+
+ // If both, the containers value type and the exposed attribute type are
+ // optionals we are allowed to pass through the the container only if the
+ // embedded types of those optionals are not compatible.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container<
+ Container, boost::optional<ValueType>, boost::optional<Attribute>
+ , Sequence>
+ : mpl::not_<traits::is_weak_substitute<ValueType, Attribute> >
+ {};
+
+ // Specialization for exposed variant attributes
+ //
+ // We pass through the container attribute if at least one of the embedded
+ // types in the variant requires to pass through the attribute
+
+#define BOOST_SPIRIT_PASS_THROUGH_CONTAINER(z, N, _) \
+ pass_through_container<Container, ValueType, \
+ BOOST_PP_CAT(T, N), Sequence>::type::value || \
+ /***/
+
+ // make sure unused variant parameters do not affect the outcome
+ template <typename Container, typename ValueType, typename Sequence>
+ struct pass_through_container<Container, ValueType
+ , boost::detail::variant::void_, Sequence>
+ : mpl::false_
+ {};
+
+ template <typename Container, typename ValueType, typename Sequence
+ , BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct pass_through_container<Container, ValueType
+ , boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Sequence>
+ : mpl::bool_<BOOST_PP_REPEAT(BOOST_VARIANT_LIMIT_TYPES
+ , BOOST_SPIRIT_PASS_THROUGH_CONTAINER, _) false>
+ {};
+
+#undef BOOST_SPIRIT_PASS_THROUGH_CONTAINER
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // forwarding customization point for domain karma::domain
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container<
+ Container, ValueType, Attribute, Sequence, karma::domain>
+ : karma::detail::pass_through_container<
+ Container, ValueType, Attribute, Sequence>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This function handles the case where the attribute (Attr) given
+ // to the sequence is an STL container. This is a wrapper around F.
+ // The function F does the actual generating.
+ template <typename F, typename Attr, typename Iterator, typename Sequence>
+ struct pass_container
+ {
+ typedef typename F::context_type context_type;
+
+ pass_container(F const& f, Iterator begin, Iterator end)
+ : f(f), iter(begin), end(end)
+ {}
+
+ bool is_at_end() const
+ {
+ return traits::compare(iter, end);
+ }
+
+ void next()
+ {
+ traits::next(iter);
+ }
+
+ // this is for the case when the current element expects an attribute
+ // which is taken from the next entry in the container
+ template <typename Component>
+ bool dispatch_container(Component const& component, mpl::false_) const
+ {
+ // get the next value to generate from container
+ if (!is_at_end() && !f(component, traits::deref(iter)))
+ {
+ // needs to return false as long as everything is ok
+ traits::next(iter);
+ return false;
+ }
+
+ // either no elements available any more or generation failed
+ return true;
+ }
+
+ // this is for the case when the current element is able to handle an
+ // attribute which is a container itself, this element will push its
+ // data directly into the attribute container
+ template <typename Component>
+ bool dispatch_container(Component const& component, mpl::true_) const
+ {
+ return f(component, make_iterator_range(iter, end));
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // this is for the case when the current element doesn't expect an
+ // attribute
+ template <typename Component>
+ bool dispatch_attribute(Component const& component, mpl::false_) const
+ {
+ return f(component, unused);
+ }
+
+ // the current element expects an attribute
+ template <typename Component>
+ bool dispatch_attribute(Component const& component, mpl::true_) const
+ {
+ typedef typename traits::container_value<Attr>::type value_type;
+ typedef typename
+ traits::attribute_of<Component, context_type>::type
+ lhs_attribute;
+
+ // this predicate detects, whether the value type of the container
+ // attribute is a substitute for the attribute of the current
+ // element
+ typedef mpl::and_<
+ traits::handles_container<Component, Attr, context_type>
+ , traits::pass_through_container<
+ Attr, value_type, lhs_attribute, Sequence, karma::domain>
+ > predicate;
+
+ return dispatch_container(component, predicate());
+ }
+
+ // Dispatches to dispatch_main depending on the attribute type
+ // of the Component
+ template <typename Component>
+ bool operator()(Component const& component) const
+ {
+ // we need to dispatch depending on the type of the attribute
+ // of the current element (component). If this is has no attribute
+ // we shouldn't use an element of the container but unused_type
+ // instead
+ typedef traits::not_is_unused<
+ typename traits::attribute_of<Component, context_type>::type
+ > predicate;
+
+ return dispatch_attribute(component, predicate());
+ }
+
+ F f;
+ mutable Iterator iter;
+ mutable Iterator end;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ pass_container& operator= (pass_container const&);
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/string_compare.hpp b/boost/spirit/home/karma/detail/string_compare.hpp
new file mode 100644
index 0000000000..311920af5c
--- /dev/null
+++ b/boost/spirit/home/karma/detail/string_compare.hpp
@@ -0,0 +1,76 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_STRING_COMPARE_AUG_08_2009_0756PM)
+#define BOOST_SPIRIT_KARMA_STRING_COMPARE_AUG_08_2009_0756PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <string>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/range/iterator_range.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ template <typename Char>
+ bool string_compare(Char const* attr, Char const* lit)
+ {
+ Char ch_attr = *attr;
+ Char ch_lit = *lit;
+
+ while (!!ch_lit && !!ch_attr)
+ {
+ if (ch_attr != ch_lit)
+ return false;
+
+ ch_attr = *++attr;
+ ch_lit = *++lit;
+ }
+
+ return !ch_lit && !ch_attr;
+ }
+
+ template <typename Char>
+ bool string_compare(Char const* attr, Char const* lit, unused_type, unused_type)
+ {
+ return string_compare(attr, lit);
+ }
+
+ template <typename Char>
+ bool string_compare(unused_type, Char const*, unused_type, unused_type)
+ {
+ return true;
+ }
+
+ template <typename Char, typename CharEncoding, typename Tag>
+ bool string_compare(Char const* attr, Char const* lit, CharEncoding, Tag)
+ {
+ Char ch_attr = *attr;
+ Char ch_lit = spirit::char_class::convert<CharEncoding>::to(Tag(), *lit);
+
+ while (!!ch_lit && !!ch_attr)
+ {
+ if (ch_attr != ch_lit)
+ return false;
+
+ ch_attr = *++attr;
+ ch_lit = spirit::char_class::convert<CharEncoding>::to(Tag(), *++lit);
+ }
+
+ return !ch_lit && !ch_attr;
+ }
+
+ template <typename Char, typename CharEncoding, typename Tag>
+ bool string_compare(unused_type, Char const*, CharEncoding, Tag)
+ {
+ return true;
+ }
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/string_generate.hpp b/boost/spirit/home/karma/detail/string_generate.hpp
new file mode 100644
index 0000000000..d0f8a73fee
--- /dev/null
+++ b/boost/spirit/home/karma/detail/string_generate.hpp
@@ -0,0 +1,155 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_STRING_GENERATE_FEB_23_2007_1232PM)
+#define BOOST_SPIRIT_KARMA_STRING_GENERATE_FEB_23_2007_1232PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <string>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/range/const_iterator.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // pass through character transformation
+ struct pass_through_filter
+ {
+ template <typename Char>
+ Char operator()(Char ch) const
+ {
+ return ch;
+ }
+ };
+
+ template <typename CharEncoding, typename Tag>
+ struct encoding_filter
+ {
+ template <typename Char>
+ Char operator()(Char ch) const
+ {
+ return spirit::char_class::convert<CharEncoding>::to(Tag(), ch);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // generate a string given by a std::string, applying the given filter
+ template <typename OutputIterator, typename Char, typename Filter>
+ inline bool string_generate(OutputIterator& sink, Char const* str
+ , Filter filter)
+ {
+ for (Char ch = *str; ch != 0; ch = *++str)
+ {
+ *sink = filter(ch);
+ ++sink;
+ }
+ return detail::sink_is_good(sink);
+ }
+
+ template <typename OutputIterator, typename Container, typename Filter>
+ inline bool string_generate(OutputIterator& sink
+ , Container const& c, Filter filter)
+ {
+ typedef typename traits::container_iterator<Container const>::type
+ iterator;
+
+ iterator end = boost::end(c);
+ for (iterator it = boost::begin(c); it != end; ++it)
+ {
+ *sink = filter(*it);
+ ++sink;
+ }
+ return detail::sink_is_good(sink);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // generate a string without any transformation
+ template <typename OutputIterator, typename Char>
+ inline bool string_generate(OutputIterator& sink, Char const* str)
+ {
+ return string_generate(sink, str, pass_through_filter());
+ }
+
+ template <typename OutputIterator, typename Char, typename Traits
+ , typename Allocator>
+ inline bool string_generate(OutputIterator& sink
+ , std::basic_string<Char, Traits, Allocator> const& str)
+ {
+ return string_generate(sink, str.c_str(), pass_through_filter());
+ }
+
+ template <typename OutputIterator, typename Container>
+ inline bool string_generate(OutputIterator& sink
+ , Container const& c)
+ {
+ return string_generate(sink, c, pass_through_filter());
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // generate a string given by a pointer, converting according using a
+ // given character class and case tag
+ template <typename OutputIterator, typename Char, typename CharEncoding
+ , typename Tag>
+ inline bool string_generate(OutputIterator& sink
+ , Char const* str
+ , CharEncoding, Tag)
+ {
+ return string_generate(sink, str, encoding_filter<CharEncoding, Tag>());
+ }
+
+ template <typename OutputIterator, typename Char
+ , typename CharEncoding, typename Tag
+ , typename Traits, typename Allocator>
+ inline bool string_generate(OutputIterator& sink
+ , std::basic_string<Char, Traits, Allocator> const& str
+ , CharEncoding, Tag)
+ {
+ return string_generate(sink, str.c_str()
+ , encoding_filter<CharEncoding, Tag>());
+ }
+
+ template <typename OutputIterator, typename Container
+ , typename CharEncoding, typename Tag>
+ inline bool
+ string_generate(OutputIterator& sink
+ , Container const& c
+ , CharEncoding, Tag)
+ {
+ return string_generate(sink, c, encoding_filter<CharEncoding, Tag>());
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Char>
+ inline bool string_generate(OutputIterator& sink
+ , Char const* str
+ , unused_type, unused_type)
+ {
+ return string_generate(sink, str, pass_through_filter());
+ }
+
+ template <typename OutputIterator, typename Char, typename Traits
+ , typename Allocator>
+ inline bool string_generate(OutputIterator& sink
+ , std::basic_string<Char, Traits, Allocator> const& str
+ , unused_type, unused_type)
+ {
+ return string_generate(sink, str.c_str(), pass_through_filter());
+ }
+
+ template <typename OutputIterator, typename Container>
+ inline bool string_generate(OutputIterator& sink
+ , Container const& c
+ , unused_type, unused_type)
+ {
+ return string_generate(sink, c, pass_through_filter());
+ }
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/detail/unused_delimiter.hpp b/boost/spirit/home/karma/detail/unused_delimiter.hpp
new file mode 100644
index 0000000000..793c8f0f67
--- /dev/null
+++ b/boost/spirit/home/karma/detail/unused_delimiter.hpp
@@ -0,0 +1,51 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_UNUSED_DELIMITER_MAR_15_2009_0923PM)
+#define BOOST_SPIRIT_KARMA_UNUSED_DELIMITER_MAR_15_2009_0923PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ template <typename Delimiter>
+ struct unused_delimiter : unused_type
+ {
+ unused_delimiter(Delimiter const& delim)
+ : delimiter(delim) {}
+ Delimiter const& delimiter;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ unused_delimiter& operator= (unused_delimiter const&);
+ };
+
+ // If a surrounding verbatim[] directive was specified, the current
+ // delimiter is of the type unused_delimiter. In this case we
+ // re-activate the delimiter which was active before the verbatim[]
+ // directive.
+ template <typename Delimiter, typename Default>
+ inline Delimiter const&
+ get_delimiter(unused_delimiter<Delimiter> const& u, Default const&)
+ {
+ return u.delimiter;
+ }
+
+ // If no surrounding verbatim[] directive was specified we activate
+ // a single space as the delimiter to use.
+ template <typename Delimiter, typename Default>
+ inline Default const&
+ get_delimiter(Delimiter const&, Default const& d)
+ {
+ return d;
+ }
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive.hpp b/boost/spirit/home/karma/directive.hpp
new file mode 100644
index 0000000000..56ef87ce0f
--- /dev/null
+++ b/boost/spirit/home/karma/directive.hpp
@@ -0,0 +1,75 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DIRECTIVE_FEB_21_2007_0833PM)
+#define BOOST_SPIRIT_KARMA_DIRECTIVE_FEB_21_2007_0833PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/encoding.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// directives related to alignment
+// left_align[...], right_align[...], center[...]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/left_alignment.hpp>
+#include <boost/spirit/home/karma/directive/right_alignment.hpp>
+#include <boost/spirit/home/karma/directive/center_alignment.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// directives related to truncating length
+// maxwidth[...], columns[]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/maxwidth.hpp>
+#include <boost/spirit/home/karma/directive/columns.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// directives related to character case
+// lower[...] and upper[...]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/upper_lower_case.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// directives related to delimiting generators
+// delimit[...] and verbatim[...]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/verbatim.hpp>
+#include <boost/spirit/home/karma/directive/delimit.hpp>
+#include <boost/spirit/home/karma/directive/no_delimit.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// repeat directives
+// repeat[...]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/repeat.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// omit, skip, and duplicate directives
+// omit[...], skip[...], duplicate[...]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/omit.hpp>
+#include <boost/spirit/home/karma/directive/duplicate.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// buffer directive
+// buffer[...]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/buffer.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// strict and relaxed directives
+// strict[...], relaxed[...]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/strict_relaxed.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// as_string and as_wstring directives
+// as_string[...], as_wstring[...]
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/home/karma/directive/as.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/directive/as.hpp b/boost/spirit/home/karma/directive/as.hpp
new file mode 100644
index 0000000000..2a42b24cd3
--- /dev/null
+++ b/boost/spirit/home/karma/directive/as.hpp
@@ -0,0 +1,165 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// 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)
+
+#if !defined(SPIRIT_KARMA_AS_DEC_18_0510PM)
+#define SPIRIT_KARMA_AS_DEC_18_0510PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/as.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename T>
+ struct as
+ : stateful_tag_type<T, tag::as>
+ {
+ BOOST_SPIRIT_ASSERT_MSG(
+ (traits::is_container<T>::type::value),
+ error_type_must_be_a_container,
+ (T));
+ };
+}}}
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ // enables as_string[...]
+ template <>
+ struct use_directive<karma::domain, tag::as_string>
+ : mpl::true_ {};
+
+ // enables as_wstring[...]
+ template <>
+ struct use_directive<karma::domain, tag::as_wstring>
+ : mpl::true_ {};
+
+ // enables as<T>[...]
+ template <typename T>
+ struct use_directive<karma::domain, tag::stateful_tag<T, tag::as> >
+ : mpl::true_
+ {};
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::as_string;
+ using spirit::as_wstring;
+#endif
+ using spirit::as_string_type;
+ using spirit::as_wstring_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // as_directive allows to hook custom conversions to string into the
+ // output generation process
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename T>
+ struct as_directive
+ : unary_generator<as_directive<Subject, T> >
+ {
+ typedef Subject subject_type;
+ typedef typename subject_type::properties properties;
+
+ as_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ if (!traits::valid_as<T>(attr))
+ return false;
+
+ return subject.generate(sink, ctx, d, traits::as<T>(attr)) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("as", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::as_string, Subject, Modifiers>
+ {
+ typedef as_directive<Subject, std::string> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::as_wstring, Subject, Modifiers>
+ {
+ typedef as_directive<Subject, std::basic_string<wchar_t> > result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<tag::stateful_tag<T, tag::as>, Subject, Modifiers>
+ {
+ typedef as_directive<Subject, T> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename T>
+ struct has_semantic_action<karma::as_directive<Subject, T> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename T, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::as_directive<Subject, T>, Attribute
+ , Context, Iterator>
+ : mpl::false_ {}; // always dereference attribute if used in sequences
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/buffer.hpp b/boost/spirit/home/karma/directive/buffer.hpp
new file mode 100644
index 0000000000..b92f57bb6a
--- /dev/null
+++ b/boost/spirit/home/karma/directive/buffer.hpp
@@ -0,0 +1,132 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_KARMA_BUFFER_AUG_03_2009_0949AM)
+#define SPIRIT_KARMA_BUFFER_AUG_03_2009_0949AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::buffer> // enables buffer
+ : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::buffer;
+#endif
+ using spirit::buffer_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // buffer_directive buffers all generated output of the embedded generator
+ // and flushes it only if the whole embedded generator succeeds
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct buffer_directive : unary_generator<buffer_directive<Subject> >
+ {
+ typedef Subject subject_type;
+ typedef mpl::int_<
+ subject_type::properties::value |
+ generator_properties::countingbuffer
+ > properties;
+
+ buffer_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ // wrap the given output iterator to avoid output as long as the
+ // embedded generator (subject) fails
+ detail::enable_buffering<OutputIterator> buffering(sink);
+ bool r = false;
+ {
+ detail::disable_counting<OutputIterator> nocounting(sink);
+ r = subject.generate(sink, ctx, d, attr);
+ }
+ if (r)
+ buffering.buffer_copy();
+ return r;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("buffer", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::buffer, Subject, Modifiers>
+ {
+ typedef buffer_directive<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ // make sure buffer[buffer[...]] does not result in double buffering
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::buffer, buffer_directive<Subject>, Modifiers>
+ {
+ typedef buffer_directive<Subject> result_type;
+ result_type operator()(unused_type
+ , buffer_directive<Subject> const& subject, unused_type) const
+ {
+ return subject;
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::buffer_directive<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::buffer_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/center_alignment.hpp b/boost/spirit/home/karma/directive/center_alignment.hpp
new file mode 100644
index 0000000000..75e64d13c0
--- /dev/null
+++ b/boost/spirit/home/karma/directive/center_alignment.hpp
@@ -0,0 +1,335 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_CENTER_ALIGNMENT_FEB_27_2007_1216PM)
+#define BOOST_SPIRIT_KARMA_CENTER_ALIGNMENT_FEB_27_2007_1216PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/default_width.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/integer_traits.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/detail/workaround.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables center[]
+ template <>
+ struct use_directive<karma::domain, tag::center>
+ : mpl::true_ {};
+
+ // enables center(d)[g] and center(w)[g], where d is a generator
+ // and w is a maximum width
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::center, fusion::vector1<T> > >
+ : mpl::true_ {};
+
+ // enables *lazy* center(d)[g], where d provides a generator
+ template <>
+ struct use_lazy_directive<karma::domain, tag::center, 1>
+ : mpl::true_ {};
+
+ // enables center(w, d)[g], where d is a generator and w is a maximum
+ // width
+ template <typename Width, typename Padding>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::center, fusion::vector2<Width, Padding> > >
+ : spirit::traits::matches<karma::domain, Padding> {};
+
+ // enables *lazy* center(w, d)[g], where d provides a generator and w is
+ // a maximum width
+ template <>
+ struct use_lazy_directive<karma::domain, tag::center, 2>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::center;
+#endif
+ using spirit::center_type;
+
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // The center_generate template function is used for all the
+ // different flavors of the center[] directive.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Context, typename Delimiter,
+ typename Attribute, typename Embedded, typename Padding>
+ inline static bool
+ center_generate(OutputIterator& sink, Context& ctx,
+ Delimiter const& d, Attribute const& attr, Embedded const& e,
+ unsigned int const width, Padding const& p)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ e; // suppresses warning: C4100: 'e' : unreferenced formal parameter
+#endif
+ // wrap the given output iterator to allow left padding
+ detail::enable_buffering<OutputIterator> buffering(sink, width);
+ bool r = false;
+
+ // first generate the embedded output
+ {
+ detail::disable_counting<OutputIterator> nocounting(sink);
+ r = e.generate(sink, ctx, d, attr);
+ } // re-enable counting
+
+ buffering.disable(); // do not perform buffering any more
+
+ // generate the left padding
+ detail::enable_counting<OutputIterator> counting(sink);
+
+ std::size_t const pre = width - (buffering.buffer_size() + width)/2;
+ while (r && counting.count() < pre)
+ r = p.generate(sink, ctx, unused, unused);
+
+ if (r) {
+ // copy the embedded output to the target output iterator
+ buffering.buffer_copy();
+
+ // generate the right padding
+ while (r && counting.count() < width)
+ r = p.generate(sink, ctx, unused, unused);
+ }
+ return r;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The simple left alignment directive is used for center[...]
+ // generators. It uses default values for the generated width (defined via
+ // the BOOST_KARMA_DEFAULT_FIELD_LENGTH constant) and for the padding
+ // generator (always spaces).
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width = detail::default_width>
+ struct simple_center_alignment
+ : unary_generator<simple_center_alignment<Subject, Width> >
+ {
+ typedef Subject subject_type;
+
+ typedef mpl::int_<
+ generator_properties::countingbuffer | subject_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ simple_center_alignment(Subject const& subject, Width width = Width())
+ : subject(subject), width(width) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ return detail::center_generate(sink, ctx, d, attr,
+ subject, width, compile<karma::domain>(' '));
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("center", subject.what(context));
+ }
+
+ Subject subject;
+ Width width;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The left alignment directive with padding, is used for generators like
+ // center(padding)[...], where padding is a arbitrary generator
+ // expression. It uses a default value for the generated width (defined
+ // via the BOOST_KARMA_DEFAULT_FIELD_LENGTH constant).
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Padding
+ , typename Width = detail::default_width>
+ struct padding_center_alignment
+ : unary_generator<padding_center_alignment<Subject, Padding, Width> >
+ {
+ typedef Subject subject_type;
+ typedef Padding padding_type;
+
+ typedef mpl::int_<
+ generator_properties::countingbuffer |
+ subject_type::properties::value | padding_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<Subject, Context, Iterator>
+ {};
+
+ padding_center_alignment(Subject const& subject, Padding const& padding
+ , Width width = Width())
+ : subject(subject), padding(padding), width(width) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ return detail::center_generate(sink, ctx, d, attr,
+ subject, width, padding);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("center", subject.what(context));
+ }
+
+ Subject subject;
+ Padding padding;
+ Width width;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // creates center[] directive generator
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::center, Subject, Modifiers>
+ {
+ typedef simple_center_alignment<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ // creates center(width)[] directive generator
+ template <typename Width, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::center, fusion::vector1<Width> >
+ , Subject, Modifiers
+ , typename enable_if_c< integer_traits<Width>::is_integral >::type>
+ {
+ typedef simple_center_alignment<Subject, Width> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args));
+ }
+ };
+
+ // creates center(pad)[] directive generator
+ template <typename Padding, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::center, fusion::vector1<Padding> >
+ , Subject, Modifiers
+ , typename enable_if<
+ mpl::and_<
+ spirit::traits::matches<karma::domain, Padding>,
+ mpl::not_<mpl::bool_<integer_traits<Padding>::is_integral> >
+ >
+ >::type>
+ {
+ typedef typename
+ result_of::compile<karma::domain, Padding, Modifiers>::type
+ padding_type;
+
+ typedef padding_center_alignment<Subject, padding_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<karma::domain>(fusion::at_c<0>(term.args), modifiers));
+ }
+ };
+
+ // creates center(width, pad)[] directive generator
+ template <typename Width, typename Padding, typename Subject
+ , typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::center, fusion::vector2<Width, Padding> >
+ , Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<karma::domain, Padding, Modifiers>::type
+ padding_type;
+
+ typedef padding_center_alignment<Subject, padding_type, Width> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<karma::domain>(fusion::at_c<1>(term.args), modifiers)
+ , fusion::at_c<0>(term.args));
+ }
+ };
+
+}}} // namespace boost::spirit::karma
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width>
+ struct has_semantic_action<karma::simple_center_alignment<Subject, Width> >
+ : unary_has_semantic_action<Subject> {};
+
+ template <typename Subject, typename Padding, typename Width>
+ struct has_semantic_action<
+ karma::padding_center_alignment<Subject, Padding, Width> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<
+ karma::simple_center_alignment<Subject, Width>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+
+ template <typename Subject, typename Padding, typename Width
+ , typename Attribute, typename Context, typename Iterator>
+ struct handles_container<
+ karma::padding_center_alignment<Subject, Padding, Width>
+ , Attribute, Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
+
+
diff --git a/boost/spirit/home/karma/directive/columns.hpp b/boost/spirit/home/karma/directive/columns.hpp
new file mode 100644
index 0000000000..75c029d2d1
--- /dev/null
+++ b/boost/spirit/home/karma/directive/columns.hpp
@@ -0,0 +1,292 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_COLUMNS_DEC_03_2009_0736AM)
+#define BOOST_SPIRIT_KARMA_COLUMNS_DEC_03_2009_0736AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/detail/default_width.hpp>
+#include <boost/spirit/home/karma/auxiliary/eol.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::columns> // enables columns[]
+ : mpl::true_ {};
+
+ // enables columns(c)[g], where c provides the number of require columns
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::columns, fusion::vector1<T> > >
+ : mpl::true_ {};
+
+ // enables *lazy* columns(c)[g]
+ template <>
+ struct use_lazy_directive<karma::domain, tag::columns, 1>
+ : mpl::true_ {};
+
+ // enables columns(c, d)[g], where c provides the number of require columns
+ // and d is the custom column-delimiter (default is karma::endl)
+ template <typename T1, typename T2>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::columns, fusion::vector2<T1, T2> > >
+ : boost::spirit::traits::matches<karma::domain, T2> {};
+
+ // enables *lazy* columns(c, d)[g]
+ template <>
+ struct use_lazy_directive<karma::domain, tag::columns, 2>
+ : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::columns;
+#endif
+ using spirit::columns_type;
+
+ namespace detail
+ {
+ template <typename Delimiter, typename ColumnDelimiter>
+ struct columns_delimiter
+ {
+ columns_delimiter(Delimiter const& delim
+ , ColumnDelimiter const& cdelim, unsigned int const numcols)
+ : delimiter(delim), column_delimiter(cdelim)
+ , numcolumns(numcols), count(0) {}
+
+ template <typename OutputIterator, typename Context
+ , typename Delimiter_, typename Attribute>
+ bool generate(OutputIterator& sink, Context&, Delimiter_ const&
+ , Attribute const&) const
+ {
+ // first invoke the embedded delimiter
+ if (!karma::delimit_out(sink, delimiter))
+ return false;
+
+ // now we count the number of invocations and emit the column
+ // delimiter if needed
+ if ((++count % numcolumns) == 0)
+ return karma::delimit_out(sink, column_delimiter);
+ return true;
+ }
+
+ // generate a final column delimiter if the last invocation didn't
+ // emit one
+ template <typename OutputIterator>
+ bool delimit_out(OutputIterator& sink) const
+ {
+ if (count % numcolumns)
+ return karma::delimit_out(sink, column_delimiter);
+ return true;
+ }
+
+ Delimiter const& delimiter;
+ ColumnDelimiter const& column_delimiter;
+ unsigned int const numcolumns;
+ mutable unsigned int count;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ columns_delimiter& operator= (columns_delimiter const&);
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The columns_generator is used for columns(c, d)[...] directives.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename NumColumns, typename ColumnsDelimiter>
+ struct columns_generator
+ : unary_generator<columns_generator<Subject, NumColumns, ColumnsDelimiter> >
+ {
+ typedef Subject subject_type;
+ typedef ColumnsDelimiter delimiter_type;
+
+ typedef mpl::int_<
+ subject_type::properties::value | delimiter_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ columns_generator(Subject const& subject, NumColumns const& cols
+ , ColumnsDelimiter const& cdelimiter)
+ : subject(subject), numcolumns(cols), column_delimiter(cdelimiter)
+ {
+ // having zero number of columns doesn't make any sense
+ BOOST_ASSERT(numcolumns > 0);
+ }
+
+ template <typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx
+ , Delimiter const& delimiter, Attribute const& attr) const
+ {
+ // The columns generator dispatches to the embedded generator
+ // while supplying a new delimiter to use, wrapping the outer
+ // delimiter.
+ typedef detail::columns_delimiter<
+ Delimiter, ColumnsDelimiter
+ > columns_delimiter_type;
+
+ columns_delimiter_type d(delimiter, column_delimiter, numcolumns);
+ return subject.generate(sink, ctx, d, attr) && d.delimit_out(sink);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("columns", subject.what(context));
+ }
+
+ Subject subject;
+ NumColumns numcolumns;
+ ColumnsDelimiter column_delimiter;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // creates columns[] directive
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::columns, Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<karma::domain, eol_type, Modifiers>::type
+ columns_delimiter_type;
+ typedef columns_generator<
+ Subject, detail::default_columns, columns_delimiter_type>
+ result_type;
+
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+#if defined(BOOST_SPIRIT_NO_PREDEFINED_TERMINALS)
+ eol_type const eol = eol_type();
+#endif
+ return result_type(subject, detail::default_columns()
+ , compile<karma::domain>(eol));
+ }
+ };
+
+ // creates columns(c)[] directive generator (c is the number of columns)
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::columns, fusion::vector1<T> >
+ , Subject, Modifiers
+ , typename enable_if_c<integer_traits<T>::is_integral>::type>
+ {
+ typedef typename
+ result_of::compile<karma::domain, eol_type, Modifiers>::type
+ columns_delimiter_type;
+ typedef columns_generator<
+ Subject, T, columns_delimiter_type
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+#if defined(BOOST_SPIRIT_NO_PREDEFINED_TERMINALS)
+ eol_type const eol = eol_type();
+#endif
+ return result_type(subject, fusion::at_c<0>(term.args)
+ , compile<karma::domain>(eol));
+ }
+ };
+
+ // creates columns(d)[] directive generator (d is the column delimiter)
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::columns, fusion::vector1<T> >
+ , Subject, Modifiers
+ , typename enable_if<
+ mpl::and_<
+ spirit::traits::matches<karma::domain, T>,
+ mpl::not_<mpl::bool_<integer_traits<T>::is_integral> >
+ >
+ >::type>
+ {
+ typedef typename
+ result_of::compile<karma::domain, T, Modifiers>::type
+ columns_delimiter_type;
+ typedef columns_generator<
+ Subject, detail::default_columns, columns_delimiter_type
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject, detail::default_columns()
+ , compile<karma::domain>(fusion::at_c<0>(term.args)));
+ }
+ };
+
+ // creates columns(c, d)[] directive generator (c is the number of columns
+ // and d is the column delimiter)
+ template <typename T1, typename T2, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::columns, fusion::vector2<T1, T2> >
+ , Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<karma::domain, T2, Modifiers>::type
+ columns_delimiter_type;
+ typedef columns_generator<
+ Subject, T1, columns_delimiter_type
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type (subject, fusion::at_c<0>(term.args)
+ , compile<karma::domain>(fusion::at_c<1>(term.args)));
+ }
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename T1, typename T2>
+ struct has_semantic_action<karma::columns_generator<Subject, T1, T2> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename T1, typename T2, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<
+ karma::columns_generator<Subject, T1, T2>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/delimit.hpp b/boost/spirit/home/karma/directive/delimit.hpp
new file mode 100644
index 0000000000..e21de18487
--- /dev/null
+++ b/boost/spirit/home/karma/directive/delimit.hpp
@@ -0,0 +1,200 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DELIMIT_MAR_02_2007_0217PM)
+#define BOOST_SPIRIT_KARMA_DELIMIT_MAR_02_2007_0217PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/unused_delimiter.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::delimit> // enables delimit[]
+ : mpl::true_ {};
+
+ // enables delimit(d)[g], where d is a generator
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::delimit, fusion::vector1<T> > >
+ : boost::spirit::traits::matches<karma::domain, T> {};
+
+ // enables *lazy* delimit(d)[g]
+ template <>
+ struct use_lazy_directive<karma::domain, tag::delimit, 1>
+ : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::delimit;
+#endif
+ using spirit::delimit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The redelimit_generator generator is used for delimit[...] directives.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct redelimit_generator : unary_generator<redelimit_generator<Subject> >
+ {
+ typedef Subject subject_type;
+
+ typedef typename subject_type::properties properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ redelimit_generator(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ // The delimit_space generator simply dispatches to the embedded
+ // generator while supplying either the delimiter which has been
+ // used before a surrounding verbatim[] directive or a single
+ // space as the new delimiter to use (if no surrounding verbatim[]
+ // was specified).
+ return subject.generate(sink, ctx
+ , detail::get_delimiter(d, compile<karma::domain>(' ')), attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("delimit", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The delimit_generator is used for delimit(d)[...] directives.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Delimiter>
+ struct delimit_generator
+ : unary_generator<delimit_generator<Subject, Delimiter> >
+ {
+ typedef Subject subject_type;
+ typedef Delimiter delimiter_type;
+
+ typedef typename subject_type::properties properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ delimit_generator(Subject const& subject, Delimiter const& delimiter)
+ : subject(subject), delimiter(delimiter) {}
+
+ template <typename OutputIterator, typename Context
+ , typename Delimiter_, typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter_ const&
+ , Attribute const& attr) const
+ {
+ // the delimit generator simply dispatches to the embedded
+ // generator while supplying it's argument as the new delimiter
+ // to use
+ return subject.generate(sink, ctx, delimiter, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("delimit", subject.what(context));
+ }
+
+ Subject subject;
+ Delimiter delimiter;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::delimit, Subject, Modifiers>
+ {
+ typedef redelimit_generator<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename Delimiter, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::delimit, fusion::vector1<Delimiter> >
+ , Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<karma::domain, Delimiter, Modifiers>::type
+ delimiter_type;
+
+ typedef delimit_generator<Subject, delimiter_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject
+ , compile<karma::domain>(fusion::at_c<0>(term.args)));
+ }
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::redelimit_generator<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ template <typename Subject, typename Delimiter>
+ struct has_semantic_action<karma::delimit_generator<Subject, Delimiter> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::redelimit_generator<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+
+ template <typename Subject, typename Delimiter, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::delimit_generator<Subject, Delimiter>
+ , Attribute, Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/duplicate.hpp b/boost/spirit/home/karma/directive/duplicate.hpp
new file mode 100644
index 0000000000..8d9f3725a3
--- /dev/null
+++ b/boost/spirit/home/karma/directive/duplicate.hpp
@@ -0,0 +1,230 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_KARMA_DUPLICATE_JUL_11_2010_0954AM)
+#define SPIRIT_KARMA_DUPLICATE_JUL_11_2010_0954AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/fusion/include/make_cons.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at_c.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::duplicate> // enables duplicate
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::duplicate;
+#endif
+ using spirit::duplicate_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T
+ , bool IsSequence = fusion::traits::is_sequence<T>::value>
+ struct attribute_count
+ : fusion::result_of::size<T>
+ {};
+
+ template <>
+ struct attribute_count<unused_type, false>
+ : mpl::int_<0>
+ {};
+
+ template <typename T>
+ struct attribute_count<T, false>
+ : mpl::int_<1>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T
+ , bool IsSequence = fusion::traits::is_sequence<T>::value>
+ struct first_attribute_of_subject
+ : fusion::result_of::at_c<T, 0>
+ {};
+
+ template <typename T>
+ struct first_attribute_of_subject<T, false>
+ : mpl::identity<T>
+ {};
+
+ template <typename T, typename Context, typename Iterator>
+ struct first_attribute_of
+ : first_attribute_of_subject<
+ typename traits::attribute_of<T, Context, Iterator>::type>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename T, int N>
+ struct duplicate_sequence_attribute
+ {
+ typedef typename fusion::result_of::make_cons<
+ reference_wrapper<T const>
+ , typename duplicate_sequence_attribute<Attribute, T, N-1>::type
+ >::type type;
+
+ static type call(T const& t)
+ {
+ return fusion::make_cons(boost::cref(t)
+ , duplicate_sequence_attribute<Attribute, T, N-1>::call(t));
+ }
+ };
+
+ template <typename Attribute, typename T>
+ struct duplicate_sequence_attribute<Attribute, T, 1>
+ {
+ typedef typename fusion::result_of::make_cons<
+ reference_wrapper<T const> >::type type;
+
+ static type call(T const& t)
+ {
+ return fusion::make_cons(boost::cref(t));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename T
+ , int N = attribute_count<Attribute>::value
+ , bool IsSequence = fusion::traits::is_sequence<Attribute>::value>
+ struct duplicate_attribute
+ {
+ BOOST_SPIRIT_ASSERT_MSG(N > 0, invalid_duplication_count, (Attribute));
+
+ typedef typename duplicate_sequence_attribute<Attribute, T, N>::type
+ cons_type;
+ typedef typename fusion::result_of::as_vector<cons_type>::type type;
+
+ static type call(T const& t)
+ {
+ return fusion::as_vector(
+ duplicate_sequence_attribute<Attribute, T, N>::call(t));
+ }
+ };
+
+ template <typename Attribute, typename T>
+ struct duplicate_attribute<Attribute, T, 0, false>
+ {
+ typedef unused_type type;
+
+ static type call(T const&)
+ {
+ return unused;
+ }
+ };
+
+ template <typename Attribute, typename T, int N>
+ struct duplicate_attribute<Attribute, T, N, false>
+ {
+ typedef Attribute const& type;
+
+ static type call(T const& t)
+ {
+ return t;
+ }
+ };
+ }
+
+ template <typename Attribute, typename T>
+ inline typename detail::duplicate_attribute<Attribute, T>::type
+ duplicate_attribute(T const& t)
+ {
+ return detail::duplicate_attribute<Attribute, T>::call(t);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // duplicate_directive duplicate its attribute for all elements of the
+ // subject generator without generating anything itself
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct duplicate_directive : unary_generator<duplicate_directive<Subject> >
+ {
+ typedef Subject subject_type;
+ typedef typename subject_type::properties properties;
+
+ duplicate_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator = unused_type>
+ struct attribute
+ : detail::first_attribute_of<Subject, Context, Iterator>
+ {};
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ typedef typename traits::attribute_of<Subject, Context>::type
+ subject_attr_type;
+ return subject.generate(sink, ctx, d
+ , duplicate_attribute<subject_attr_type>(attr));
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("duplicate", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::duplicate, Subject, Modifiers>
+ {
+ typedef duplicate_directive<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::duplicate_directive<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::duplicate_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/encoding.hpp b/boost/spirit/home/karma/directive/encoding.hpp
new file mode 100644
index 0000000000..987f7ec62a
--- /dev/null
+++ b/boost/spirit/home/karma/directive/encoding.hpp
@@ -0,0 +1,35 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_KARMA_ENCODING_MARCH_05_2010_0550PM)
+#define SPIRIT_KARMA_ENCODING_MARCH_05_2010_0550PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables encoding
+ template <typename CharEncoding>
+ struct use_directive<
+ karma::domain, tag::char_code<tag::encoding, CharEncoding> >
+ : mpl::true_ {};
+
+ template <typename CharEncoding>
+ struct is_modifier_directive<
+ karma::domain, tag::char_code<tag::encoding, CharEncoding> >
+ : mpl::true_ {};
+}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/left_alignment.hpp b/boost/spirit/home/karma/directive/left_alignment.hpp
new file mode 100644
index 0000000000..40b5d24d9a
--- /dev/null
+++ b/boost/spirit/home/karma/directive/left_alignment.hpp
@@ -0,0 +1,318 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_LEFT_ALIGNMENT_FEB_27_2007_1216PM)
+#define BOOST_SPIRIT_KARMA_LEFT_ALIGNMENT_FEB_27_2007_1216PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/default_width.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/integer_traits.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/detail/workaround.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables left_align[]
+ template <>
+ struct use_directive<karma::domain, tag::left_align>
+ : mpl::true_ {};
+
+ // enables left_align(d)[g] and left_align(w)[g], where d is a generator
+ // and w is a maximum width
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::left_align, fusion::vector1<T> > >
+ : mpl::true_ {};
+
+ // enables *lazy* left_align(d)[g], where d provides a generator
+ template <>
+ struct use_lazy_directive<karma::domain, tag::left_align, 1>
+ : mpl::true_ {};
+
+ // enables left_align(w, d)[g], where d is a generator and w is a maximum
+ // width
+ template <typename Width, typename Padding>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::left_align, fusion::vector2<Width, Padding> > >
+ : spirit::traits::matches<karma::domain, Padding> {};
+
+ // enables *lazy* left_align(w, d)[g], where d provides a generator and w
+ // is a maximum width
+ template <>
+ struct use_lazy_directive<karma::domain, tag::left_align, 2>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::left_align;
+#endif
+ using spirit::left_align_type;
+
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // The left_align_generate template function is used for all the
+ // different flavors of the left_align[] directive.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Context, typename Delimiter,
+ typename Attribute, typename Embedded, typename Padding>
+ inline static bool
+ left_align_generate(OutputIterator& sink, Context& ctx,
+ Delimiter const& d, Attribute const& attr, Embedded const& e,
+ unsigned int const width, Padding const& p)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ e; // suppresses warning: C4100: 'e' : unreferenced formal parameter
+#endif
+ // wrap the given output iterator to allow counting
+ detail::enable_counting<OutputIterator> counting(sink);
+
+ // first generate the underlying output
+ bool r = e.generate(sink, ctx, d, attr);
+
+ // pad the output until the max width is reached
+ while(r && counting.count() < width)
+ r = p.generate(sink, ctx, unused, unused);
+
+ return r;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The simple left alignment directive is used for left_align[...]
+ // generators. It uses default values for the generated width (defined via
+ // the BOOST_KARMA_DEFAULT_FIELD_LENGTH constant) and for the padding
+ // generator (always spaces).
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width = detail::default_width>
+ struct simple_left_alignment
+ : unary_generator<simple_left_alignment<Subject, Width> >
+ {
+ typedef Subject subject_type;
+
+ typedef mpl::int_<
+ generator_properties::counting | subject_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ simple_left_alignment(Subject const& subject, Width width = Width())
+ : subject(subject), width(width) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ return detail::left_align_generate(sink, ctx, d, attr,
+ subject, width, compile<karma::domain>(' '));
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("left_align", subject.what(context));
+ }
+
+ Subject subject;
+ Width width;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The left alignment directive with padding, is used for generators like
+ // left_align(padding)[...], where padding is a arbitrary generator
+ // expression. It uses a default value for the generated width (defined
+ // via the BOOST_KARMA_DEFAULT_FIELD_LENGTH constant).
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Padding
+ , typename Width = detail::default_width>
+ struct padding_left_alignment
+ : unary_generator<padding_left_alignment<Subject, Padding, Width> >
+ {
+ typedef Subject subject_type;
+ typedef Padding padding_type;
+
+ typedef mpl::int_<
+ generator_properties::counting |
+ subject_type::properties::value | padding_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ padding_left_alignment(Subject const& subject, Padding const& padding
+ , Width width = Width())
+ : subject(subject), padding(padding), width(width) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ return detail::left_align_generate(sink, ctx, d, attr,
+ subject, width, padding);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("left_align", subject.what(context));
+ }
+
+ Subject subject;
+ Padding padding;
+ Width width;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // creates left_align[] directive generator
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::left_align, Subject, Modifiers>
+ {
+ typedef simple_left_alignment<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ // creates left_align(width)[] directive generator
+ template <typename Width, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::left_align, fusion::vector1<Width> >
+ , Subject, Modifiers
+ , typename enable_if_c< integer_traits<Width>::is_integral >::type>
+ {
+ typedef simple_left_alignment<Subject, Width> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args));
+ }
+ };
+
+ // creates left_align(pad)[] directive generator
+ template <typename Padding, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::left_align, fusion::vector1<Padding> >
+ , Subject, Modifiers
+ , typename enable_if<
+ mpl::and_<
+ spirit::traits::matches<karma::domain, Padding>,
+ mpl::not_<mpl::bool_<integer_traits<Padding>::is_integral> >
+ >
+ >::type>
+ {
+ typedef typename
+ result_of::compile<karma::domain, Padding, Modifiers>::type
+ padding_type;
+
+ typedef padding_left_alignment<Subject, padding_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<karma::domain>(fusion::at_c<0>(term.args), modifiers));
+ }
+ };
+
+ // creates left_align(width, pad)[] directive generator
+ template <typename Width, typename Padding, typename Subject
+ , typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::left_align, fusion::vector2<Width, Padding> >
+ , Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<karma::domain, Padding, Modifiers>::type
+ padding_type;
+
+ typedef padding_left_alignment<Subject, padding_type, Width> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject
+ , compile<karma::domain>(fusion::at_c<1>(term.args))
+ , fusion::at_c<0>(term.args));
+ }
+ };
+
+}}} // namespace boost::spirit::karma
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width>
+ struct has_semantic_action<karma::simple_left_alignment<Subject, Width> >
+ : unary_has_semantic_action<Subject> {};
+
+ template <typename Subject, typename Padding, typename Width>
+ struct has_semantic_action<
+ karma::padding_left_alignment<Subject, Padding, Width> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<
+ karma::simple_left_alignment<Subject, Width>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+
+ template <typename Subject, typename Padding, typename Width
+ , typename Attribute, typename Context, typename Iterator>
+ struct handles_container<
+ karma::padding_left_alignment<Subject, Padding, Width>
+ , Attribute, Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
+
+
diff --git a/boost/spirit/home/karma/directive/maxwidth.hpp b/boost/spirit/home/karma/directive/maxwidth.hpp
new file mode 100644
index 0000000000..e1a271f30f
--- /dev/null
+++ b/boost/spirit/home/karma/directive/maxwidth.hpp
@@ -0,0 +1,246 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_MAXWIDTH_MAR_18_2009_0827AM)
+#define BOOST_SPIRIT_KARMA_MAXWIDTH_MAR_18_2009_0827AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/default_width.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/detail/workaround.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables maxwidth[]
+ template <>
+ struct use_directive<karma::domain, tag::maxwidth>
+ : mpl::true_ {};
+
+ // enables maxwidth(w)[g], where w provides a maxwidth
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::maxwidth, fusion::vector1<T> > >
+ : mpl::true_ {};
+
+ // enables *lazy* maxwidth(w)[g], where w provides a maxwidth
+ template <>
+ struct use_lazy_directive<karma::domain, tag::maxwidth, 1>
+ : mpl::true_ {};
+
+ // enables maxwidth(w, r)[g], where w provides a maxwidth and r is an output
+ // iterator used to receive the rest of the output not fitting into the
+ // maxwidth limit
+ template <typename T, typename RestIter>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::maxwidth, fusion::vector2<T, RestIter> > >
+ : mpl::true_ {};
+
+ // enables *lazy* maxwidth(w, r)[g], where w provides a maxwidth and r is
+ // an output iterator used to receive the rest of the output not fitting
+ // into the maxwidth limit
+ template <>
+ struct use_lazy_directive<karma::domain, tag::maxwidth, 2>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::maxwidth;
+#endif
+ using spirit::maxwidth_type;
+
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename RestIterator>
+ bool buffer_copy_rest(detail::enable_buffering<OutputIterator>& buff
+ , std::size_t start_at, RestIterator& dest)
+ {
+ return buff.buffer_copy_rest(dest, start_at);
+ }
+
+ template <typename OutputIterator>
+ bool buffer_copy_rest(detail::enable_buffering<OutputIterator>&
+ , std::size_t, unused_type)
+ {
+ return true;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // The maxwidth_generate template function is used for all the
+ // different flavors of the maxwidth[] directive.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Context, typename Delimiter,
+ typename Attribute, typename Embedded, typename Rest>
+ inline static bool
+ maxwidth_generate(OutputIterator& sink, Context& ctx,
+ Delimiter const& d, Attribute const& attr, Embedded const& e,
+ unsigned int const maxwidth, Rest& restdest)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ e; // suppresses warning: C4100: 'e' : unreferenced formal parameter
+#endif
+ // wrap the given output iterator to allow buffering, but disable
+ // counting
+ detail::enable_buffering<OutputIterator> buffering(sink);
+
+ // generate the underlying output and copy the embedded
+ // output to the target output iterator applying the given
+ // maxwidth
+ bool r = false;
+ {
+ detail::disable_counting<OutputIterator> nocounting(sink);
+ r = e.generate(sink, ctx, d, attr);
+ } // re-enable counting
+
+ return r && buffering.buffer_copy(maxwidth) &&
+ buffer_copy_rest(buffering, maxwidth, restdest);
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The maxwidth directive is used for maxwidth[...]
+ // generators. It uses default values for the generated width (defined via
+ // the BOOST_KARMA_DEFAULT_FIELD_MAXWIDTH constant).
+ //
+ // The maxwidth with width directive, is used for generators
+ // like maxwidth(width)[...].
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width = detail::default_max_width
+ , typename Rest = unused_type>
+ struct maxwidth_width
+ : unary_generator<maxwidth_width<Subject, Width, Rest> >
+ {
+ typedef Subject subject_type;
+
+ typedef mpl::int_<
+ generator_properties::countingbuffer | subject_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ maxwidth_width(Subject const& subject, Width const& w = Width()
+ , Rest const& r = Rest())
+ : subject(subject), width(w), rest(r) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ return detail::maxwidth_generate(sink, ctx, d, attr, subject
+ , width, rest);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("maxwidth", subject.what(context));
+ }
+
+ Subject subject;
+ Width width;
+ Rest rest;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // creates maxwidth[] directive generator
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::maxwidth, Subject, Modifiers>
+ {
+ typedef maxwidth_width<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ // creates maxwidth(width)[] directive generator
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::maxwidth, fusion::vector1<T> >
+ , Subject, Modifiers>
+ {
+ typedef maxwidth_width<Subject, T> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args), unused);
+ }
+ };
+
+ // creates maxwidth(width, restiter)[] directive generator
+ template <
+ typename T, typename RestIter, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::maxwidth, fusion::vector2<T, RestIter> >
+ , Subject, Modifiers>
+ {
+ typedef maxwidth_width<Subject, T, RestIter> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args));
+ }
+ };
+
+}}} // namespace boost::spirit::karma
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width, typename Rest>
+ struct has_semantic_action<karma::maxwidth_width<Subject, Width, Rest> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::maxwidth_width<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
+
+
diff --git a/boost/spirit/home/karma/directive/no_delimit.hpp b/boost/spirit/home/karma/directive/no_delimit.hpp
new file mode 100644
index 0000000000..a1c81269bf
--- /dev/null
+++ b/boost/spirit/home/karma/directive/no_delimit.hpp
@@ -0,0 +1,116 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_NO_DELIMIT_JAN_19_2010_0920AM)
+#define BOOST_SPIRIT_KARMA_NO_DELIMIT_JAN_19_2010_0920AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/unused_delimiter.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::no_delimit> // enables no_delimit[]
+ : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::no_delimit;
+#endif
+ using spirit::no_delimit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The no_delimit generator is used for no_delimit[...] directives.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct no_delimit_generator
+ : unary_generator<no_delimit_generator<Subject> >
+ {
+ typedef Subject subject_type;
+ typedef typename subject_type::properties properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ no_delimit_generator(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ // the no_delimit generator simply dispatches to the embedded
+ // generator while supplying unused_delimiter as the new delimiter
+ // to avoid delimiting down the generator stream
+ typedef detail::unused_delimiter<Delimiter> unused_delimiter;
+
+ // the difference to verbatim[] is that this does not post-delimit
+ return subject.generate(sink, ctx, unused_delimiter(d), attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("no_delimit", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::no_delimit, Subject, Modifiers>
+ {
+ typedef no_delimit_generator<Subject> result_type;
+
+ result_type
+ operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::no_delimit_generator<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::no_delimit_generator<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/omit.hpp b/boost/spirit/home/karma/directive/omit.hpp
new file mode 100644
index 0000000000..ca6d7131ec
--- /dev/null
+++ b/boost/spirit/home/karma/directive/omit.hpp
@@ -0,0 +1,135 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_KARMA_OMIT_JUL_20_2009_1008AM)
+#define SPIRIT_KARMA_OMIT_JUL_20_2009_1008AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::omit> // enables omit
+ : mpl::true_ {};
+
+ template <>
+ struct use_directive<karma::domain, tag::skip> // enables skip
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::omit;
+ using spirit::skip;
+#endif
+ using spirit::omit_type;
+ using spirit::skip_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // omit_directive consumes the attribute of subject generator without
+ // generating anything
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, bool Execute>
+ struct omit_directive : unary_generator<omit_directive<Subject, Execute> >
+ {
+ typedef Subject subject_type;
+
+ typedef mpl::int_<
+ generator_properties::disabling | subject_type::properties::value
+ > properties;
+
+ omit_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator = unused_type>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ // We need to actually compile the output operation as we don't
+ // have any other means to verify, whether the passed attribute is
+ // compatible with the subject.
+
+ // omit[] will execute the code, while skip[] doesn't execute it
+ if (Execute) {
+ // wrap the given output iterator to avoid output
+ detail::disable_output<OutputIterator> disable(sink);
+ subject.generate(sink, ctx, d, attr);
+ }
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info(Execute ? "omit" : "skip", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::omit, Subject, Modifiers>
+ {
+ typedef omit_directive<Subject, true> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::skip, Subject, Modifiers>
+ {
+ typedef omit_directive<Subject, false> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, bool Execute>
+ struct has_semantic_action<karma::omit_directive<Subject, Execute> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, bool Execute, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::omit_directive<Subject, Execute>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/repeat.hpp b/boost/spirit/home/karma/directive/repeat.hpp
new file mode 100644
index 0000000000..f6b4378e78
--- /dev/null
+++ b/boost/spirit/home/karma/directive/repeat.hpp
@@ -0,0 +1,397 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_REPEAT_MAY_18_2009_0926AM)
+#define SPIRIT_KARMA_REPEAT_MAY_18_2009_0926AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/get_stricttag.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/operator/kleene.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/fusion/include/at.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::repeat> // enables repeat[p]
+ : mpl::true_ {};
+
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::repeat // enables repeat(exact)[p]
+ , fusion::vector1<T> >
+ > : mpl::true_ {};
+
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::repeat // enables repeat(min, max)[p]
+ , fusion::vector2<T, T> >
+ > : mpl::true_ {};
+
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::repeat // enables repeat(min, inf)[p]
+ , fusion::vector2<T, inf_type> >
+ > : mpl::true_ {};
+
+ template <> // enables *lazy* repeat(exact)[p]
+ struct use_lazy_directive<
+ karma::domain
+ , tag::repeat
+ , 1 // arity
+ > : mpl::true_ {};
+
+ template <> // enables *lazy* repeat(min, max)[p]
+ struct use_lazy_directive< // and repeat(min, inf)[p]
+ karma::domain
+ , tag::repeat
+ , 2 // arity
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::repeat;
+ using spirit::inf;
+#endif
+ using spirit::repeat_type;
+ using spirit::inf_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // handles repeat(exact)[p]
+ template <typename T>
+ struct exact_iterator
+ {
+ exact_iterator(T const exact)
+ : exact(exact) {}
+
+ typedef T type;
+ T start() const { return 0; }
+ bool got_max(T i) const { return i >= exact; }
+ bool got_min(T i) const { return i >= exact; }
+
+ T const exact;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ exact_iterator& operator= (exact_iterator const&);
+ };
+
+ // handles repeat(min, max)[p]
+ template <typename T>
+ struct finite_iterator
+ {
+ finite_iterator(T const min, T const max)
+ : min BOOST_PREVENT_MACRO_SUBSTITUTION (min)
+ , max BOOST_PREVENT_MACRO_SUBSTITUTION (max) {}
+
+ typedef T type;
+ T start() const { return 0; }
+ bool got_max(T i) const { return i >= max; }
+ bool got_min(T i) const { return i >= min; }
+
+ T const min;
+ T const max;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ finite_iterator& operator= (finite_iterator const&);
+ };
+
+ // handles repeat(min, inf)[p]
+ template <typename T>
+ struct infinite_iterator
+ {
+ infinite_iterator(T const min)
+ : min BOOST_PREVENT_MACRO_SUBSTITUTION (min) {}
+
+ typedef T type;
+ T start() const { return 0; }
+ bool got_max(T /*i*/) const { return false; }
+ bool got_min(T i) const { return i >= min; }
+
+ T const min;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ infinite_iterator& operator= (infinite_iterator const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename LoopIter, typename Strict
+ , typename Derived>
+ struct base_repeat_generator : unary_generator<Derived>
+ {
+ private:
+ // iterate over the given container until its exhausted or the embedded
+ // generator succeeds
+ template <typename F, typename Attribute>
+ bool generate_subject(F f, Attribute const&, mpl::false_) const
+ {
+ // Failing subject generators are just skipped. This allows to
+ // selectively generate items in the provided attribute.
+ while (!f.is_at_end())
+ {
+ bool r = !f(subject);
+ if (r)
+ return true;
+ if (!f.is_at_end())
+ f.next();
+ }
+ return false;
+ }
+
+ template <typename F, typename Attribute>
+ bool generate_subject(F f, Attribute const&, mpl::true_) const
+ {
+ return !f(subject);
+ }
+
+ // There is no way to distinguish a failed generator from a
+ // generator to be skipped. We assume the user takes responsibility
+ // for ending the loop if no attribute is specified.
+ template <typename F>
+ bool generate_subject(F f, unused_type, mpl::false_) const
+ {
+ return !f(subject);
+ }
+
+ public:
+ typedef Subject subject_type;
+
+ typedef mpl::int_<subject_type::properties::value> properties;
+
+ // Build a std::vector from the subject's attribute. Note
+ // that build_std_vector may return unused_type if the
+ // subject's attribute is an unused_type.
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::build_std_vector<
+ typename traits::attribute_of<Subject, Context, Iterator>::type
+ >
+ {};
+
+ base_repeat_generator(Subject const& subject, LoopIter const& iter)
+ : subject(subject), iter(iter) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ typedef detail::fail_function<
+ OutputIterator, Context, Delimiter
+ > fail_function;
+
+ typedef typename traits::container_iterator<
+ typename add_const<Attribute>::type
+ >::type iterator_type;
+
+ typedef
+ typename traits::make_indirect_iterator<iterator_type>::type
+ indirect_iterator_type;
+
+ typedef detail::pass_container<
+ fail_function, Attribute, indirect_iterator_type, mpl::false_>
+ pass_container;
+
+ iterator_type it = traits::begin(attr);
+ iterator_type end = traits::end(attr);
+
+ pass_container pass(fail_function(sink, ctx, d),
+ indirect_iterator_type(it), indirect_iterator_type(end));
+
+ // generate the minimal required amount of output
+ typename LoopIter::type i = iter.start();
+ for (/**/; !pass.is_at_end() && !iter.got_min(i); ++i)
+ {
+ if (!generate_subject(pass, attr, Strict()))
+ {
+ // if we fail before reaching the minimum iteration
+ // required, do not output anything and return false
+ return false;
+ }
+ }
+
+ if (pass.is_at_end() && !iter.got_min(i))
+ return false; // insufficient attribute elements
+
+ // generate some more up to the maximum specified
+ for (/**/; !pass.is_at_end() && !iter.got_max(i); ++i)
+ {
+ if (!generate_subject(pass, attr, Strict()))
+ break;
+ }
+ return detail::sink_is_good(sink);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("repeat", subject.what(context));
+ }
+
+ Subject subject;
+ LoopIter iter;
+ };
+
+ template <typename Subject, typename LoopIter>
+ struct repeat_generator
+ : base_repeat_generator<
+ Subject, LoopIter, mpl::false_
+ , repeat_generator<Subject, LoopIter> >
+ {
+ typedef base_repeat_generator<
+ Subject, LoopIter, mpl::false_, repeat_generator
+ > base_repeat_generator_;
+
+ repeat_generator(Subject const& subject, LoopIter const& iter)
+ : base_repeat_generator_(subject, iter) {}
+ };
+
+ template <typename Subject, typename LoopIter>
+ struct strict_repeat_generator
+ : base_repeat_generator<
+ Subject, LoopIter, mpl::true_
+ , strict_repeat_generator<Subject, LoopIter> >
+ {
+ typedef base_repeat_generator<
+ Subject, LoopIter, mpl::true_, strict_repeat_generator
+ > base_repeat_generator_;
+
+ strict_repeat_generator(Subject const& subject, LoopIter const& iter)
+ : base_repeat_generator_(subject, iter) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::repeat, Subject, Modifiers>
+ {
+ typedef typename mpl::if_<
+ detail::get_stricttag<Modifiers>
+ , strict_kleene<Subject>, kleene<Subject>
+ >::type result_type;
+
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::repeat, fusion::vector1<T> >, Subject, Modifiers>
+ {
+ typedef exact_iterator<T> iterator_type;
+
+ typedef typename mpl::if_<
+ detail::get_stricttag<Modifiers>
+ , strict_repeat_generator<Subject, iterator_type>
+ , repeat_generator<Subject, iterator_type>
+ >::type result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args));
+ }
+ };
+
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::repeat, fusion::vector2<T, T> >, Subject, Modifiers>
+ {
+ typedef finite_iterator<T> iterator_type;
+
+ typedef typename mpl::if_<
+ detail::get_stricttag<Modifiers>
+ , strict_repeat_generator<Subject, iterator_type>
+ , repeat_generator<Subject, iterator_type>
+ >::type result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject,
+ iterator_type(
+ fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args)
+ )
+ );
+ }
+ };
+
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::repeat
+ , fusion::vector2<T, inf_type> >, Subject, Modifiers>
+ {
+ typedef infinite_iterator<T> iterator_type;
+
+ typedef typename mpl::if_<
+ detail::get_stricttag<Modifiers>
+ , strict_repeat_generator<Subject, iterator_type>
+ , repeat_generator<Subject, iterator_type>
+ >::type result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename LoopIter>
+ struct has_semantic_action<karma::repeat_generator<Subject, LoopIter> >
+ : unary_has_semantic_action<Subject> {};
+
+ template <typename Subject, typename LoopIter>
+ struct has_semantic_action<karma::strict_repeat_generator<Subject, LoopIter> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename LoopIter, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<
+ karma::repeat_generator<Subject, LoopIter>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+
+ template <typename Subject, typename LoopIter, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<
+ karma::strict_repeat_generator<Subject, LoopIter>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/right_alignment.hpp b/boost/spirit/home/karma/directive/right_alignment.hpp
new file mode 100644
index 0000000000..50563f92f5
--- /dev/null
+++ b/boost/spirit/home/karma/directive/right_alignment.hpp
@@ -0,0 +1,327 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_RIGHT_ALIGNMENT_FEB_27_2007_1216PM)
+#define BOOST_SPIRIT_KARMA_RIGHT_ALIGNMENT_FEB_27_2007_1216PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/default_width.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/integer_traits.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/detail/workaround.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables right_align[]
+ template <>
+ struct use_directive<karma::domain, tag::right_align>
+ : mpl::true_ {};
+
+ // enables right_align(d)[g] and right_align(w)[g], where d is a generator
+ // and w is a maximum width
+ template <typename T>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::right_align, fusion::vector1<T> > >
+ : mpl::true_ {};
+
+ // enables *lazy* right_align(d)[g], where d provides a generator
+ template <>
+ struct use_lazy_directive<karma::domain, tag::right_align, 1>
+ : mpl::true_ {};
+
+ // enables right_align(w, d)[g], where d is a generator and w is a maximum
+ // width
+ template <typename Width, typename Padding>
+ struct use_directive<karma::domain
+ , terminal_ex<tag::right_align, fusion::vector2<Width, Padding> > >
+ : spirit::traits::matches<karma::domain, Padding> {};
+
+ // enables *lazy* right_align(w, d)[g], where d provides a generator and w
+ // is a maximum width
+ template <>
+ struct use_lazy_directive<karma::domain, tag::right_align, 2>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::right_align;
+#endif
+ using spirit::right_align_type;
+
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // The right_align_generate template function is used for all the
+ // different flavors of the right_align[] directive.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Context, typename Delimiter,
+ typename Attribute, typename Embedded, typename Padding>
+ inline static bool
+ right_align_generate(OutputIterator& sink, Context& ctx,
+ Delimiter const& d, Attribute const& attr, Embedded const& e,
+ unsigned int const width, Padding const& p)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ e; // suppresses warning: C4100: 'e' : unreferenced formal parameter
+#endif
+ // wrap the given output iterator to allow left padding
+ detail::enable_buffering<OutputIterator> buffering(sink, width);
+ bool r = false;
+
+ // first generate the embedded output
+ {
+ detail::disable_counting<OutputIterator> nocounting(sink);
+ r = e.generate(sink, ctx, d, attr);
+ } // re-enable counting
+
+ buffering.disable(); // do not perform buffering any more
+
+ // generate the left padding
+ detail::enable_counting<OutputIterator> counting(sink, buffering.buffer_size());
+ while(r && counting.count() < width)
+ r = p.generate(sink, ctx, unused, unused);
+
+ // copy the buffered output to the target output iterator
+ if (r)
+ buffering.buffer_copy();
+ return r;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The simple left alignment directive is used for right_align[...]
+ // generators. It uses default values for the generated width (defined via
+ // the BOOST_KARMA_DEFAULT_FIELD_LENGTH constant) and for the padding
+ // generator (always spaces).
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width = detail::default_width>
+ struct simple_right_alignment
+ : unary_generator<simple_right_alignment<Subject, Width> >
+ {
+ typedef Subject subject_type;
+
+ typedef mpl::int_<
+ generator_properties::countingbuffer | subject_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ simple_right_alignment(Subject const& subject, Width width = Width())
+ : subject(subject), width(width) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ return detail::right_align_generate(sink, ctx, d, attr,
+ subject, width, compile<karma::domain>(' '));
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("right_align", subject.what(context));
+ }
+
+ Subject subject;
+ Width width;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The left alignment directive with padding, is used for generators like
+ // right_align(padding)[...], where padding is a arbitrary generator
+ // expression. It uses a default value for the generated width (defined
+ // via the BOOST_KARMA_DEFAULT_FIELD_LENGTH constant).
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Padding
+ , typename Width = detail::default_width>
+ struct padding_right_alignment
+ : unary_generator<padding_right_alignment<Subject, Padding, Width> >
+ {
+ typedef Subject subject_type;
+ typedef Padding padding_type;
+
+ typedef mpl::int_<
+ generator_properties::countingbuffer |
+ subject_type::properties::value | padding_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ padding_right_alignment(Subject const& subject, Padding const& padding
+ , Width width = Width())
+ : subject(subject), padding(padding), width(width) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ return detail::right_align_generate(sink, ctx, d, attr,
+ subject, width, padding);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("right_align", subject.what(context));
+ }
+
+ Subject subject;
+ Padding padding;
+ Width width;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // creates right_align[] directive generator
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::right_align, Subject, Modifiers>
+ {
+ typedef simple_right_alignment<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ // creates right_align(width)[] directive generator
+ template <typename Width, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::right_align, fusion::vector1<Width> >
+ , Subject, Modifiers
+ , typename enable_if_c< integer_traits<Width>::is_integral >::type>
+ {
+ typedef simple_right_alignment<Subject, Width> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args));
+ }
+ };
+
+ // creates right_align(pad)[] directive generator
+ template <typename Padding, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::right_align, fusion::vector1<Padding> >
+ , Subject, Modifiers
+ , typename enable_if<
+ mpl::and_<
+ spirit::traits::matches<karma::domain, Padding>,
+ mpl::not_<mpl::bool_<integer_traits<Padding>::is_integral> >
+ >
+ >::type>
+ {
+ typedef typename
+ result_of::compile<karma::domain, Padding, Modifiers>::type
+ padding_type;
+
+ typedef padding_right_alignment<Subject, padding_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<karma::domain>(fusion::at_c<0>(term.args), modifiers));
+ }
+ };
+
+ // creates right_align(width, pad)[] directive generator
+ template <typename Width, typename Padding, typename Subject
+ , typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::right_align, fusion::vector2<Width, Padding> >
+ , Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<karma::domain, Padding, Modifiers>::type
+ padding_type;
+
+ typedef padding_right_alignment<Subject, padding_type, Width> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<karma::domain>(fusion::at_c<1>(term.args), modifiers)
+ , fusion::at_c<0>(term.args));
+ }
+ };
+
+}}} // namespace boost::spirit::karma
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width>
+ struct has_semantic_action<karma::simple_right_alignment<Subject, Width> >
+ : unary_has_semantic_action<Subject> {};
+
+ template <typename Subject, typename Padding, typename Width>
+ struct has_semantic_action<
+ karma::padding_right_alignment<Subject, Padding, Width> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Width, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<
+ karma::simple_right_alignment<Subject, Width>
+ , Attribute, Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+
+ template <typename Subject, typename Padding, typename Width
+ , typename Attribute, typename Context, typename Iterator>
+ struct handles_container<
+ karma::padding_right_alignment<Subject, Padding, Width>
+ , Attribute, Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/directive/strict_relaxed.hpp b/boost/spirit/home/karma/directive/strict_relaxed.hpp
new file mode 100644
index 0000000000..88d62022af
--- /dev/null
+++ b/boost/spirit/home/karma/directive/strict_relaxed.hpp
@@ -0,0 +1,78 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_STRICT_RELAXED_APR_22_2010_0959AM)
+#define SPIRIT_STRICT_RELAXED_APR_22_2010_0959AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/modify.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::strict> // enables strict[]
+ : mpl::true_ {};
+
+ template <>
+ struct use_directive<karma::domain, tag::relaxed> // enables relaxed[]
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct is_modifier_directive<karma::domain, tag::strict>
+ : mpl::true_ {};
+
+ template <>
+ struct is_modifier_directive<karma::domain, tag::relaxed>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Don't add tag::strict or tag::relaxed if there is already one of those
+ // in the modifier list
+ template <typename Current>
+ struct compound_modifier<Current, tag::strict
+ , typename enable_if<has_modifier<Current, tag::relaxed> >::type>
+ : Current
+ {
+ compound_modifier()
+ : Current() {}
+
+ compound_modifier(Current const& current, tag::strict const&)
+ : Current(current) {}
+ };
+
+ template <typename Current>
+ struct compound_modifier<Current, tag::relaxed
+ , typename enable_if<has_modifier<Current, tag::strict> >::type>
+ : Current
+ {
+ compound_modifier()
+ : Current() {}
+
+ compound_modifier(Current const& current, tag::relaxed const&)
+ : Current(current) {}
+ };
+
+ namespace karma
+ {
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using boost::spirit::strict;
+ using boost::spirit::relaxed;
+#endif
+ using boost::spirit::strict_type;
+ using boost::spirit::relaxed_type;
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/upper_lower_case.hpp b/boost/spirit/home/karma/directive/upper_lower_case.hpp
new file mode 100644
index 0000000000..684fa5f918
--- /dev/null
+++ b/boost/spirit/home/karma/directive/upper_lower_case.hpp
@@ -0,0 +1,85 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_UPPER_LOWER_CASE_JANUARY_19_2009_1142AM)
+#define SPIRIT_UPPER_LOWER_CASE_JANUARY_19_2009_1142AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/modify.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct use_directive<
+ karma::domain, tag::char_code<tag::upper, CharEncoding> > // enables upper
+ : mpl::true_ {};
+
+ template <typename CharEncoding>
+ struct use_directive<
+ karma::domain, tag::char_code<tag::lower, CharEncoding> > // enables lower
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct is_modifier_directive<karma::domain
+ , tag::char_code<tag::upper, CharEncoding> >
+ : mpl::true_ {};
+
+ template <typename CharEncoding>
+ struct is_modifier_directive<karma::domain
+ , tag::char_code<tag::lower, CharEncoding> >
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Don't add tag::upper or tag::lower if there is already one of those in
+ // the modifier list
+ template <typename Current, typename CharEncoding>
+ struct compound_modifier<
+ Current
+ , tag::char_code<tag::upper, CharEncoding>
+ , typename enable_if<
+ has_modifier<Current, tag::char_code<tag::lower, CharEncoding> >
+ >::type
+ >
+ : Current
+ {
+ compound_modifier()
+ : Current() {}
+
+ compound_modifier(Current const& current,
+ tag::char_code<tag::upper, CharEncoding> const&)
+ : Current(current) {}
+ };
+
+ template <typename Current, typename CharEncoding>
+ struct compound_modifier<
+ Current
+ , tag::char_code<tag::lower, CharEncoding>
+ , typename enable_if<
+ has_modifier<Current, tag::char_code<tag::upper, CharEncoding> >
+ >::type
+ >
+ : Current
+ {
+ compound_modifier()
+ : Current() {}
+
+ compound_modifier(Current const& current,
+ tag::char_code<tag::lower, CharEncoding> const&)
+ : Current(current) {}
+ };
+}}
+
+#endif
diff --git a/boost/spirit/home/karma/directive/verbatim.hpp b/boost/spirit/home/karma/directive/verbatim.hpp
new file mode 100644
index 0000000000..b6b16806da
--- /dev/null
+++ b/boost/spirit/home/karma/directive/verbatim.hpp
@@ -0,0 +1,114 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_VERBATIM_MAR_02_2007_0303PM)
+#define BOOST_SPIRIT_KARMA_VERBATIM_MAR_02_2007_0303PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/detail/unused_delimiter.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<karma::domain, tag::verbatim> // enables verbatim[]
+ : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::verbatim;
+#endif
+ using spirit::verbatim_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The verbatim generator is used for verbatim[...] directives.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct verbatim_generator : unary_generator<verbatim_generator<Subject> >
+ {
+ typedef Subject subject_type;
+ typedef typename subject_type::properties properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ verbatim_generator(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ // the verbatim generator simply dispatches to the embedded
+ // generator while supplying unused_delimiter as the new delimiter
+ // to avoid delimiting down the generator stream
+ typedef detail::unused_delimiter<Delimiter> unused_delimiter;
+
+ return subject.generate(sink, ctx, unused_delimiter(d), attr) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("verbatim", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::verbatim, Subject, Modifiers>
+ {
+ typedef verbatim_generator<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::verbatim_generator<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::verbatim_generator<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/domain.hpp b/boost/spirit/home/karma/domain.hpp
new file mode 100644
index 0000000000..8ef771dd38
--- /dev/null
+++ b/boost/spirit/home/karma/domain.hpp
@@ -0,0 +1,74 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_KARMA_DOMAIN_FEB_20_2007_0943AM)
+#define BOOST_SPIRIT_KARMA_DOMAIN_FEB_20_2007_0943AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/meta_compiler.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/context.hpp>
+
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ // karma's domain
+ struct domain {};
+
+ // bring in some of spirit parts into spirit::karma
+ using spirit::unused;
+ using spirit::unused_type;
+ using spirit::compile;
+ using spirit::info;
+
+ // You can bring these in with the using directive
+ // without worrying about bringing in too much.
+ namespace labels
+ {
+ BOOST_PP_REPEAT(SPIRIT_ARGUMENTS_LIMIT, SPIRIT_USING_ARGUMENT, _)
+ BOOST_PP_REPEAT(SPIRIT_ATTRIBUTES_LIMIT, SPIRIT_USING_ATTRIBUTE, _)
+
+ using spirit::_pass_type;
+ using spirit::_val_type;
+ using spirit::_a_type;
+ using spirit::_b_type;
+ using spirit::_c_type;
+ using spirit::_d_type;
+ using spirit::_e_type;
+ using spirit::_f_type;
+ using spirit::_g_type;
+ using spirit::_h_type;
+ using spirit::_i_type;
+ using spirit::_j_type;
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+ using spirit::_pass;
+ using spirit::_val;
+ using spirit::_a;
+ using spirit::_b;
+ using spirit::_c;
+ using spirit::_d;
+ using spirit::_e;
+ using spirit::_f;
+ using spirit::_g;
+ using spirit::_h;
+ using spirit::_i;
+ using spirit::_j;
+
+#endif
+ }
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/format.hpp b/boost/spirit/home/karma/format.hpp
new file mode 100644
index 0000000000..a6aaa3fe8c
--- /dev/null
+++ b/boost/spirit/home/karma/format.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_FORMAT_DEC_01_2009_0716AM)
+#define BOOST_SPIRIT_KARMA_FORMAT_DEC_01_2009_0716AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/stream/format_manip.hpp>
+#include <boost/spirit/home/karma/stream/format_manip_attr.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/format_auto.hpp b/boost/spirit/home/karma/format_auto.hpp
new file mode 100644
index 0000000000..183ea7ed48
--- /dev/null
+++ b/boost/spirit/home/karma/format_auto.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_FORMAT_AUTO_DEC_02_2009_1248PM)
+#define BOOST_SPIRIT_KARMA_FORMAT_AUTO_DEC_02_2009_1248PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/stream/format_manip.hpp>
+#include <boost/spirit/home/karma/stream/detail/format_manip_auto.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/generate.hpp b/boost/spirit/home/karma/generate.hpp
new file mode 100644
index 0000000000..68f9b1883e
--- /dev/null
+++ b/boost/spirit/home/karma/generate.hpp
@@ -0,0 +1,232 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_GENERATE_DEC_01_2009_0734PM)
+#define BOOST_SPIRIT_KARMA_GENERATE_DEC_01_2009_0734PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/context.hpp>
+#include <boost/spirit/home/support/nonterminal/locals.hpp>
+#include <boost/spirit/home/karma/detail/generate.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Expr>
+ inline bool
+ generate(
+ OutputIterator& sink
+ , Expr const& expr)
+ {
+ return detail::generate_impl<Expr>::call(sink, expr);
+ }
+
+ template <typename OutputIterator, typename Expr>
+ inline bool
+ generate(
+ OutputIterator const& sink_
+ , Expr const& expr)
+ {
+ OutputIterator sink = sink_;
+ return karma::generate(sink, expr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T>
+ struct make_context
+ {
+ typedef context<fusion::cons<T const&>, locals<> > type;
+ };
+
+ template <>
+ struct make_context<unused_type>
+ {
+ typedef unused_type type;
+ };
+ }
+
+ template <typename OutputIterator, typename Properties, typename Expr
+ , typename Attr>
+ inline bool
+ generate(
+ detail::output_iterator<OutputIterator, Properties>& sink
+ , Expr const& expr
+ , Attr const& attr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+
+ typename detail::make_context<Attr>::type context(attr);
+ return compile<karma::domain>(expr).generate(sink, context, unused, attr);
+ }
+
+ template <typename OutputIterator, typename Expr, typename Attr>
+ inline bool
+ generate(
+ OutputIterator& sink_
+ , Expr const& expr
+ , Attr const& attr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Expr>::type
+ > properties;
+
+ // wrap user supplied iterator into our own output iterator
+ detail::output_iterator<OutputIterator
+ , mpl::int_<properties::value> > sink(sink_);
+ return karma::generate(sink, expr, attr);
+ }
+
+ template <typename OutputIterator, typename Expr, typename Attr>
+ inline bool
+ generate(
+ OutputIterator const& sink_
+ , Expr const& expr
+ , Attr const& attr)
+ {
+ OutputIterator sink = sink_;
+ return karma::generate(sink, expr, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Expr, typename Delimiter>
+ inline bool
+ generate_delimited(
+ OutputIterator& sink
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit =
+ delimit_flag::dont_predelimit)
+ {
+ return detail::generate_delimited_impl<Expr>::call(
+ sink, expr, delimiter, pre_delimit);
+ }
+
+ template <typename OutputIterator, typename Expr, typename Delimiter>
+ inline bool
+ generate_delimited(
+ OutputIterator const& sink_
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit =
+ delimit_flag::dont_predelimit)
+ {
+ OutputIterator sink = sink_;
+ return karma::generate_delimited(sink, expr, delimiter, pre_delimit);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Properties, typename Expr
+ , typename Delimiter, typename Attribute>
+ inline bool
+ generate_delimited(
+ detail::output_iterator<OutputIterator, Properties>& sink
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
+ , Attribute const& attr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
+
+ typename result_of::compile<karma::domain, Delimiter>::type const
+ delimiter_ = compile<karma::domain>(delimiter);
+
+ if (pre_delimit == delimit_flag::predelimit &&
+ !karma::delimit_out(sink, delimiter_))
+ {
+ return false;
+ }
+
+ typename detail::make_context<Attribute>::type context(attr);
+ return compile<karma::domain>(expr).
+ generate(sink, context, delimiter_, attr);
+ }
+
+ template <typename OutputIterator, typename Expr, typename Delimiter
+ , typename Attribute>
+ inline bool
+ generate_delimited(
+ OutputIterator& sink_
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
+ , Attribute const& attr)
+ {
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Expr>::type
+ > properties;
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Delimiter>::type
+ > delimiter_properties;
+
+ // wrap user supplied iterator into our own output iterator
+ detail::output_iterator<OutputIterator
+ , mpl::int_<properties::value | delimiter_properties::value>
+ > sink(sink_);
+ return karma::generate_delimited(sink, expr, delimiter, pre_delimit, attr);
+ }
+
+ template <typename OutputIterator, typename Expr, typename Delimiter
+ , typename Attribute>
+ inline bool
+ generate_delimited(
+ OutputIterator const& sink_
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
+ , Attribute const& attr)
+ {
+ OutputIterator sink = sink_;
+ return karma::generate_delimited(sink, expr, delimiter, pre_delimit, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Expr, typename Delimiter
+ , typename Attribute>
+ inline bool
+ generate_delimited(
+ OutputIterator& sink
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , Attribute const& attr)
+ {
+ return karma::generate_delimited(sink, expr, delimiter
+ , delimit_flag::dont_predelimit, attr);
+ }
+
+ template <typename OutputIterator, typename Expr, typename Delimiter
+ , typename Attribute>
+ inline bool
+ generate_delimited(
+ OutputIterator const& sink_
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , Attribute const& attr)
+ {
+ OutputIterator sink = sink_;
+ return karma::generate_delimited(sink, expr, delimiter
+ , delimit_flag::dont_predelimit, attr);
+ }
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/generate_attr.hpp b/boost/spirit/home/karma/generate_attr.hpp
new file mode 100644
index 0000000000..e2b6e18cdc
--- /dev/null
+++ b/boost/spirit/home/karma/generate_attr.hpp
@@ -0,0 +1,212 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_KARMA_GENERATE_ATTR_APR_23_2009_0541PM)
+#define BOOST_SPIRIT_KARMA_GENERATE_ATTR_APR_23_2009_0541PM
+
+#include <boost/spirit/home/karma/generate.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 <boost/spirit/home/karma/generate_attr.hpp>
+#define BOOST_PP_ITERATION_LIMITS (2, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+#define BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE(z, n, A) \
+ BOOST_PP_CAT(A, n) const&
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Properties, typename Expr
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ generate(
+ detail::output_iterator<OutputIterator, Properties>& sink
+ , Expr const& expr
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return compile<karma::domain>(expr).generate(sink, unused, unused, attr);
+ }
+
+ template <typename OutputIterator, typename Expr
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ generate(
+ OutputIterator& sink_
+ , Expr const& expr
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Expr>::type
+ > properties;
+
+ // wrap user supplied iterator into our own output iterator
+ detail::output_iterator<OutputIterator
+ , mpl::int_<properties::value> > sink(sink_);
+ return karma::generate(sink, expr, BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+ template <typename OutputIterator, typename Expr
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ generate(
+ OutputIterator const& sink_
+ , Expr const& expr
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ OutputIterator sink = sink_;
+ return karma::generate(sink, expr, BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Properties, typename Expr
+ , typename Delimiter, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ generate_delimited(
+ detail::output_iterator<OutputIterator, Properties>& sink
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
+
+ typename result_of::compile<karma::domain, Delimiter>::type const
+ delimiter_ = compile<karma::domain>(delimiter);
+
+ if (pre_delimit == delimit_flag::predelimit &&
+ !karma::delimit_out(sink, delimiter_))
+ {
+ return false;
+ }
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return compile<karma::domain>(expr).
+ generate(sink, unused, delimiter_, attr);
+ }
+
+ template <typename OutputIterator, typename Expr, typename Delimiter
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ generate_delimited(
+ OutputIterator& sink_
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Expr>::type
+ > properties;
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Delimiter>::type
+ > delimiter_properties;
+
+ // wrap user supplied iterator into our own output iterator
+ detail::output_iterator<OutputIterator
+ , mpl::int_<properties::value | delimiter_properties::value>
+ > sink(sink_);
+ return karma::generate_delimited(sink, expr, delimiter, pre_delimit
+ , BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+ template <typename OutputIterator, typename Expr, typename Delimiter
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ generate_delimited(
+ OutputIterator const& sink_
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ OutputIterator sink = sink_;
+ return karma::generate_delimited(sink, expr, delimiter, pre_delimit
+ , BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Expr, typename Delimiter
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ generate_delimited(
+ OutputIterator& sink_
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Expr>::type
+ > properties;
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Delimiter>::type
+ > delimiter_properties;
+
+ // wrap user supplied iterator into our own output iterator
+ detail::output_iterator<OutputIterator
+ , mpl::int_<properties::value | delimiter_properties::value>
+ > sink(sink_);
+ return karma::generate_delimited(sink, expr, delimiter
+ , delimit_flag::dont_predelimit, BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+ template <typename OutputIterator, typename Expr, typename Delimiter
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ generate_delimited(
+ OutputIterator const& sink_
+ , Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ OutputIterator sink = sink_;
+ return karma::generate_delimited(sink, expr, delimiter
+ , delimit_flag::dont_predelimit, BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+}}}
+
+#undef BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE
+#undef N
+
+#endif // defined(BOOST_PP_IS_ITERATING)
+
diff --git a/boost/spirit/home/karma/generator.hpp b/boost/spirit/home/karma/generator.hpp
new file mode 100644
index 0000000000..a8f06c616e
--- /dev/null
+++ b/boost/spirit/home/karma/generator.hpp
@@ -0,0 +1,159 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_GENERATOR_JANUARY_13_2009_1002AM)
+#define BOOST_SPIRIT_GENERATOR_JANUARY_13_2009_1002AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ struct generator_properties
+ {
+ enum enum_type {
+ no_properties = 0,
+ buffering = 0x01, // generator requires buffering
+ counting = 0x02, // generator requires counting
+ tracking = 0x04, // generator requires position tracking
+ disabling = 0x08, // generator requires disabling of output
+
+ countingbuffer = 0x03, // buffering | counting
+ all_properties = 0x0f // buffering | counting | tracking | disabling
+ };
+ };
+
+ template <typename Derived>
+ struct generator
+ {
+ struct generator_id;
+ typedef mpl::int_<generator_properties::no_properties> properties;
+ typedef Derived derived_type;
+ typedef karma::domain domain;
+
+ // Requirement: g.generate(o, context, delimiter, attr) -> bool
+ //
+ // g: a generator
+ // o: output iterator
+ // context: enclosing rule context (can be unused_type)
+ // delimit: delimiter (can be unused_type)
+ // attr: attribute (can be unused_type)
+
+ // Requirement: g.what(context) -> info
+ //
+ // g: a generator
+ // context: enclosing rule context (can be unused_type)
+
+ // Requirement: G::template attribute<Ctx, Iter>::type
+ //
+ // G: a generator type
+ // Ctx: A context type (can be unused_type)
+ // Iter: An iterator type (always unused_type)
+
+ Derived const& derived() const
+ {
+ return *static_cast<Derived const*>(this);
+ }
+ };
+
+ template <typename Derived>
+ struct primitive_generator : generator<Derived>
+ {
+ struct primitive_generator_id;
+ };
+
+ template <typename Derived>
+ struct nary_generator : generator<Derived>
+ {
+ struct nary_generator_id;
+
+ // Requirement: g.elements -> fusion sequence
+ //
+ // g: a composite generator
+
+ // Requirement: G::elements_type -> fusion sequence
+ //
+ // G: a composite generator type
+ };
+
+ template <typename Derived>
+ struct unary_generator : generator<Derived>
+ {
+ struct unary_generator_id;
+
+ // Requirement: g.subject -> subject generator
+ //
+ // g: a unary generator
+
+ // Requirement: G::subject_type -> subject generator type
+ //
+ // G: a unary generator type
+ };
+
+ template <typename Derived>
+ struct binary_generator : generator<Derived>
+ {
+ struct binary_generator_id;
+
+ // Requirement: g.left -> left generator
+ //
+ // g: a binary generator
+
+ // Requirement: G::left_type -> left generator type
+ //
+ // G: a binary generator type
+
+ // Requirement: g.right -> right generator
+ //
+ // g: a binary generator
+
+ // Requirement: G::right_type -> right generator type
+ //
+ // G: a binary generator type
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits // classification
+{
+ namespace detail
+ {
+ // generator tags
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(generator_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(primitive_generator_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(nary_generator_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(unary_generator_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(binary_generator_id)
+ }
+
+ // check for generator tags
+ template <typename T>
+ struct is_generator : detail::has_generator_id<T> {};
+
+ template <typename T>
+ struct is_primitive_generator : detail::has_primitive_generator_id<T> {};
+
+ template <typename T>
+ struct is_nary_generator : detail::has_nary_generator_id<T> {};
+
+ template <typename T>
+ struct is_unary_generator : detail::has_unary_generator_id<T> {};
+
+ template <typename T>
+ struct is_binary_generator : detail::has_binary_generator_id<T> {};
+
+ // check for generator properties
+ template <typename T>
+ struct properties_of : T::properties {};
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/meta_compiler.hpp b/boost/spirit/home/karma/meta_compiler.hpp
new file mode 100644
index 0000000000..9928579e7c
--- /dev/null
+++ b/boost/spirit/home/karma/meta_compiler.hpp
@@ -0,0 +1,177 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_KARMA_META_COMPILER_JANUARY_13_2009_1011AM)
+#define BOOST_SPIRIT_KARMA_META_COMPILER_JANUARY_13_2009_1011AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/meta_compiler.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/fusion/include/at.hpp>
+
+namespace boost { namespace spirit
+{
+ template <typename T>
+ struct use_terminal<karma::domain, T
+ , typename enable_if<traits::is_generator<T> >::type> // enables generators
+ : mpl::true_ {};
+
+ namespace karma
+ {
+ template <typename T, typename Modifiers, typename Enable = void>
+ struct make_primitive // by default, return it as-is
+ {
+ typedef T result_type;
+
+ template <typename T_>
+ T_& operator()(T_& val, unused_type) const
+ {
+ return val;
+ }
+
+ template <typename T_>
+ T_ const& operator()(T_ const& val, unused_type) const
+ {
+ return val;
+ }
+ };
+
+ template <typename Tag, typename Elements
+ , typename Modifiers, typename Enable = void>
+ struct make_composite;
+
+ template <typename Directive, typename Body
+ , typename Modifiers, typename Enable = void>
+ struct make_directive
+ {
+ typedef Body result_type;
+ result_type operator()(unused_type, Body const& body, unused_type) const
+ {
+ return body; // By default, a directive simply returns its subject
+ }
+ };
+ }
+
+ // Karma primitive meta-compiler
+ template <>
+ struct make_component<karma::domain, proto::tag::terminal>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename karma::make_primitive<
+ typename remove_const<typename Elements::car_type>::type
+ , typename remove_reference<Modifiers>::type
+ >::result_type type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ typedef typename remove_const<typename Elements::car_type>::type term;
+ return karma::make_primitive<term, Modifiers>()(elements.car, modifiers);
+ }
+ };
+
+ // Karma composite meta-compiler
+ template <typename Tag>
+ struct make_component<karma::domain, Tag>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ karma::make_composite<Tag, Elements
+ , typename remove_reference<Modifiers>::type>::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ return karma::make_composite<Tag, Elements, Modifiers>()(
+ elements, modifiers);
+ }
+ };
+
+ // Karma function meta-compiler
+ template <>
+ struct make_component<karma::domain, proto::tag::function>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ karma::make_composite<
+ typename remove_const<typename Elements::car_type>::type,
+ typename Elements::cdr_type,
+ typename remove_reference<Modifiers>::type
+ >::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ return karma::make_composite<
+ typename remove_const<typename Elements::car_type>::type,
+ typename Elements::cdr_type,
+ Modifiers>()(elements.cdr, modifiers);
+ }
+ };
+
+ // Karma directive meta-compiler
+ template <>
+ struct make_component<karma::domain, tag::directive>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ karma::make_directive<
+ typename remove_const<typename Elements::car_type>::type,
+ typename remove_const<typename Elements::cdr_type::car_type>::type,
+ typename remove_reference<Modifiers>::type
+ >::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ return karma::make_directive<
+ typename remove_const<typename Elements::car_type>::type,
+ typename remove_const<typename Elements::cdr_type::car_type>::type,
+ Modifiers>()(elements.car, elements.cdr.car, modifiers);
+ }
+ };
+
+}}
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal.hpp b/boost/spirit/home/karma/nonterminal.hpp
new file mode 100644
index 0000000000..3425bf37d5
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_NONTERMINAL_MAR_05_2007_0539PM)
+#define BOOST_SPIRIT_KARMA_NONTERMINAL_MAR_05_2007_0539PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/nonterminal/rule.hpp>
+#include <boost/spirit/home/karma/nonterminal/grammar.hpp>
+#include <boost/spirit/home/karma/nonterminal/debug_handler.hpp>
+#include <boost/spirit/home/karma/nonterminal/simple_trace.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal/debug_handler.hpp b/boost/spirit/home/karma/nonterminal/debug_handler.hpp
new file mode 100644
index 0000000000..07d5a3e2a0
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/debug_handler.hpp
@@ -0,0 +1,134 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_KARMA_DEBUG_HANDLER_APR_21_2010_0148PM)
+#define BOOST_SPIRIT_KARMA_DEBUG_HANDLER_APR_21_2010_0148PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/karma/nonterminal/rule.hpp>
+#include <boost/spirit/home/karma/nonterminal/debug_handler_state.hpp>
+#include <boost/function.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/out.hpp>
+#include <iostream>
+
+namespace boost { namespace spirit { namespace karma
+{
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Properties, typename F>
+ struct debug_handler
+ {
+ typedef detail::output_iterator<OutputIterator, Properties>
+ output_iterator;
+ typedef detail::enable_buffering<output_iterator> buffer_type;
+
+ typedef function<bool(output_iterator&, Context&, Delimiter const&)>
+ function_type;
+
+ debug_handler(function_type subject, F f, std::string const& rule_name)
+ : subject(subject)
+ , f(f)
+ , rule_name(rule_name)
+ {}
+
+ bool operator()(output_iterator& sink, Context& context
+ , Delimiter const& delim) const
+ {
+ buffer_type buffer(sink);
+ bool r = false;
+
+ f (sink, context, pre_generate, rule_name, buffer);
+ {
+ detail::disable_counting<output_iterator> nocount(sink);
+ r = subject(sink, context, delim);
+ }
+
+ if (r)
+ {
+ f (sink, context, successful_generate, rule_name, buffer);
+ buffer.buffer_copy();
+ return true;
+ }
+ f (sink, context, failed_generate, rule_name, buffer);
+ return false;
+ }
+
+ function_type subject;
+ F f;
+ std::string rule_name;
+ };
+
+ template <typename OutputIterator
+ , typename T1, typename T2, typename T3, typename T4, typename F>
+ void debug(rule<OutputIterator, T1, T2, T3, T4>& r, F f)
+ {
+ typedef rule<OutputIterator, T1, T2, T3, T4> rule_type;
+
+ typedef
+ debug_handler<
+ OutputIterator
+ , typename rule_type::context_type
+ , typename rule_type::delimiter_type
+ , typename rule_type::properties
+ , F>
+ debug_handler;
+ r.f = debug_handler(r.f, f, r.name());
+ }
+
+ struct simple_trace;
+
+ namespace detail
+ {
+ // This class provides an extra level of indirection through a
+ // template to produce the simple_trace type. This way, the use
+ // of simple_trace below is hidden behind a dependent type, so
+ // that compilers eagerly type-checking template definitions
+ // won't complain that simple_trace is incomplete.
+ template<typename T>
+ struct get_simple_trace
+ {
+ typedef simple_trace type;
+ };
+ }
+
+ template <typename OutputIterator
+ , typename T1, typename T2, typename T3, typename T4>
+ void debug(rule<OutputIterator, T1, T2, T3, T4>& r)
+ {
+ typedef rule<OutputIterator, T1, T2, T3, T4> rule_type;
+
+ typedef
+ debug_handler<
+ OutputIterator
+ , typename rule_type::context_type
+ , typename rule_type::delimiter_type
+ , typename rule_type::properties
+ , simple_trace>
+ debug_handler;
+ typedef typename karma::detail::get_simple_trace<OutputIterator>::type
+ trace;
+ r.f = debug_handler(r.f, trace(), r.name());
+ }
+
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// Utility macro for easy enabling of rule and grammar debugging
+#if !defined(BOOST_SPIRIT_DEBUG_NODE)
+ #if defined(BOOST_SPIRIT_KARMA_DEBUG)
+ #define BOOST_SPIRIT_DEBUG_NODE(r) r.name(#r); debug(r)
+ #else
+ #define BOOST_SPIRIT_DEBUG_NODE(r) r.name(#r);
+ #endif
+#endif
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal/debug_handler_state.hpp b/boost/spirit/home/karma/nonterminal/debug_handler_state.hpp
new file mode 100644
index 0000000000..cffe9d1ffa
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/debug_handler_state.hpp
@@ -0,0 +1,23 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_DEBUG_HANDLER_STATE_APR_21_2010_0736PM)
+#define BOOST_SPIRIT_KARMA_DEBUG_HANDLER_STATE_APR_21_2010_0736PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+namespace boost { namespace spirit { namespace karma
+{
+ enum debug_handler_state
+ {
+ pre_generate
+ , successful_generate
+ , failed_generate
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal/detail/fcall.hpp b/boost/spirit/home/karma/nonterminal/detail/fcall.hpp
new file mode 100644
index 0000000000..8a5cf173ee
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/detail/fcall.hpp
@@ -0,0 +1,53 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_PP_IS_ITERATING
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 \
+ <boost/spirit/home/karma/nonterminal/detail/fcall.hpp>
+#define BOOST_PP_ITERATION_LIMITS (1, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename A)>
+ typename lazy_enable_if_c<
+ (params_size == N)
+ , proto::terminal<
+ spirit::karma::parameterized_nonterminal<
+ parameterized_subject_type
+ , fusion::vector<BOOST_PP_ENUM_PARAMS(N, A)> >
+ >
+ >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& f)) const
+ {
+ typedef fusion::vector<BOOST_PP_ENUM_PARAMS(N, A)> vector_type;
+ typedef spirit::karma::parameterized_nonterminal<
+ parameterized_subject_type, vector_type> parameterized_type;
+ typedef typename proto::terminal<parameterized_type>::type result_type;
+
+ return result_type::make(
+ parameterized_type(
+ this->get_parameterized_subject()
+ , fusion::make_vector(BOOST_PP_ENUM_PARAMS(N, f)))
+ );
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/karma/nonterminal/detail/generator_binder.hpp b/boost/spirit/home/karma/nonterminal/detail/generator_binder.hpp
new file mode 100644
index 0000000000..ea9516f2ac
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/detail/generator_binder.hpp
@@ -0,0 +1,86 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_GENERATOR_BINDER_APR_17_2009_0952PM)
+#define BOOST_SPIRIT_GENERATOR_BINDER_APR_17_2009_0952PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ // generator_binder for plain rules
+ template <typename Generator, typename Auto>
+ struct generator_binder
+ {
+ generator_binder(Generator const& g)
+ : g(g) {}
+
+ template <typename OutputIterator, typename Delimiter, typename Context>
+ bool call(OutputIterator& sink, Context& context
+ , Delimiter const& delim, mpl::true_) const
+ {
+ // If DeducedAuto is false (semantic actions is present), the
+ // component's attribute is unused.
+ return g.generate(sink, context, delim, unused);
+ }
+
+ template <typename OutputIterator, typename Delimiter, typename Context>
+ bool call(OutputIterator& sink, Context& context
+ , Delimiter const& delim, mpl::false_) const
+ {
+ // If DeducedAuto is true (no semantic action), we pass the rule's
+ // attribute on to the component.
+ return g.generate(sink, context, delim
+ , fusion::at_c<0>(context.attributes));
+ }
+
+ template <typename OutputIterator, typename Delimiter, typename Context>
+ bool operator()(OutputIterator& sink, Context& context
+ , Delimiter const& delim) const
+ {
+ // If Auto is false, we need to deduce whether to apply auto rule
+ typedef typename traits::has_semantic_action<Generator>::type auto_rule;
+ return call(sink, context, delim, auto_rule());
+ }
+
+ Generator g;
+ };
+
+ // generator_binder for auto rules
+ template <typename Generator>
+ struct generator_binder<Generator, mpl::true_>
+ {
+ generator_binder(Generator const& g)
+ : g(g) {}
+
+ template <typename OutputIterator, typename Delimiter, typename Context>
+ bool operator()(OutputIterator& sink, Context& context
+ , Delimiter const& delim) const
+ {
+ // If Auto is true, the component's attribute is unused.
+ return g.generate(sink, context, delim
+ , fusion::at_c<0>(context.attributes));
+ }
+
+ Generator g;
+ };
+
+ template <typename Auto, typename Generator>
+ inline generator_binder<Generator, Auto>
+ bind_generator(Generator const& g)
+ {
+ return generator_binder<Generator, Auto>(g);
+ }
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal/detail/parameterized.hpp b/boost/spirit/home/karma/nonterminal/detail/parameterized.hpp
new file mode 100644
index 0000000000..1d708089c5
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/detail/parameterized.hpp
@@ -0,0 +1,76 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2009 Francois Barel
+//
+// Distributed under the 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_SPIRIT_KARMA_PARAMETERIZED_AUGUST_09_2009_0601AM)
+#define BOOST_SPIRIT_KARMA_PARAMETERIZED_AUGUST_09_2009_0601AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/ref.hpp>
+
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // parameterized_nonterminal: generator representing the invocation of a
+ // nonterminal, passing inherited attributes
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Params>
+ struct parameterized_nonterminal
+ : generator<parameterized_nonterminal<Subject, Params> >
+ {
+ typedef mpl::int_<generator_properties::all_properties> properties;
+
+ parameterized_nonterminal(Subject const& subject, Params const& params)
+ : ref(subject), params(params)
+ {
+ }
+
+ template <typename Context, typename Unused>
+ struct attribute
+ // Forward to subject.
+ : Subject::template attribute<Context, Unused> {};
+
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& delim, Attribute const& attr) const
+ {
+ // Forward to subject, passing the additional
+ // params argument to generate.
+ return ref.get().generate(sink, context, delim, attr, params);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ // Forward to subject.
+ return ref.get().what(context);
+ }
+
+ boost::reference_wrapper<Subject const> ref;
+ Params params;
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Params, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::parameterized_nonterminal<Subject, Params>
+ , Attribute, Context, Iterator>
+ : handles_container<typename remove_const<Subject>::type
+ , Attribute, Context, Iterator>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal/grammar.hpp b/boost/spirit/home/karma/nonterminal/grammar.hpp
new file mode 100644
index 0000000000..c5392e5874
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/grammar.hpp
@@ -0,0 +1,134 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_GRAMMAR_MAR_05_2007_0542PM)
+#define BOOST_SPIRIT_KARMA_GRAMMAR_MAR_05_2007_0542PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/nonterminal/rule.hpp>
+#include <boost/spirit/home/karma/nonterminal/nonterminal_fwd.hpp>
+#include <boost/spirit/home/karma/reference.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ template <
+ typename OutputIterator, typename T1, typename T2, typename T3
+ , typename T4>
+ struct grammar
+ : proto::extends<
+ typename proto::terminal<
+ reference<rule<OutputIterator, T1, T2, T3, T4> const>
+ >::type
+ , grammar<OutputIterator, T1, T2, T3, T4>
+ >
+ , generator<grammar<OutputIterator, T1, T2, T3, T4> >
+ , noncopyable
+ {
+ typedef OutputIterator iterator_type;
+ typedef rule<OutputIterator, T1, T2, T3, T4> start_type;
+ typedef typename start_type::properties properties;
+ typedef typename start_type::sig_type sig_type;
+ typedef typename start_type::locals_type locals_type;
+ typedef typename start_type::delimiter_type delimiter_type;
+ typedef typename start_type::encoding_type encoding_type;
+ typedef grammar<OutputIterator, T1, T2, T3, T4> base_type;
+ typedef reference<start_type const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+
+ static size_t const params_size = start_type::params_size;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef typename start_type::attr_type type;
+ };
+
+ // the output iterator is always wrapped by karma
+ typedef detail::output_iterator<OutputIterator, properties>
+ output_iterator;
+
+ grammar(start_type const& start
+ , std::string const& name_ = "unnamed-grammar")
+ : proto::extends<terminal, base_type>(terminal::make(reference_(start)))
+ , name_(name_)
+ {}
+
+ // This constructor is used to catch if the start rule is not
+ // compatible with the grammar.
+ template <typename Iterator_, typename T1_, typename T2_, typename T3_,
+ typename T4_>
+ grammar(rule<Iterator_, T1_, T2_, T3_, T4_> const&
+ , std::string const& = "unnamed-grammar")
+ {
+ // If you see the assertion below failing then the start rule
+ // passed to the constructor of the grammar is not compatible with
+ // the grammar (i.e. it uses different template parameters).
+ BOOST_SPIRIT_ASSERT_MSG(
+ (is_same<start_type, rule<Iterator_, T1_, T2_, T3_, T4_> >::value)
+ , incompatible_start_rule, (rule<Iterator_, T1_, T2_, T3_, T4_>));
+ }
+
+ std::string name() const
+ {
+ return name_;
+ }
+
+ void name(std::string const& str)
+ {
+ name_ = str;
+ }
+
+ template <typename Context, typename Delimiter, typename Attribute>
+ bool generate(output_iterator& sink, Context& context
+ , Delimiter const& delim, Attribute const& attr) const
+ {
+ return this->proto_base().child0.generate(
+ sink, context, delim, attr);
+ }
+
+ template <typename Context>
+ info what(Context&) const
+ {
+ return info(name_);
+ }
+
+ // bring in the operator() overloads
+ start_type const& get_parameterized_subject() const
+ { return this->proto_base().child0.ref.get(); }
+ typedef start_type parameterized_subject_type;
+ #include <boost/spirit/home/karma/nonterminal/detail/fcall.hpp>
+
+ std::string name_;
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename IteratorA, typename IteratorB, typename Attribute
+ , typename Context, typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<
+ karma::grammar<IteratorA, T1, T2, T3, T4>, Attribute, Context
+ , IteratorB>
+ : detail::nonterminal_handles_container<
+ typename attribute_of<
+ karma::grammar<IteratorA, T1, T2, T3, T4>
+ , Context, IteratorB
+ >::type, Attribute>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal/nonterminal_fwd.hpp b/boost/spirit/home/karma/nonterminal/nonterminal_fwd.hpp
new file mode 100644
index 0000000000..bc974f2e0f
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/nonterminal_fwd.hpp
@@ -0,0 +1,31 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_NONTERMINAL_FWD_DEC_18_2010_0913PM)
+#define BOOST_SPIRIT_KARMA_NONTERMINAL_FWD_DEC_18_2010_0913PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ // forward declaration only
+ template <
+ typename OutputIterator, typename T1 = unused_type
+ , typename T2 = unused_type, typename T3 = unused_type
+ , typename T4 = unused_type>
+ struct rule;
+
+ template <
+ typename OutputIterator, typename T1 = unused_type
+ , typename T2 = unused_type, typename T3 = unused_type
+ , typename T4 = unused_type>
+ struct grammar;
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal/rule.hpp b/boost/spirit/home/karma/nonterminal/rule.hpp
new file mode 100644
index 0000000000..623f638d51
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/rule.hpp
@@ -0,0 +1,447 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_RULE_MAR_05_2007_0455PM)
+#define BOOST_SPIRIT_KARMA_RULE_MAR_05_2007_0455PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/function.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/make_vector.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/fusion/include/as_list.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/context.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/nonterminal/extract_param.hpp>
+#include <boost/spirit/home/support/nonterminal/locals.hpp>
+#include <boost/spirit/home/karma/reference.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/nonterminal/nonterminal_fwd.hpp>
+#include <boost/spirit/home/karma/nonterminal/detail/generator_binder.hpp>
+#include <boost/spirit/home/karma/nonterminal/detail/parameterized.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning
+#endif
+
+namespace boost { namespace spirit { namespace karma
+{
+ BOOST_PP_REPEAT(SPIRIT_ATTRIBUTES_LIMIT, SPIRIT_USING_ATTRIBUTE, _)
+
+ using spirit::_pass_type;
+ using spirit::_val_type;
+ using spirit::_a_type;
+ using spirit::_b_type;
+ using spirit::_c_type;
+ using spirit::_d_type;
+ using spirit::_e_type;
+ using spirit::_f_type;
+ using spirit::_g_type;
+ using spirit::_h_type;
+ using spirit::_i_type;
+ using spirit::_j_type;
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+ using spirit::_pass;
+ using spirit::_val;
+ using spirit::_a;
+ using spirit::_b;
+ using spirit::_c;
+ using spirit::_d;
+ using spirit::_e;
+ using spirit::_f;
+ using spirit::_g;
+ using spirit::_h;
+ using spirit::_i;
+ using spirit::_j;
+
+#endif
+
+ using spirit::info;
+ using spirit::locals;
+
+ template <
+ typename OutputIterator, typename T1, typename T2, typename T3
+ , typename T4>
+ struct rule
+ : proto::extends<
+ typename proto::terminal<
+ reference<rule<OutputIterator, T1, T2, T3, T4> const>
+ >::type
+ , rule<OutputIterator, T1, T2, T3, T4>
+ >
+ , generator<rule<OutputIterator, T1, T2, T3, T4> >
+ {
+ typedef mpl::int_<generator_properties::all_properties> properties;
+
+ typedef OutputIterator iterator_type;
+ typedef rule<OutputIterator, T1, T2, T3, T4> this_type;
+ typedef reference<this_type const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, this_type> base_type;
+ typedef mpl::vector<T1, T2, T3, T4> template_params;
+
+ // the output iterator is always wrapped by karma
+ typedef detail::output_iterator<OutputIterator, properties>
+ output_iterator;
+
+ // locals_type is a sequence of types to be used as local variables
+ typedef typename
+ spirit::detail::extract_locals<template_params>::type
+ locals_type;
+
+ // The delimiter-generator type
+ typedef typename
+ spirit::detail::extract_component<
+ karma::domain, template_params>::type
+ delimiter_type;
+
+ // The rule's signature
+ typedef typename
+ spirit::detail::extract_sig<template_params>::type
+ sig_type;
+
+ // The rule's encoding type
+ typedef typename
+ spirit::detail::extract_encoding<template_params>::type
+ encoding_type;
+
+ // This is the rule's attribute type
+ typedef typename
+ spirit::detail::attr_from_sig<sig_type>::type
+ attr_type;
+ typedef typename add_reference<
+ typename add_const<attr_type>::type>::type
+ attr_reference_type;
+
+ // parameter_types is a sequence of types passed as parameters to the rule
+ typedef typename
+ spirit::detail::params_from_sig<sig_type>::type
+ parameter_types;
+
+ static size_t const params_size =
+ fusion::result_of::size<parameter_types>::type::value;
+
+ // the context passed to the right hand side of a rule contains
+ // the attribute and the parameters for this particular rule invocation
+ typedef context<
+ fusion::cons<attr_reference_type, parameter_types>
+ , locals_type>
+ context_type;
+
+ typedef function<
+ bool(output_iterator&, context_type&, delimiter_type const&)>
+ function_type;
+
+ typedef typename
+ mpl::if_<
+ is_same<encoding_type, unused_type>
+ , unused_type
+ , tag::char_code<tag::encoding, encoding_type>
+ >::type
+ encoding_modifier_type;
+
+ explicit rule(std::string const& name_ = "unnamed-rule")
+ : base_type(terminal::make(reference_(*this)))
+ , name_(name_)
+ {
+ }
+
+ rule(rule const& rhs)
+ : base_type(terminal::make(reference_(*this)))
+ , name_(rhs.name_)
+ , f(rhs.f)
+ {
+ }
+
+ template <typename Auto, typename Expr>
+ static void define(rule& lhs, Expr const& expr, mpl::false_)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ }
+
+ template <typename Auto, typename Expr>
+ static void define(rule& lhs, Expr const& expr, mpl::true_)
+ {
+ lhs.f = detail::bind_generator<Auto>(
+ compile<karma::domain>(expr, encoding_modifier_type()));
+ }
+
+ template <typename Expr>
+ rule (Expr const& expr, std::string const& name_ = "unnamed-rule")
+ : base_type(terminal::make(reference_(*this)))
+ , name_(name_)
+ {
+ define<mpl::false_>(*this, expr, traits::matches<karma::domain, Expr>());
+ }
+
+ rule& operator=(rule const& rhs)
+ {
+ // The following assertion fires when you try to initialize a rule
+ // from an uninitialized one. Did you mean to refer to the right
+ // hand side rule instead of assigning from it? In this case you
+ // should write lhs = rhs.alias();
+ BOOST_ASSERT(rhs.f && "Did you mean rhs.alias() instead of rhs?");
+
+ f = rhs.f;
+ name_ = rhs.name_;
+ return *this;
+ }
+
+ std::string const& name() const
+ {
+ return name_;
+ }
+
+ void name(std::string const& str)
+ {
+ name_ = str;
+ }
+
+ template <typename Expr>
+ rule& operator=(Expr const& expr)
+ {
+ define<mpl::false_>(*this, expr, traits::matches<karma::domain, Expr>());
+ return *this;
+ }
+
+// VC7.1 has problems to resolve 'rule' without explicit template parameters
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+ // g++ 3.3 barfs if this is a member function :(
+ template <typename Expr>
+ friend rule& operator%=(rule& r, Expr const& expr)
+ {
+ define<mpl::true_>(r, expr, traits::matches<karma::domain, Expr>());
+ return r;
+ }
+
+#if defined(BOOST_NO_RVALUE_REFERENCES)
+ // non-const version needed to suppress proto's %= kicking in
+ template <typename Expr>
+ friend rule& operator%=(rule& r, Expr& expr)
+ {
+ return r %= static_cast<Expr const&>(expr);
+ }
+#else
+ // for rvalue references
+ template <typename Expr>
+ friend rule& operator%=(rule& r, Expr&& expr)
+ {
+ define<mpl::true_>(r, expr, traits::matches<karma::domain, Expr>());
+ return r;
+ }
+#endif
+
+#else
+ // both friend functions have to be defined out of class as VC7.1
+ // will complain otherwise
+ template <typename OutputIterator_, typename T1_, typename T2_
+ , typename T3_, typename T4_, typename Expr>
+ friend rule<OutputIterator_, T1_, T2_, T3_, T4_>& operator%=(
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>&r, Expr const& expr);
+
+ // non-const version needed to suppress proto's %= kicking in
+ template <typename OutputIterator_, typename T1_, typename T2_
+ , typename T3_, typename T4_, typename Expr>
+ friend rule<OutputIterator_, T1_, T2_, T3_, T4_>& operator%=(
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>& r, Expr& expr);
+#endif
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef attr_type type;
+ };
+
+ template <typename Context, typename Delimiter, typename Attribute>
+ bool generate(output_iterator& sink, Context&, Delimiter const& delim
+ , Attribute const& attr) const
+ {
+ if (f)
+ {
+ // Create an attribute if none is supplied.
+ typedef traits::make_attribute<attr_type, Attribute>
+ make_attribute;
+ typedef traits::transform_attribute<
+ typename make_attribute::type, attr_type, domain>
+ transform;
+
+ typename transform::type attr_ =
+ traits::pre_transform<domain, attr_type>(
+ make_attribute::call(attr));
+
+ // If you are seeing a compilation error here, you are probably
+ // trying to use a rule or a grammar which has inherited
+ // attributes, without passing values for them.
+ context_type context(attr_);
+
+ // If you are seeing a compilation error here stating that the
+ // third parameter can't be converted to a karma::reference
+ // then you are probably trying to use a rule or a grammar with
+ // an incompatible delimiter type.
+ if (f(sink, context, delim))
+ {
+ // do a post-delimit if this is an implied verbatim
+ if (is_same<delimiter_type, unused_type>::value)
+ karma::delimit_out(sink, delim);
+
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context, typename Delimiter, typename Attribute
+ , typename Params>
+ bool generate(output_iterator& sink, Context& caller_context
+ , Delimiter const& delim, Attribute const& attr
+ , Params const& params) const
+ {
+ if (f)
+ {
+ // Create an attribute if none is supplied.
+ typedef traits::make_attribute<attr_type, Attribute>
+ make_attribute;
+ typedef traits::transform_attribute<
+ typename make_attribute::type, attr_type, domain>
+ transform;
+
+ typename transform::type attr_ =
+ traits::pre_transform<domain, attr_type>(
+ make_attribute::call(attr));
+
+ // If you are seeing a compilation error here, you are probably
+ // trying to use a rule or a grammar which has inherited
+ // attributes, passing values of incompatible types for them.
+ context_type context(attr_, params, caller_context);
+
+ // If you are seeing a compilation error here stating that the
+ // third parameter can't be converted to a karma::reference
+ // then you are probably trying to use a rule or a grammar with
+ // an incompatible delimiter type.
+ if (f(sink, context, delim))
+ {
+ // do a post-delimit if this is an implied verbatim
+ if (is_same<delimiter_type, unused_type>::value)
+ karma::delimit_out(sink, delim);
+
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info(name_);
+ }
+
+ reference_ alias() const
+ {
+ return reference_(*this);
+ }
+
+ typename proto::terminal<this_type>::type copy() const
+ {
+ typename proto::terminal<this_type>::type result = {*this};
+ return result;
+ }
+
+ // bring in the operator() overloads
+ rule const& get_parameterized_subject() const { return *this; }
+ typedef rule parameterized_subject_type;
+ #include <boost/spirit/home/karma/nonterminal/detail/fcall.hpp>
+
+ std::string name_;
+ function_type f;
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+ template <typename OutputIterator_, typename T1_, typename T2_
+ , typename T3_, typename T4_, typename Expr>
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>& operator%=(
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>&r, Expr const& expr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here, then
+ // the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+
+ typedef typename
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>::encoding_modifier_type
+ encoding_modifier_type;
+
+ r.f = detail::bind_generator<mpl::true_>(
+ compile<karma::domain>(expr, encoding_modifier_type()));
+ return r;
+ }
+
+ // non-const version needed to suppress proto's %= kicking in
+ template <typename OutputIterator_, typename T1_, typename T2_
+ , typename T3_, typename T4_, typename Expr>
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>& operator%=(
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>& r, Expr& expr)
+ {
+ return r %= static_cast<Expr const&>(expr);
+ }
+#endif
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ namespace detail
+ {
+ template <typename RuleAttribute, typename Attribute>
+ struct nonterminal_handles_container
+ : mpl::and_<
+ traits::is_container<RuleAttribute>
+ , is_convertible<Attribute, RuleAttribute> >
+ {};
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename IteratorA, typename IteratorB, typename Attribute
+ , typename Context, typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<
+ karma::rule<IteratorA, T1, T2, T3, T4>, Attribute, Context
+ , IteratorB>
+ : detail::nonterminal_handles_container<
+ typename attribute_of<
+ karma::rule<IteratorA, T1, T2, T3, T4>
+ , Context, IteratorB
+ >::type, Attribute>
+ {};
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/karma/nonterminal/simple_trace.hpp b/boost/spirit/home/karma/nonterminal/simple_trace.hpp
new file mode 100644
index 0000000000..97c768f894
--- /dev/null
+++ b/boost/spirit/home/karma/nonterminal/simple_trace.hpp
@@ -0,0 +1,134 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_KARMA_SIMPLE_TRACE_APR_21_2010_0155PM)
+#define BOOST_SPIRIT_KARMA_SIMPLE_TRACE_APR_21_2010_0155PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/karma/nonterminal/debug_handler_state.hpp>
+#include <boost/fusion/include/out.hpp>
+#include <iostream>
+
+// The stream to use for debug output
+#if !defined(BOOST_SPIRIT_DEBUG_OUT)
+#define BOOST_SPIRIT_DEBUG_OUT std::cerr
+#endif
+
+// number of tokens to print while debugging
+#if !defined(BOOST_SPIRIT_DEBUG_PRINT_SOME)
+#define BOOST_SPIRIT_DEBUG_PRINT_SOME 20
+#endif
+
+// number of spaces to indent
+#if !defined(BOOST_SPIRIT_DEBUG_INDENT)
+#define BOOST_SPIRIT_DEBUG_INDENT 2
+#endif
+
+namespace boost { namespace spirit { namespace karma
+{
+ struct simple_trace
+ {
+ int& get_indent() const
+ {
+ static int indent = 0;
+ return indent;
+ }
+
+ void print_indent() const
+ {
+ int n = get_indent();
+ n *= BOOST_SPIRIT_DEBUG_INDENT;
+ for (int i = 0; i != n; ++i)
+ BOOST_SPIRIT_DEBUG_OUT << ' ';
+ }
+
+ template <typename Buffer>
+ void print_some(char const* tag, Buffer const& buffer) const
+ {
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << '<' << tag << '>' << std::flush;
+ {
+ std::ostreambuf_iterator<char> out(BOOST_SPIRIT_DEBUG_OUT);
+ buffer.buffer_copy_to(out, BOOST_SPIRIT_DEBUG_PRINT_SOME);
+ }
+ BOOST_SPIRIT_DEBUG_OUT << "</" << tag << '>' << std::endl;
+ }
+
+ template <typename OutputIterator, typename Context, typename State
+ , typename Buffer>
+ void operator()(
+ OutputIterator&, Context const& context
+ , State state, std::string const& rule_name
+ , Buffer const& buffer) const
+ {
+ switch (state)
+ {
+ case pre_generate:
+ print_indent();
+ ++get_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << '<' << rule_name << '>' << std::endl;
+ print_indent();
+ ++get_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "<try>" << std::endl;;
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "<attributes>";
+ traits::print_attribute(
+ BOOST_SPIRIT_DEBUG_OUT,
+ context.attributes
+ );
+ BOOST_SPIRIT_DEBUG_OUT << "</attributes>" << std::endl;
+ if (!fusion::empty(context.locals))
+ {
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << "<locals>" << context.locals << "</locals>"
+ << std::endl;
+ }
+ --get_indent();
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "</try>" << std::endl;;
+ break;
+
+ case successful_generate:
+ print_indent();
+ ++get_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "<success>" << std::endl;
+ print_some("result", buffer);
+ if (!fusion::empty(context.locals))
+ {
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << "<locals>" << context.locals << "</locals>"
+ << std::endl;
+ }
+ --get_indent();
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "</success>" << std::endl;
+ --get_indent();
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << "</" << rule_name << '>' << std::endl;
+ break;
+
+ case failed_generate:
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "<fail/>" << std::endl;
+ --get_indent();
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << "</" << rule_name << '>' << std::endl;
+ break;
+ }
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/numeric.hpp b/boost/spirit/home/karma/numeric.hpp
new file mode 100644
index 0000000000..474fe8edcb
--- /dev/null
+++ b/boost/spirit/home/karma/numeric.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_NUMERIC_FEB_23_2007_0507PM)
+#define BOOST_SPIRIT_KARMA_NUMERIC_FEB_23_2007_0507PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/numeric/bool.hpp>
+#include <boost/spirit/home/karma/numeric/int.hpp>
+#include <boost/spirit/home/karma/numeric/uint.hpp>
+#include <boost/spirit/home/karma/numeric/real.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/numeric/bool.hpp b/boost/spirit/home/karma/numeric/bool.hpp
new file mode 100644
index 0000000000..82db0423fd
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/bool.hpp
@@ -0,0 +1,424 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_BOOL_SEP_28_2009_1113AM)
+#define BOOST_SPIRIT_KARMA_BOOL_SEP_28_2009_1113AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/limits.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/numeric_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/spirit/home/karma/detail/enable_lit.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/numeric/bool_policies.hpp>
+#include <boost/spirit/home/karma/numeric/detail/bool_utils.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ namespace karma
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // forward declaration only
+ template <typename T>
+ struct bool_policies;
+
+ ///////////////////////////////////////////////////////////////////////
+ // This is the class that the user can instantiate directly in
+ // order to create a customized bool generator
+ template <typename T = bool, typename Policies = bool_policies<T> >
+ struct bool_generator
+ : spirit::terminal<tag::stateful_tag<Policies, tag::bool_, T> >
+ {
+ typedef tag::stateful_tag<Policies, tag::bool_, T> tag_type;
+
+ bool_generator() {}
+ bool_generator(Policies const& data)
+ : spirit::terminal<tag_type>(data) {}
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, tag::bool_> // enables bool_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::true_> // enables true_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::false_> // enables false_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, bool> // enables lit(true)
+ : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables bool_(...)
+ , terminal_ex<tag::bool_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <> // enables *lazy* bool_(...)
+ struct use_lazy_terminal<karma::domain, tag::bool_, 1>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // enables any custom bool_generator
+ template <typename Policies, typename T>
+ struct use_terminal<karma::domain
+ , tag::stateful_tag<Policies, tag::bool_, T> >
+ : mpl::true_ {};
+
+ // enables any custom bool_generator(...)
+ template <typename Policies, typename T, typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::stateful_tag<Policies, tag::bool_, T>
+ , fusion::vector1<A0> > >
+ : mpl::true_ {};
+
+ // enables *lazy* custom bool_generator
+ template <typename Policies, typename T>
+ struct use_lazy_terminal<karma::domain
+ , tag::stateful_tag<Policies, tag::bool_, T>, 1>
+ : mpl::true_ {};
+
+ // enables lit(bool)
+ template <typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<traits::is_bool<A0> >::type>
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::bool_;
+ using spirit::true_;
+ using spirit::false_;
+ using spirit::lit; // lit(true) is equivalent to true
+#endif
+
+ using spirit::bool_type;
+ using spirit::true_type;
+ using spirit::false_type;
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization is used for bool generators not having a direct
+ // initializer: bool_. These generators must be used in conjunction with
+ // an Attribute.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename CharEncoding, typename Tag, typename Policies>
+ struct any_bool_generator
+ : primitive_generator<any_bool_generator<T, CharEncoding, Tag, Policies> >
+ {
+ public:
+ any_bool_generator(Policies const& p = Policies())
+ : p_(p) {}
+
+ typedef typename Policies::properties properties;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ // bool_ has a Attribute attached
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool
+ generate(OutputIterator& sink, Context& context, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ if (!traits::has_optional_value(attr))
+ return false; // fail if it's an uninitialized optional
+
+ return bool_inserter<T, Policies, CharEncoding, Tag>::call(
+ sink, traits::extract_from<T>(attr, context), p_) &&
+ delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // this bool_ has no Attribute attached, it needs to have been
+ // initialized from a direct literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool
+ generate(OutputIterator&, Context&, Delimiter const&, unused_type)
+ {
+ // It is not possible (doesn't make sense) to use boolean generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false, bool_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("bool");
+ }
+
+ Policies p_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization is used for bool generators having a direct
+ // initializer: bool_(true), bool_(0) etc.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename CharEncoding, typename Tag
+ , typename Policies, bool no_attribute>
+ struct literal_bool_generator
+ : primitive_generator<literal_bool_generator<T, CharEncoding, Tag
+ , Policies, no_attribute> >
+ {
+ public:
+ typedef typename Policies::properties properties;
+
+ template <typename Context, typename Unused = unused_type>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, T>
+ {};
+
+ literal_bool_generator(typename add_const<T>::type n
+ , Policies const& p = Policies())
+ : n_(n), p_(p) {}
+
+ // A bool_() which additionally has an associated attribute emits
+ // its immediate literal only if it matches the attribute, otherwise
+ // it fails.
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ typedef typename attribute<Context>::type attribute_type;
+ if (!traits::has_optional_value(attr) ||
+ bool(n_) != bool(traits::extract_from<attribute_type>(attr, context)))
+ {
+ return false;
+ }
+ return bool_inserter<T, Policies, CharEncoding, Tag>::
+ call(sink, n_, p_) && delimit_out(sink, d);
+ }
+
+ // A bool_() without any associated attribute just emits its
+ // immediate literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , unused_type) const
+ {
+ return bool_inserter<T, Policies, CharEncoding, Tag>::
+ call(sink, n_) && delimit_out(sink, d);
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("bool");
+ }
+
+ T n_;
+ Policies p_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Modifiers, typename T = bool
+ , typename Policies = bool_policies<T> >
+ struct make_bool
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef any_bool_generator<
+ T
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , Policies
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ typedef tag::stateful_tag<Policies, tag::bool_, T> tag_type;
+ using spirit::detail::get_stateful_data;
+ return result_type(get_stateful_data<tag_type>::call(term));
+ }
+ };
+
+ template <typename Modifiers, bool b>
+ struct make_bool_literal
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_bool_generator<
+ bool
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , bool_policies<>, false
+ > result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type(b);
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::bool_, Modifiers>
+ : detail::make_bool<Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::true_, Modifiers>
+ : detail::make_bool_literal<Modifiers, true> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::false_, Modifiers>
+ : detail::make_bool_literal<Modifiers, false> {};
+
+ template <typename T, typename Policies, typename Modifiers>
+ struct make_primitive<
+ tag::stateful_tag<Policies, tag::bool_, T>, Modifiers>
+ : detail::make_bool<Modifiers
+ , typename remove_const<T>::type, Policies> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Modifiers, typename T = bool
+ , typename Policies = bool_policies<T> >
+ struct make_bool_direct
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_bool_generator<
+ T
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , Policies, false
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ typedef tag::stateful_tag<Policies, tag::bool_, T> tag_type;
+ using spirit::detail::get_stateful_data;
+ return result_type(fusion::at_c<0>(term.args)
+ , get_stateful_data<tag_type>::call(term.term));
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::bool_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_bool_direct<Modifiers> {};
+
+ template <typename T, typename Policies, typename A0, typename Modifiers>
+ struct make_primitive<
+ terminal_ex<tag::stateful_tag<Policies, tag::bool_, T>
+ , fusion::vector1<A0> >
+ , Modifiers>
+ : detail::make_bool_direct<Modifiers
+ , typename remove_const<T>::type, Policies> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Modifiers>
+ struct basic_bool_literal
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_bool_generator<
+ bool
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , bool_policies<>, true
+ > result_type;
+
+ template <typename T_>
+ result_type operator()(T_ i, unused_type) const
+ {
+ return result_type(i);
+ }
+ };
+ }
+
+ template <typename Modifiers>
+ struct make_primitive<bool, Modifiers>
+ : detail::basic_bool_literal<Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers
+ , typename enable_if<traits::is_bool<A0> >::type>
+ : detail::basic_bool_literal<Modifiers>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_bool_generator<
+ bool
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , bool_policies<>, true
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/numeric/bool_policies.hpp b/boost/spirit/home/karma/numeric/bool_policies.hpp
new file mode 100644
index 0000000000..5afc0b8a6a
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/bool_policies.hpp
@@ -0,0 +1,117 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_BOOL_POLICIES_SEP_28_2009_1203PM)
+#define BOOST_SPIRIT_KARMA_BOOL_POLICIES_SEP_28_2009_1203PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/char.hpp>
+#include <boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // bool_policies, if you need special handling of your boolean output
+ // just overload this policy class and use it as a template
+ // parameter to the karma::bool_generator boolean generator
+ //
+ // struct special_bool_policy : karma::bool_policies<>
+ // {
+ // // we want to spell the names of false as eurt (true backwards)
+ // template <typename CharEncoding, typename Tag
+ // , typename OutputIterator>
+ // static bool generate_false(OutputIterator& sink, bool)
+ // {
+ // return string_inserter<CharEncoding, Tag>::call(sink, "eurt");
+ // }
+ // };
+ //
+ // typedef karma::bool_generator<special_bool_policy> backwards_bool;
+ //
+ // karma::generate(sink, backwards_bool(), false); // will output: eurt
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T = bool>
+ struct bool_policies
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // Expose the data type the generator is targeted at
+ ///////////////////////////////////////////////////////////////////////
+ typedef T value_type;
+
+ ///////////////////////////////////////////////////////////////////////
+ // By default the policy doesn't require any special iterator
+ // functionality. The boolean generator exposes its properties
+ // from here, so this needs to be updated in case other properties
+ // need to be implemented.
+ ///////////////////////////////////////////////////////////////////////
+ typedef mpl::int_<generator_properties::no_properties> properties;
+
+ ///////////////////////////////////////////////////////////////////////
+ // This is the main function used to generate the output for a
+ // boolean. It is called by the boolean generator in order
+ // to perform the conversion. In theory all of the work can be
+ // implemented here, but it is the easiest to use existing
+ // functionality provided by the type specified by the template
+ // parameter `Inserter`.
+ //
+ // sink: the output iterator to use for generation
+ // n: the floating point number to convert
+ // p: the instance of the policy type used to instantiate this
+ // floating point generator.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Inserter, typename OutputIterator, typename Policies>
+ static bool
+ call (OutputIterator& sink, T n, Policies const& p)
+ {
+ return Inserter::call_n(sink, n, p);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Print the textual representations of a true boolean value
+ //
+ // sink The output iterator to use for generation
+ // b The boolean value to convert.
+ //
+ // The CharEncoding and Tag template parameters are either of the type
+ // unused_type or describes the character class and conversion to be
+ // applied to any output possibly influenced by either the lower[...]
+ // or upper[...] directives.
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag, typename OutputIterator>
+ static bool generate_true(OutputIterator& sink, T)
+ {
+ return string_inserter<CharEncoding, Tag>::call(sink, "true");
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Print the textual representations of a false boolean value
+ //
+ // sink The output iterator to use for generation
+ // b The boolean value to convert.
+ //
+ // The CharEncoding and Tag template parameters are either of the type
+ // unused_type or describes the character class and conversion to be
+ // applied to any output possibly influenced by either the lower[...]
+ // or upper[...] directives.
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag, typename OutputIterator>
+ static bool generate_false(OutputIterator& sink, T)
+ {
+ return string_inserter<CharEncoding, Tag>::call(sink, "false");
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/numeric/detail/bool_utils.hpp b/boost/spirit/home/karma/numeric/detail/bool_utils.hpp
new file mode 100644
index 0000000000..7747c753a4
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/detail/bool_utils.hpp
@@ -0,0 +1,67 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_BOOL_UTILS_SEP_28_2009_0644PM)
+#define BOOST_SPIRIT_KARMA_BOOL_UTILS_SEP_28_2009_0644PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/spirit/home/karma/detail/string_generate.hpp>
+#include <boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>
+#include <boost/detail/workaround.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The bool_inserter template takes care of the boolean to string
+ // conversion. The Policies template parameter is used to allow
+ // customization of the formatting process
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct bool_policies;
+
+ template <typename T
+ , typename Policies = bool_policies<T>
+ , typename CharEncoding = unused_type
+ , typename Tag = unused_type>
+ struct bool_inserter
+ {
+ template <typename OutputIterator, typename U>
+ static bool
+ call (OutputIterator& sink, U b, Policies const& p = Policies())
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ p; // suppresses warning: C4100: 'p' : unreferenced formal parameter
+#endif
+ return p.template call<bool_inserter>(sink, T(b), p);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // This is the workhorse behind the real generator
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename U>
+ static bool
+ call_n (OutputIterator& sink, U b, Policies const& p)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ p; // suppresses warning: C4100: 'p' : unreferenced formal parameter
+#endif
+ if (b)
+ return p.template generate_true<CharEncoding, Tag>(sink, b);
+ return p.template generate_false<CharEncoding, Tag>(sink, b);
+ }
+ };
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp b/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp
new file mode 100644
index 0000000000..e1332d2367
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp
@@ -0,0 +1,770 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_NUMERIC_UTILS_FEB_23_2007_0841PM)
+#define BOOST_SPIRIT_KARMA_NUMERIC_UTILS_FEB_23_2007_0841PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/limits.hpp>
+
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/numeric_traits.hpp>
+#include <boost/spirit/home/support/detail/pow10.hpp>
+#include <boost/spirit/home/support/detail/sign.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/spirit/home/karma/detail/string_generate.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The value BOOST_KARMA_NUMERICS_LOOP_UNROLL specifies, how to unroll the
+// integer string generation loop (see below).
+//
+// Set the value to some integer in between 0 (no unrolling) and the
+// largest expected generated integer string length (complete unrolling).
+// If not specified, this value defaults to 6.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_KARMA_NUMERICS_LOOP_UNROLL)
+#define BOOST_KARMA_NUMERICS_LOOP_UNROLL 6
+#endif
+
+#if BOOST_KARMA_NUMERICS_LOOP_UNROLL < 0
+#error "Please set the BOOST_KARMA_NUMERICS_LOOP_UNROLL to a non-negative value!"
+#endif
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // return the absolute value from a given number, avoiding over- and
+ // underflow
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable/* = void*/>
+ struct absolute_value
+ {
+ typedef T type;
+ static T call (T n)
+ {
+ // allow for ADL to find the correct overloads for fabs
+ using namespace std;
+ return fabs(n);
+ }
+ };
+
+#define BOOST_SPIRIT_ABSOLUTE_VALUE(signedtype, unsignedtype) \
+ template <> \
+ struct absolute_value<signedtype> \
+ { \
+ typedef unsignedtype type; \
+ static type call(signedtype n) \
+ { \
+ return (n >= 0) ? n : (unsignedtype)(-n); \
+ } \
+ } \
+ /**/
+#define BOOST_SPIRIT_ABSOLUTE_VALUE_UNSIGNED(unsignedtype) \
+ template <> \
+ struct absolute_value<unsignedtype> \
+ { \
+ typedef unsignedtype type; \
+ static type call(unsignedtype n) \
+ { \
+ return n; \
+ } \
+ } \
+ /**/
+
+ BOOST_SPIRIT_ABSOLUTE_VALUE(signed char, unsigned char);
+ BOOST_SPIRIT_ABSOLUTE_VALUE(char, unsigned char);
+ BOOST_SPIRIT_ABSOLUTE_VALUE(short, unsigned short);
+ BOOST_SPIRIT_ABSOLUTE_VALUE(int, unsigned int);
+ BOOST_SPIRIT_ABSOLUTE_VALUE(long, unsigned long);
+ BOOST_SPIRIT_ABSOLUTE_VALUE_UNSIGNED(unsigned char);
+ BOOST_SPIRIT_ABSOLUTE_VALUE_UNSIGNED(unsigned short);
+ BOOST_SPIRIT_ABSOLUTE_VALUE_UNSIGNED(unsigned int);
+ BOOST_SPIRIT_ABSOLUTE_VALUE_UNSIGNED(unsigned long);
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_SPIRIT_ABSOLUTE_VALUE(boost::long_long_type, boost::ulong_long_type);
+ BOOST_SPIRIT_ABSOLUTE_VALUE_UNSIGNED(boost::ulong_long_type);
+#endif
+
+#undef BOOST_SPIRIT_ABSOLUTE_VALUE
+#undef BOOST_SPIRIT_ABSOLUTE_VALUE_UNSIGNED
+
+ template <>
+ struct absolute_value<float>
+ {
+ typedef float type;
+ static type call(float n)
+ {
+ return (spirit::detail::signbit)(n) ? -n : n;
+ }
+ };
+
+ template <>
+ struct absolute_value<double>
+ {
+ typedef double type;
+ static type call(double n)
+ {
+ return (spirit::detail::signbit)(n) ? -n : n;
+ }
+ };
+
+ template <>
+ struct absolute_value<long double>
+ {
+ typedef long double type;
+ static type call(long double n)
+ {
+ return (spirit::detail::signbit)(n) ? -n : n;
+ }
+ };
+
+ // specialization for pointers
+ template <typename T>
+ struct absolute_value<T*>
+ {
+ typedef std::size_t type;
+ static type call (T* p)
+ {
+ return std::size_t(p);
+ }
+ };
+
+ template <typename T>
+ inline typename absolute_value<T>::type
+ get_absolute_value(T n)
+ {
+ return absolute_value<T>::call(n);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable/* = void*/>
+ struct is_negative
+ {
+ static bool call(T n)
+ {
+ return (n < 0) ? true : false;
+ }
+ };
+
+ template <>
+ struct is_negative<float>
+ {
+ static bool call(float n)
+ {
+ return (spirit::detail::signbit)(n) ? true : false;
+ }
+ };
+
+ template <>
+ struct is_negative<double>
+ {
+ static bool call(double n)
+ {
+ return (spirit::detail::signbit)(n) ? true : false;
+ }
+ };
+
+ template <>
+ struct is_negative<long double>
+ {
+ static bool call(long double n)
+ {
+ return (spirit::detail::signbit)(n) ? true : false;
+ }
+ };
+
+ template <typename T>
+ inline bool test_negative(T n)
+ {
+ return is_negative<T>::call(n);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable/* = void*/>
+ struct is_zero
+ {
+ static bool call(T n)
+ {
+ return (n == 0) ? true : false;
+ }
+ };
+
+ template <>
+ struct is_zero<float>
+ {
+ static bool call(float n)
+ {
+ return (math::fpclassify)(n) == FP_ZERO;
+ }
+ };
+
+ template <>
+ struct is_zero<double>
+ {
+ static bool call(double n)
+ {
+ return (math::fpclassify)(n) == FP_ZERO;
+ }
+ };
+
+ template <>
+ struct is_zero<long double>
+ {
+ static bool call(long double n)
+ {
+ return (math::fpclassify)(n) == FP_ZERO;
+ }
+ };
+
+ template <typename T>
+ inline bool test_zero(T n)
+ {
+ return is_zero<T>::call(n);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable/* = void*/>
+ struct is_nan
+ {
+ static bool call(T n)
+ {
+ // NaN numbers are not equal to anything
+ return (n != n) ? true : false;
+ }
+ };
+
+ template <>
+ struct is_nan<float>
+ {
+ static bool call(float n)
+ {
+ return (math::fpclassify)(n) == FP_NAN;
+ }
+ };
+
+ template <>
+ struct is_nan<double>
+ {
+ static bool call(double n)
+ {
+ return (math::fpclassify)(n) == FP_NAN;
+ }
+ };
+
+ template <>
+ struct is_nan<long double>
+ {
+ static bool call(long double n)
+ {
+ return (math::fpclassify)(n) == FP_NAN;
+ }
+ };
+
+ template <typename T>
+ inline bool test_nan(T n)
+ {
+ return is_nan<T>::call(n);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable/* = void*/>
+ struct is_infinite
+ {
+ static bool call(T n)
+ {
+ return (n == std::numeric_limits<T>::infinity()) ? true : false;
+ }
+ };
+
+ template <>
+ struct is_infinite<float>
+ {
+ static bool call(float n)
+ {
+ return (math::fpclassify)(n) == FP_INFINITE;
+ }
+ };
+
+ template <>
+ struct is_infinite<double>
+ {
+ static bool call(double n)
+ {
+ return (math::fpclassify)(n) == FP_INFINITE;
+ }
+ };
+
+ template <>
+ struct is_infinite<long double>
+ {
+ static bool call(long double n)
+ {
+ return (math::fpclassify)(n) == FP_INFINITE;
+ }
+ };
+
+ template <typename T>
+ inline bool test_infinite(T n)
+ {
+ return is_infinite<T>::call(n);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ struct cast_to_long
+ {
+ static long call(float n, mpl::false_)
+ {
+ return static_cast<long>(std::floor(n));
+ }
+
+ static long call(double n, mpl::false_)
+ {
+ return static_cast<long>(std::floor(n));
+ }
+
+ static long call(long double n, mpl::false_)
+ {
+ return static_cast<long>(std::floor(n));
+ }
+
+ template <typename T>
+ static long call(T n, mpl::false_)
+ {
+ // allow for ADL to find the correct overload for floor and
+ // lround
+ using namespace std;
+ return lround(floor(n));
+ }
+
+ template <typename T>
+ static long call(T n, mpl::true_)
+ {
+ return static_cast<long>(n);
+ }
+
+ template <typename T>
+ static long call(T n)
+ {
+ return call(n, mpl::bool_<is_integral<T>::value>());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ struct truncate_to_long
+ {
+ static long call(float n, mpl::false_)
+ {
+ return test_negative(n) ? static_cast<long>(std::ceil(n)) :
+ static_cast<long>(std::floor(n));
+ }
+
+ static long call(double n, mpl::false_)
+ {
+ return test_negative(n) ? static_cast<long>(std::ceil(n)) :
+ static_cast<long>(std::floor(n));
+ }
+
+ static long call(long double n, mpl::false_)
+ {
+ return test_negative(n) ? static_cast<long>(std::ceil(n)) :
+ static_cast<long>(std::floor(n));
+ }
+
+ template <typename T>
+ static long call(T n, mpl::false_)
+ {
+ // allow for ADL to find the correct overloads for ltrunc
+ using namespace std;
+ return ltrunc(n);
+ }
+
+ template <typename T>
+ static long call(T n, mpl::true_)
+ {
+ return static_cast<long>(n);
+ }
+
+ template <typename T>
+ static long call(T n)
+ {
+ return call(n, mpl::bool_<is_integral<T>::value>());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ // Traits class for radix specific number conversion
+ //
+ // Convert a digit from binary representation to character
+ // representation:
+ //
+ // static int call(unsigned n);
+ //
+ ///////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename CharEncoding, typename Tag, bool radix_less_than_10>
+ struct convert_digit
+ {
+ static int call(unsigned n)
+ {
+ if (n <= 9)
+ return n + '0';
+
+ using spirit::char_class::convert;
+ return convert<CharEncoding>::to(Tag(), n - 10 + 'a');
+ }
+ };
+
+ template <>
+ struct convert_digit<unused_type, unused_type, false>
+ {
+ static int call(unsigned n)
+ {
+ if (n <= 9)
+ return n + '0';
+ return n - 10 + 'a';
+ }
+ };
+
+ template <typename CharEncoding, typename Tag>
+ struct convert_digit<CharEncoding, Tag, true>
+ {
+ static int call(unsigned n)
+ {
+ return n + '0';
+ }
+ };
+ }
+
+ template <unsigned Radix, typename CharEncoding, typename Tag>
+ struct convert_digit
+ : detail::convert_digit<CharEncoding, Tag, (Radix <= 10) ? true : false>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////
+ template <unsigned Radix>
+ struct divide
+ {
+ template <typename T>
+ static T call(T& n, mpl::true_)
+ {
+ return n / Radix;
+ }
+
+ template <typename T>
+ static T call(T& n, mpl::false_)
+ {
+ // Allow ADL to find the correct overload for floor
+ using namespace std;
+ return floor(n / Radix);
+ }
+
+ template <typename T>
+ static T call(T& n, T const&, int)
+ {
+ return call(n, mpl::bool_<is_integral<T>::value>());
+ }
+
+ template <typename T>
+ static T call(T& n)
+ {
+ return call(n, mpl::bool_<is_integral<T>::value>());
+ }
+ };
+
+ // specialization for division by 10
+ template <>
+ struct divide<10>
+ {
+ template <typename T>
+ static T call(T& n, T, int, mpl::true_)
+ {
+ return n / 10;
+ }
+
+ template <typename T>
+ static T call(T, T& num, int exp, mpl::false_)
+ {
+ // Allow ADL to find the correct overload for floor
+ using namespace std;
+ return floor(num / spirit::traits::pow10<T>(exp));
+ }
+
+ template <typename T>
+ static T call(T& n, T& num, int exp)
+ {
+ return call(n, num, exp, mpl::bool_<is_integral<T>::value>());
+ }
+
+ template <typename T>
+ static T call(T& n)
+ {
+ return call(n, n, 1, mpl::bool_<is_integral<T>::value>());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <unsigned Radix>
+ struct remainder
+ {
+ template <typename T>
+ static long call(T n, mpl::true_)
+ {
+ // this cast is safe since we know the result is not larger
+ // than Radix
+ return static_cast<long>(n % Radix);
+ }
+
+ template <typename T>
+ static long call(T n, mpl::false_)
+ {
+ // Allow ADL to find the correct overload for fmod
+ using namespace std;
+ return cast_to_long::call(fmod(n, T(Radix)));
+ }
+
+ template <typename T>
+ static long call(T n)
+ {
+ return call(n, mpl::bool_<is_integral<T>::value>());
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The int_inserter template takes care of the integer to string
+ // conversion. If specified, the loop is unrolled for better performance.
+ //
+ // Set the value BOOST_KARMA_NUMERICS_LOOP_UNROLL to some integer in
+ // between 0 (no unrolling) and the largest expected generated integer
+ // string length (complete unrolling).
+ // If not specified, this value defaults to 6.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+#define BOOST_KARMA_NUMERICS_INNER_LOOP_PREFIX(z, x, data) \
+ if (!traits::test_zero(n)) { \
+ int ch = radix_type::call(remainder_type::call(n)); \
+ n = divide_type::call(n, num, ++exp); \
+ /**/
+
+#define BOOST_KARMA_NUMERICS_INNER_LOOP_SUFFIX(z, x, data) \
+ *sink = char(ch); \
+ ++sink; \
+ } \
+ /**/
+
+ template <
+ unsigned Radix, typename CharEncoding = unused_type
+ , typename Tag = unused_type>
+ struct int_inserter
+ {
+ typedef traits::convert_digit<Radix, CharEncoding, Tag> radix_type;
+ typedef traits::divide<Radix> divide_type;
+ typedef traits::remainder<Radix> remainder_type;
+
+ template <typename OutputIterator, typename T>
+ static bool
+ call(OutputIterator& sink, T n, T& num, int exp)
+ {
+ // remainder_type::call returns n % Radix
+ int ch = radix_type::call(remainder_type::call(n));
+ n = divide_type::call(n, num, ++exp);
+
+ BOOST_PP_REPEAT(
+ BOOST_KARMA_NUMERICS_LOOP_UNROLL,
+ BOOST_KARMA_NUMERICS_INNER_LOOP_PREFIX, _);
+
+ if (!traits::test_zero(n))
+ call(sink, n, num, exp);
+
+ BOOST_PP_REPEAT(
+ BOOST_KARMA_NUMERICS_LOOP_UNROLL,
+ BOOST_KARMA_NUMERICS_INNER_LOOP_SUFFIX, _);
+
+ *sink = char(ch);
+ ++sink;
+ return true;
+ }
+
+ // Common code for integer string representations
+ template <typename OutputIterator, typename T>
+ static bool
+ call(OutputIterator& sink, T n)
+ {
+ return call(sink, n, n, 0);
+ }
+
+ private:
+ // helper function returning the biggest number representable either in
+ // a boost::long_long_type (if this does exist) or in a plain long
+ // otherwise
+#if defined(BOOST_HAS_LONG_LONG)
+ typedef boost::long_long_type biggest_long_type;
+#else
+ typedef long biggest_long_type;
+#endif
+
+ static biggest_long_type max_long()
+ {
+ return (std::numeric_limits<biggest_long_type>::max)();
+ }
+
+ public:
+ // Specialization for doubles and floats, falling back to long integers
+ // for representable values. These specializations speed up formatting
+ // of floating point numbers considerably as all the required
+ // arithmetics will be executed using integral data types.
+ template <typename OutputIterator>
+ static bool
+ call(OutputIterator& sink, long double n)
+ {
+ if (std::fabs(n) < max_long())
+ {
+ biggest_long_type l((biggest_long_type)n);
+ return call(sink, l, l, 0);
+ }
+ return call(sink, n, n, 0);
+ }
+ template <typename OutputIterator>
+ static bool
+ call(OutputIterator& sink, double n)
+ {
+ if (std::fabs(n) < max_long())
+ {
+ biggest_long_type l((biggest_long_type)n);
+ return call(sink, l, l, 0);
+ }
+ return call(sink, n, n, 0);
+ }
+ template <typename OutputIterator>
+ static bool
+ call(OutputIterator& sink, float n)
+ {
+ if (std::fabs(n) < max_long())
+ {
+ biggest_long_type l((biggest_long_type)n);
+ return call(sink, l, l, 0);
+ }
+ return call(sink, n, n, 0);
+ }
+ };
+
+#undef BOOST_KARMA_NUMERICS_INNER_LOOP_PREFIX
+#undef BOOST_KARMA_NUMERICS_INNER_LOOP_SUFFIX
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The uint_inserter template takes care of the conversion of any integer
+ // to a string, while interpreting the number as an unsigned type.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ unsigned Radix, typename CharEncoding = unused_type
+ , typename Tag = unused_type>
+ struct uint_inserter : int_inserter<Radix, CharEncoding, Tag>
+ {
+ typedef int_inserter<Radix, CharEncoding, Tag> base_type;
+
+ // Common code for integer string representations
+ template <typename OutputIterator, typename T>
+ static bool
+ call(OutputIterator& sink, T const& n)
+ {
+ typedef typename traits::absolute_value<T>::type type;
+ type un = type(n);
+ return base_type::call(sink, un, un, 0);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The sign_inserter template generates a sign for a given numeric value.
+ //
+ // The parameter forcesign allows to generate a sign even for positive
+ // numbers.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct sign_inserter
+ {
+ template <typename OutputIterator>
+ static bool
+ call_noforce(OutputIterator& sink, bool /*is_zero*/, bool is_negative)
+ {
+ // generate a sign for negative numbers only
+ if (is_negative) {
+ *sink = '-';
+ ++sink;
+ }
+ return true;
+ }
+
+ template <typename OutputIterator>
+ static bool
+ call_force(OutputIterator& sink, bool is_zero, bool is_negative)
+ {
+ // generate a sign for all numbers except zero
+ if (!is_zero)
+ *sink = is_negative ? '-' : '+';
+ else
+ *sink = ' ';
+
+ ++sink;
+ return true;
+ }
+
+ template <typename OutputIterator>
+ static bool
+ call(OutputIterator& sink, bool is_zero, bool is_negative
+ , bool forcesign)
+ {
+ return forcesign ?
+ call_force(sink, is_zero, is_negative) :
+ call_noforce(sink, is_zero, is_negative);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // These are helper functions for the real policies allowing to generate
+ // a single character and a string
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding = unused_type, typename Tag = unused_type>
+ struct char_inserter
+ {
+ template <typename OutputIterator, typename Char>
+ static bool call(OutputIterator& sink, Char c)
+ {
+ return detail::generate_to(sink, c, CharEncoding(), Tag());
+ }
+ };
+
+ template <typename CharEncoding = unused_type, typename Tag = unused_type>
+ struct string_inserter
+ {
+ template <typename OutputIterator, typename String>
+ static bool call(OutputIterator& sink, String str)
+ {
+ return detail::string_generate(sink, str, CharEncoding(), Tag());
+ }
+ };
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/numeric/detail/real_utils.hpp b/boost/spirit/home/karma/numeric/detail/real_utils.hpp
new file mode 100644
index 0000000000..493cf3b1a7
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/detail/real_utils.hpp
@@ -0,0 +1,185 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_REAL_UTILS_FEB_23_2007_0841PM)
+#define BOOST_SPIRIT_KARMA_REAL_UTILS_FEB_23_2007_0841PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/limits.hpp>
+
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/detail/pow10.hpp>
+#include <boost/spirit/home/support/detail/sign.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+#include <boost/spirit/home/karma/detail/string_generate.hpp>
+#include <boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The real_inserter template takes care of the floating point number to
+ // string conversion. The Policies template parameter is used to allow
+ // customization of the formatting process
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct real_policies;
+
+ template <typename T
+ , typename Policies = real_policies<T>
+ , typename CharEncoding = unused_type
+ , typename Tag = unused_type>
+ struct real_inserter
+ {
+ template <typename OutputIterator, typename U>
+ static bool
+ call (OutputIterator& sink, U n, Policies const& p = Policies())
+ {
+ if (traits::test_nan(n)) {
+ return Policies::template nan<CharEncoding, Tag>(
+ sink, n, p.force_sign(n));
+ }
+ else if (traits::test_infinite(n)) {
+ return Policies::template inf<CharEncoding, Tag>(
+ sink, n, p.force_sign(n));
+ }
+ return p.template call<real_inserter>(sink, n, p);
+ }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4100) // 'p': unreferenced formal parameter
+# pragma warning(disable: 4127) // conditional expression is constant
+# pragma warning(disable: 4267) // conversion from 'size_t' to 'unsigned int', possible loss of data
+#endif
+ ///////////////////////////////////////////////////////////////////////
+ // This is the workhorse behind the real generator
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename U>
+ static bool
+ call_n (OutputIterator& sink, U n, Policies const& p)
+ {
+ // prepare sign and get output format
+ bool force_sign = p.force_sign(n);
+ bool sign_val = false;
+ int flags = p.floatfield(n);
+ if (traits::test_negative(n))
+ {
+ n = -n;
+ sign_val = true;
+ }
+
+ // The scientific representation requires the normalization of the
+ // value to convert.
+
+ // get correct precision for generated number
+ unsigned precision = p.precision(n);
+ if (std::numeric_limits<U>::digits10)
+ {
+ // limit generated precision to digits10, if defined
+ precision = (std::min)(precision,
+ (unsigned)std::numeric_limits<U>::digits10 + 1);
+ }
+
+ // allow for ADL to find the correct overloads for log10 et.al.
+ using namespace std;
+
+ U dim = 0;
+ if (0 == (Policies::fmtflags::fixed & flags) && !traits::test_zero(n))
+ {
+ dim = log10(n);
+ if (dim > 0)
+ n /= spirit::traits::pow10<U>(traits::truncate_to_long::call(dim));
+ else if (n < 1.) {
+ long exp = traits::truncate_to_long::call(-dim);
+ if (exp != -dim)
+ ++exp;
+ dim = -exp;
+ n *= spirit::traits::pow10<U>(exp);
+ }
+ }
+
+ // prepare numbers (sign, integer and fraction part)
+ U integer_part;
+ U precexp = spirit::traits::pow10<U>(precision);
+ U fractional_part = modf(n, &integer_part);
+
+ fractional_part = floor(fractional_part * precexp + U(0.5));
+ if (fractional_part >= precexp)
+ {
+ fractional_part = floor(fractional_part - precexp);
+ integer_part += 1; // handle rounding overflow
+ }
+
+ // if trailing zeros are to be omitted, normalize the precision and
+ // fractional part
+ U long_int_part = floor(integer_part);
+ U long_frac_part = fractional_part;
+ unsigned prec = precision;
+ if (!p.trailing_zeros(n))
+ {
+ U frac_part_floor = long_frac_part;
+ if (0 != long_frac_part) {
+ // remove the trailing zeros
+ while (0 != prec &&
+ 0 == traits::remainder<10>::call(long_frac_part))
+ {
+ long_frac_part = traits::divide<10>::call(long_frac_part);
+ --prec;
+ }
+ }
+ else {
+ // if the fractional part is zero, we don't need to output
+ // any additional digits
+ prec = 0;
+ }
+
+ if (precision != prec)
+ {
+ long_frac_part = frac_part_floor /
+ spirit::traits::pow10<U>(precision-prec);
+ }
+ }
+
+ // call the actual generating functions to output the different parts
+ if (sign_val && traits::test_zero(long_int_part) &&
+ traits::test_zero(long_frac_part))
+ {
+ sign_val = false; // result is zero, no sign please
+ }
+
+ // generate integer part
+ bool r = p.integer_part(sink, long_int_part, sign_val, force_sign);
+
+ // generate decimal point
+ r = r && p.dot(sink, long_frac_part, precision);
+
+ // generate fractional part with the desired precision
+ r = r && p.fraction_part(sink, long_frac_part, prec, precision);
+
+ if (r && 0 == (Policies::fmtflags::fixed & flags)) {
+ return p.template exponent<CharEncoding, Tag>(sink,
+ traits::truncate_to_long::call(dim));
+ }
+ return r;
+ }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+ };
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/numeric/int.hpp b/boost/spirit/home/karma/numeric/int.hpp
new file mode 100644
index 0000000000..59d380497c
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/int.hpp
@@ -0,0 +1,525 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_INT_FEB_23_2007_0840PM)
+#define BOOST_SPIRIT_KARMA_INT_FEB_23_2007_0840PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/limits.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/numeric_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/support/detail/is_spirit_tag.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/spirit/home/karma/detail/enable_lit.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/value_at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ namespace tag
+ {
+ template <typename T, unsigned Radix, bool force_sign>
+ struct int_generator
+ {
+ BOOST_SPIRIT_IS_TAG()
+ };
+ }
+
+ namespace karma
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // This one is the class that the user can instantiate directly in
+ // order to create a customized int generator
+ template <typename T = int, unsigned Radix = 10, bool force_sign = false>
+ struct int_generator
+ : spirit::terminal<tag::int_generator<T, Radix, force_sign> >
+ {};
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, tag::short_> // enables short_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::int_> // enables int_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::long_> // enables long_
+ : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct use_terminal<karma::domain, tag::long_long> // enables long_long
+ : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, short> // enables lit(short(0))
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, int> // enables lit(0)
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, long> // enables lit(0L)
+ : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct use_terminal<karma::domain, boost::long_long_type> // enables lit(0LL)
+ : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A0>
+ struct use_terminal<karma::domain // enables short_(...)
+ , terminal_ex<tag::short_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables int_(...)
+ , terminal_ex<tag::int_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables long_(...)
+ , terminal_ex<tag::long_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename A0>
+ struct use_terminal<karma::domain // enables long_long(...)
+ , terminal_ex<tag::long_long, fusion::vector1<A0> >
+ > : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables *lazy* short_(...)
+ struct use_lazy_terminal<karma::domain, tag::short_, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* int_(...)
+ struct use_lazy_terminal<karma::domain, tag::int_, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* long_(...)
+ struct use_lazy_terminal<karma::domain, tag::long_, 1>
+ : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <> // enables *lazy* long_long(...)
+ struct use_lazy_terminal<karma::domain, tag::long_long, 1>
+ : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // enables any custom int_generator
+ template <typename T, unsigned Radix, bool force_sign>
+ struct use_terminal<karma::domain, tag::int_generator<T, Radix, force_sign> >
+ : mpl::true_ {};
+
+ // enables any custom int_generator(...)
+ template <typename T, unsigned Radix, bool force_sign, typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::int_generator<T, Radix, force_sign>
+ , fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ // enables *lazy* custom int_generator
+ template <typename T, unsigned Radix, bool force_sign>
+ struct use_lazy_terminal<
+ karma::domain
+ , tag::int_generator<T, Radix, force_sign>
+ , 1 // arity
+ > : mpl::true_ {};
+
+ // enables lit(int)
+ template <typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<traits::is_int<A0> >::type>
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::short_;
+ using spirit::int_;
+ using spirit::long_;
+#ifdef BOOST_HAS_LONG_LONG
+ using spirit::long_long;
+#endif
+ using spirit::lit; // lit(1) is equivalent to 1
+#endif
+
+ using spirit::short_type;
+ using spirit::int_type;
+ using spirit::long_type;
+#ifdef BOOST_HAS_LONG_LONG
+ using spirit::long_long_type;
+#endif
+
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization is used for int generators not having a direct
+ // initializer: int_, long_ etc. These generators must be used in
+ // conjunction with an Attribute.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T, typename CharEncoding, typename Tag, unsigned Radix
+ , bool force_sign>
+ struct any_int_generator
+ : primitive_generator<any_int_generator<T, CharEncoding, Tag, Radix
+ , force_sign> >
+ {
+ private:
+ template <typename OutputIterator, typename Attribute>
+ static bool insert_int(OutputIterator& sink, Attribute const& attr)
+ {
+ return sign_inserter::call(sink, traits::test_zero(attr)
+ , traits::test_negative(attr), force_sign) &&
+ int_inserter<Radix, CharEncoding, Tag>::call(sink
+ , traits::get_absolute_value(attr));
+ }
+
+ public:
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ // check template Attribute 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16,
+ not_supported_radix, ());
+
+ BOOST_SPIRIT_ASSERT_MSG(std::numeric_limits<T>::is_signed,
+ signed_unsigned_mismatch, ());
+
+ // int has a Attribute attached
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ static bool
+ generate(OutputIterator& sink, Context& context, Delimiter const& d
+ , Attribute const& attr)
+ {
+ if (!traits::has_optional_value(attr))
+ return false; // fail if it's an uninitialized optional
+
+ return insert_int(sink, traits::extract_from<T>(attr, context)) &&
+ delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // this int has no Attribute attached, it needs to have been
+ // initialized from a direct literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool
+ generate(OutputIterator&, Context&, Delimiter const&, unused_type)
+ {
+ // It is not possible (doesn't make sense) to use numeric generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false, int_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("integer");
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization is used for int generators having a direct
+ // initializer: int_(10), long_(20) etc.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T, typename CharEncoding, typename Tag, unsigned Radix
+ , bool force_sign, bool no_attribute>
+ struct literal_int_generator
+ : primitive_generator<literal_int_generator<T, CharEncoding, Tag, Radix
+ , force_sign, no_attribute> >
+ {
+ private:
+ template <typename OutputIterator, typename Attribute>
+ static bool insert_int(OutputIterator& sink, Attribute const& attr)
+ {
+ return sign_inserter::call(sink, traits::test_zero(attr)
+ , traits::test_negative(attr), force_sign) &&
+ int_inserter<Radix, CharEncoding, Tag>::call(sink
+ , traits::get_absolute_value(attr));
+ }
+
+ public:
+ template <typename Context, typename Unused = unused_type>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, T>
+ {};
+
+ literal_int_generator(typename add_const<T>::type n)
+ : n_(n) {}
+
+ // check template Attribute 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16,
+ not_supported_radix, ());
+
+ BOOST_SPIRIT_ASSERT_MSG(std::numeric_limits<T>::is_signed,
+ signed_unsigned_mismatch, ());
+
+ // A int_(1) which additionally has an associated attribute emits
+ // its immediate literal only if it matches the attribute, otherwise
+ // it fails.
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ typedef typename attribute<Context>::type attribute_type;
+ if (!traits::has_optional_value(attr) ||
+ n_ != traits::extract_from<attribute_type>(attr, context))
+ {
+ return false;
+ }
+ return insert_int(sink, n_) && delimit_out(sink, d);
+ }
+
+ // A int_(1) without any associated attribute just emits its
+ // immediate literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , unused_type) const
+ {
+ return insert_int(sink, n_) && delimit_out(sink, d);
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("integer");
+ }
+
+ T n_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers, unsigned Radix = 10
+ , bool force_sign = false>
+ struct make_int
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef any_int_generator<
+ T
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , Radix
+ , force_sign
+ > result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::short_, Modifiers>
+ : detail::make_int<short, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::int_, Modifiers>
+ : detail::make_int<int, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::long_, Modifiers>
+ : detail::make_int<long, Modifiers> {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers>
+ struct make_primitive<tag::long_long, Modifiers>
+ : detail::make_int<boost::long_long_type, Modifiers> {};
+#endif
+
+ template <typename T, unsigned Radix, bool force_sign, typename Modifiers>
+ struct make_primitive<tag::int_generator<T, Radix, force_sign>, Modifiers>
+ : detail::make_int<typename remove_const<T>::type
+ , Modifiers, Radix, force_sign> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers, unsigned Radix = 10
+ , bool force_sign = false>
+ struct make_int_direct
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_int_generator<
+ T
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , Radix, force_sign, false
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::short_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_int_direct<short, Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::int_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_int_direct<int, Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::long_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_int_direct<long, Modifiers> {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::long_long, fusion::vector1<A0> >, Modifiers>
+ : detail::make_int_direct<boost::long_long_type, Modifiers> {};
+#endif
+
+ template <typename T, unsigned Radix, bool force_sign, typename A0
+ , typename Modifiers>
+ struct make_primitive<
+ terminal_ex<tag::int_generator<T, Radix, force_sign>
+ , fusion::vector1<A0> >, Modifiers>
+ : detail::make_int_direct<typename remove_const<T>::type
+ , Modifiers, Radix, force_sign> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers>
+ struct basic_int_literal
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_int_generator<
+ T
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , 10, false, true
+ > result_type;
+
+ template <typename T_>
+ result_type operator()(T_ i, unused_type) const
+ {
+ return result_type(i);
+ }
+ };
+ }
+
+ template <typename Modifiers>
+ struct make_primitive<short, Modifiers>
+ : detail::basic_int_literal<short, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<int, Modifiers>
+ : detail::basic_int_literal<int, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<long, Modifiers>
+ : detail::basic_int_literal<long, Modifiers> {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers>
+ struct make_primitive<boost::long_long_type, Modifiers>
+ : detail::basic_int_literal<boost::long_long_type, Modifiers> {};
+#endif
+
+ // lit(int)
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers
+ , typename enable_if<traits::is_int<A0> >::type>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_int_generator<
+ typename remove_const<A0>::type
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , 10, false, true
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/numeric/real.hpp b/boost/spirit/home/karma/numeric/real.hpp
new file mode 100644
index 0000000000..cd1066a2f5
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/real.hpp
@@ -0,0 +1,453 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_REAL_FEB_26_2007_0512PM)
+#define BOOST_SPIRIT_KARMA_REAL_FEB_26_2007_0512PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/numeric_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/char.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/spirit/home/karma/detail/enable_lit.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/numeric/real_policies.hpp>
+#include <boost/spirit/home/karma/numeric/detail/real_utils.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/value_at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+namespace boost { namespace spirit
+{
+ namespace karma
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // forward declaration only
+ template <typename T>
+ struct real_policies;
+
+ ///////////////////////////////////////////////////////////////////////
+ // This is the class that the user can instantiate directly in
+ // order to create a customized real generator
+ template <typename T = double, typename Policies = real_policies<T> >
+ struct real_generator
+ : spirit::terminal<tag::stateful_tag<Policies, tag::double_, T> >
+ {
+ typedef tag::stateful_tag<Policies, tag::double_, T> tag_type;
+
+ real_generator() {}
+ real_generator(Policies const& p)
+ : spirit::terminal<tag_type>(p) {}
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, tag::float_> // enables float_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::double_> // enables double_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::long_double> // enables long_double
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, float> // enables lit(1.0f)
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, double> // enables lit(1.0)
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, long double> // enables lit(1.0l)
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A0>
+ struct use_terminal<karma::domain // enables float_(...)
+ , terminal_ex<tag::float_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables double_(...)
+ , terminal_ex<tag::double_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables long_double(...)
+ , terminal_ex<tag::long_double, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ // lazy float_(...), double_(...), long_double(...)
+ template <>
+ struct use_lazy_terminal<karma::domain, tag::float_, 1>
+ : mpl::true_ {};
+
+ template <>
+ struct use_lazy_terminal<karma::domain, tag::double_, 1>
+ : mpl::true_ {};
+
+ template <>
+ struct use_lazy_terminal<karma::domain, tag::long_double, 1>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // enables custom real generator
+ template <typename T, typename Policies>
+ struct use_terminal<karma::domain
+ , tag::stateful_tag<Policies, tag::double_, T> >
+ : mpl::true_ {};
+
+ template <typename T, typename Policies, typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::stateful_tag<Policies, tag::double_, T>
+ , fusion::vector1<A0> > >
+ : mpl::true_ {};
+
+ // enables *lazy* custom real generator
+ template <typename T, typename Policies>
+ struct use_lazy_terminal<
+ karma::domain
+ , tag::stateful_tag<Policies, tag::double_, T>
+ , 1 // arity
+ > : mpl::true_ {};
+
+ // enables lit(double)
+ template <typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<traits::is_real<A0> >::type>
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::float_;
+ using spirit::double_;
+ using spirit::long_double;
+#endif
+
+ using spirit::float_type;
+ using spirit::double_type;
+ using spirit::long_double_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization is used for real generators not having a direct
+ // initializer: float_, double_ etc. These generators must be used in
+ // conjunction with an attribute.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T, typename Policies, typename CharEncoding, typename Tag>
+ struct any_real_generator
+ : primitive_generator<any_real_generator<T, Policies, CharEncoding, Tag> >
+ {
+ typedef typename Policies::properties properties;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ any_real_generator(Policies const& policies = Policies())
+ : p_(policies) {}
+
+ // double_/float_/etc. has an attached attribute
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ if (!traits::has_optional_value(attr))
+ return false; // fail if it's an uninitialized optional
+
+ typedef real_inserter<T, Policies, CharEncoding, Tag> inserter_type;
+ return inserter_type::call(sink, traits::extract_from<T>(attr, context), p_) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // this double_/float_/etc. has no attribute attached, it needs to have
+ // been initialized from a direct literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool generate(OutputIterator&, Context&, Delimiter const&
+ , unused_type)
+ {
+ // It is not possible (doesn't make sense) to use numeric generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false, real_not_usable_without_attribute, ()); return false;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("real");
+ }
+
+ Policies p_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization is used for real generators having a direct
+ // initializer: float_(10.), double_(20.) etc.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T, typename Policies, typename CharEncoding, typename Tag
+ , bool no_attribute>
+ struct literal_real_generator
+ : primitive_generator<literal_real_generator<T, Policies, CharEncoding
+ , Tag, no_attribute> >
+ {
+ typedef typename Policies::properties properties;
+
+ template <typename Context, typename Unused = unused_type>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, T>
+ {};
+
+ literal_real_generator(typename add_const<T>::type n
+ , Policies const& policies = Policies())
+ : n_(n), p_(policies) {}
+
+ // A double_(1.0) which additionally has an associated attribute emits
+ // its immediate literal only if it matches the attribute, otherwise
+ // it fails.
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ typedef typename attribute<Context>::type attribute_type;
+ if (!traits::has_optional_value(attr) ||
+ n_ != traits::extract_from<attribute_type>(attr, context))
+ {
+ return false;
+ }
+
+ typedef real_inserter<T, Policies, CharEncoding, Tag> inserter_type;
+ return inserter_type::call(sink, n_, p_) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // A double_(1.0) without any associated attribute just emits its
+ // immediate literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , unused_type) const
+ {
+ typedef real_inserter<T, Policies, CharEncoding, Tag> inserter_type;
+ return inserter_type::call(sink, n_, p_) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("real");
+ }
+
+ T n_;
+ Policies p_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers
+ , typename Policies = real_policies<T> >
+ struct make_real
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef any_real_generator<
+ T, Policies
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ typedef tag::stateful_tag<Policies, tag::double_, T> tag_type;
+ using spirit::detail::get_stateful_data;
+ return result_type(get_stateful_data<tag_type>::call(term));
+ }
+ };
+ }
+
+ template <typename Modifiers>
+ struct make_primitive<tag::float_, Modifiers>
+ : detail::make_real<float, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::double_, Modifiers>
+ : detail::make_real<double, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::long_double, Modifiers>
+ : detail::make_real<long double, Modifiers> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Policies, typename Modifiers>
+ struct make_primitive<
+ tag::stateful_tag<Policies, tag::double_, T>, Modifiers>
+ : detail::make_real<typename remove_const<T>::type
+ , Modifiers, Policies> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers
+ , typename Policies = real_policies<T> >
+ struct make_real_direct
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_real_generator<
+ T, Policies
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , false
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ typedef tag::stateful_tag<Policies, tag::double_, T> tag_type;
+ using spirit::detail::get_stateful_data;
+ return result_type(T(fusion::at_c<0>(term.args))
+ , get_stateful_data<tag_type>::call(term.term));
+ }
+ };
+ }
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::float_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_real_direct<float, Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::double_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_real_direct<double, Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::long_double, fusion::vector1<A0> >, Modifiers>
+ : detail::make_real_direct<long double, Modifiers> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Policies, typename A0, typename Modifiers>
+ struct make_primitive<
+ terminal_ex<tag::stateful_tag<Policies, tag::double_, T>
+ , fusion::vector1<A0> >
+ , Modifiers>
+ : detail::make_real_direct<typename remove_const<T>::type
+ , Modifiers, Policies> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers>
+ struct basic_real_literal
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_real_generator<
+ T, real_policies<T>
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , true
+ > result_type;
+
+ template <typename T_>
+ result_type operator()(T_ i, unused_type) const
+ {
+ return result_type(T(i));
+ }
+ };
+ }
+
+ template <typename Modifiers>
+ struct make_primitive<float, Modifiers>
+ : detail::basic_real_literal<float, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<double, Modifiers>
+ : detail::basic_real_literal<double, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<long double, Modifiers>
+ : detail::basic_real_literal<long double, Modifiers> {};
+
+ // lit(double)
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers
+ , typename enable_if<traits::is_real<A0> >::type>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_real_generator<
+ typename remove_const<A0>::type, real_policies<A0>
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , true
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+#endif // defined(BOOST_SPIRIT_KARMA_REAL_FEB_26_2007_0512PM)
diff --git a/boost/spirit/home/karma/numeric/real_policies.hpp b/boost/spirit/home/karma/numeric/real_policies.hpp
new file mode 100644
index 0000000000..8fb560eea3
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/real_policies.hpp
@@ -0,0 +1,333 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_REAL_POLICIES_MAR_02_2007_0936AM)
+#define BOOST_SPIRIT_KARMA_REAL_POLICIES_MAR_02_2007_0936AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/type_traits/remove_const.hpp>
+
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/char.hpp>
+#include <boost/spirit/home/karma/numeric/int.hpp>
+#include <boost/spirit/home/karma/numeric/detail/real_utils.hpp>
+
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // real_policies, if you need special handling of your floating
+ // point numbers, just overload this policy class and use it as a template
+ // parameter to the karma::real_generator floating point specifier:
+ //
+ // template <typename T>
+ // struct scientific_policy : karma::real_policies<T>
+ // {
+ // // we want the numbers always to be in scientific format
+ // static int floatfield(T n) { return fmtflags::scientific; }
+ // };
+ //
+ // typedef
+ // karma::real_generator<double, scientific_policy<double> >
+ // science_type;
+ //
+ // karma::generate(sink, science_type(), 1.0); // will output: 1.0e00
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct real_policies
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // Expose the data type the generator is targeted at
+ ///////////////////////////////////////////////////////////////////////
+ typedef T value_type;
+
+ ///////////////////////////////////////////////////////////////////////
+ // By default the policy doesn't require any special iterator
+ // functionality. The floating point generator exposes its properties
+ // from here, so this needs to be updated in case other properties
+ // need to be implemented.
+ ///////////////////////////////////////////////////////////////////////
+ typedef mpl::int_<generator_properties::no_properties> properties;
+
+ ///////////////////////////////////////////////////////////////////////
+ // Specifies, which representation type to use during output
+ // generation.
+ ///////////////////////////////////////////////////////////////////////
+ struct fmtflags
+ {
+ enum {
+ scientific = 0, // Generate floating-point values in scientific
+ // format (with an exponent field).
+ fixed = 1 // Generate floating-point values in fixed-point
+ // format (with no exponent field).
+ };
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // This is the main function used to generate the output for a
+ // floating point number. It is called by the real generator in order
+ // to perform the conversion. In theory all of the work can be
+ // implemented here, but it is the easiest to use existing
+ // functionality provided by the type specified by the template
+ // parameter `Inserter`.
+ //
+ // sink: the output iterator to use for generation
+ // n: the floating point number to convert
+ // p: the instance of the policy type used to instantiate this
+ // floating point generator.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Inserter, typename OutputIterator, typename Policies>
+ static bool
+ call (OutputIterator& sink, T n, Policies const& p)
+ {
+ return Inserter::call_n(sink, n, p);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // The default behavior is to not to require generating a sign. If
+ // 'force_sign()' returns true, then all generated numbers will
+ // have a sign ('+' or '-', zeros will have a space instead of a sign)
+ //
+ // n The floating point number to output. This can be used to
+ // adjust the required behavior depending on the value of
+ // this number.
+ ///////////////////////////////////////////////////////////////////////
+ static bool force_sign(T)
+ {
+ return false;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Return whether trailing zero digits have to be emitted in the
+ // fractional part of the output. If set, this flag instructs the
+ // floating point generator to emit trailing zeros up to the required
+ // precision digits (as returned by the precision() function).
+ //
+ // n The floating point number to output. This can be used to
+ // adjust the required behavior depending on the value of
+ // this number.
+ ///////////////////////////////////////////////////////////////////////
+ static bool trailing_zeros(T)
+ {
+ // the default behavior is not to generate trailing zeros
+ return false;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Decide, which representation type to use in the generated output.
+ //
+ // By default all numbers having an absolute value of zero or in
+ // between 0.001 and 100000 will be generated using the fixed format,
+ // all others will be generated using the scientific representation.
+ //
+ // The function trailing_zeros() can be used to force the output of
+ // trailing zeros in the fractional part up to the number of digits
+ // returned by the precision() member function. The default is not to
+ // generate the trailing zeros.
+ //
+ // n The floating point number to output. This can be used to
+ // adjust the formatting flags depending on the value of
+ // this number.
+ ///////////////////////////////////////////////////////////////////////
+ static int floatfield(T n)
+ {
+ if (traits::test_zero(n))
+ return fmtflags::fixed;
+
+ T abs_n = traits::get_absolute_value(n);
+ return (abs_n >= 1e5 || abs_n < 1e-3)
+ ? fmtflags::scientific : fmtflags::fixed;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Return the maximum number of decimal digits to generate in the
+ // fractional part of the output.
+ //
+ // n The floating point number to output. This can be used to
+ // adjust the required precision depending on the value of
+ // this number. If the trailing zeros flag is specified the
+ // fractional part of the output will be 'filled' with
+ // zeros, if appropriate
+ //
+ // Note: If the trailing_zeros flag is not in effect additional
+ // comments apply. See the comment for the fraction_part()
+ // function below. Moreover, this precision will be limited
+ // to the value of std::numeric_limits<T>::digits10 + 1
+ ///////////////////////////////////////////////////////////////////////
+ static unsigned precision(T)
+ {
+ // by default, generate max. 3 fractional digits
+ return 3;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Generate the integer part of the number.
+ //
+ // sink The output iterator to use for generation
+ // n The absolute value of the integer part of the floating
+ // point number to convert (always non-negative).
+ // sign The sign of the overall floating point number to
+ // convert.
+ // force_sign Whether a sign has to be generated even for
+ // non-negative numbers
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator>
+ static bool integer_part (OutputIterator& sink, T n, bool sign
+ , bool force_sign)
+ {
+ return sign_inserter::call(
+ sink, traits::test_zero(n), sign, force_sign) &&
+ int_inserter<10>::call(sink, n);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Generate the decimal point.
+ //
+ // sink The output iterator to use for generation
+ // n The fractional part of the floating point number to
+ // convert. Note that this number is scaled such, that
+ // it represents the number of units which correspond
+ // to the value returned from the precision() function
+ // earlier. I.e. a fractional part of 0.01234 is
+ // represented as 1234 when the 'Precision' is 5.
+ // precision The number of digits to emit as returned by the
+ // function 'precision()' above
+ //
+ // This is given to allow to decide, whether a decimal point
+ // has to be generated at all.
+ //
+ // Note: If the trailing_zeros flag is not in effect additional
+ // comments apply. See the comment for the fraction_part()
+ // function below.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator>
+ static bool dot (OutputIterator& sink, T /*n*/, unsigned /*precision*/)
+ {
+ return char_inserter<>::call(sink, '.'); // generate the dot by default
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Generate the fractional part of the number.
+ //
+ // sink The output iterator to use for generation
+ // n The fractional part of the floating point number to
+ // convert. This number is scaled such, that it represents
+ // the number of units which correspond to the 'Precision'.
+ // I.e. a fractional part of 0.01234 is represented as 1234
+ // when the 'precision_' parameter is 5.
+ // precision_ The corrected number of digits to emit (see note
+ // below)
+ // precision The number of digits to emit as returned by the
+ // function 'precision()' above
+ //
+ // Note: If trailing_zeros() does not return true the 'precision_'
+ // parameter will have been corrected from the value the
+ // precision() function returned earlier (defining the maximal
+ // number of fractional digits) in the sense, that it takes into
+ // account trailing zeros. I.e. a floating point number 0.0123
+ // and a value of 5 returned from precision() will result in:
+ //
+ // trailing_zeros is not specified:
+ // n 123
+ // precision_ 4
+ //
+ // trailing_zeros is specified:
+ // n 1230
+ // precision_ 5
+ //
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator>
+ static bool fraction_part (OutputIterator& sink, T n
+ , unsigned precision_, unsigned precision)
+ {
+ // allow for ADL to find the correct overload for floor and log10
+ using namespace std;
+
+ // The following is equivalent to:
+ // generate(sink, right_align(precision, '0')[ulong], n);
+ // but it's spelled out to avoid inter-modular dependencies.
+
+ typename remove_const<T>::type digits =
+ (traits::test_zero(n) ? 0 : floor(log10(n))) + 1;
+ bool r = true;
+ for (/**/; r && digits < precision_; digits = digits + 1)
+ r = char_inserter<>::call(sink, '0');
+ if (precision && r)
+ r = int_inserter<10>::call(sink, n);
+ return r;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Generate the exponential part of the number (this is called only
+ // if the floatfield() function returned the 'scientific' flag).
+ //
+ // sink The output iterator to use for generation
+ // n The (signed) exponential part of the floating point
+ // number to convert.
+ //
+ // The Tag template parameter is either of the type unused_type or
+ // describes the character class and conversion to be applied to any
+ // output possibly influenced by either the lower[...] or upper[...]
+ // directives.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag, typename OutputIterator>
+ static bool exponent (OutputIterator& sink, long n)
+ {
+ long abs_n = traits::get_absolute_value(n);
+ bool r = char_inserter<CharEncoding, Tag>::call(sink, 'e') &&
+ sign_inserter::call(sink, traits::test_zero(n)
+ , traits::test_negative(n), false);
+
+ // the C99 Standard requires at least two digits in the exponent
+ if (r && abs_n < 10)
+ r = char_inserter<CharEncoding, Tag>::call(sink, '0');
+ return r && int_inserter<10>::call(sink, abs_n);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Print the textual representations for non-normal floats (NaN and
+ // Inf)
+ //
+ // sink The output iterator to use for generation
+ // n The (signed) floating point number to convert.
+ // force_sign Whether a sign has to be generated even for
+ // non-negative numbers
+ //
+ // The Tag template parameter is either of the type unused_type or
+ // describes the character class and conversion to be applied to any
+ // output possibly influenced by either the lower[...] or upper[...]
+ // directives.
+ //
+ // Note: These functions get called only if fpclassify() returned
+ // FP_INFINITY or FP_NAN.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag, typename OutputIterator>
+ static bool nan (OutputIterator& sink, T n, bool force_sign)
+ {
+ return sign_inserter::call(
+ sink, false, traits::test_negative(n), force_sign) &&
+ string_inserter<CharEncoding, Tag>::call(sink, "nan");
+ }
+
+ template <typename CharEncoding, typename Tag, typename OutputIterator>
+ static bool inf (OutputIterator& sink, T n, bool force_sign)
+ {
+ return sign_inserter::call(
+ sink, false, traits::test_negative(n), force_sign) &&
+ string_inserter<CharEncoding, Tag>::call(sink, "inf");
+ }
+ };
+}}}
+
+#endif // defined(BOOST_SPIRIT_KARMA_REAL_POLICIES_MAR_02_2007_0936AM)
diff --git a/boost/spirit/home/karma/numeric/uint.hpp b/boost/spirit/home/karma/numeric/uint.hpp
new file mode 100644
index 0000000000..35ae1951e5
--- /dev/null
+++ b/boost/spirit/home/karma/numeric/uint.hpp
@@ -0,0 +1,576 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_UINT_FEB_23_2007_0840PM)
+#define BOOST_SPIRIT_KARMA_UINT_FEB_23_2007_0840PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/limits.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/numeric_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/support/detail/is_spirit_tag.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/spirit/home/karma/detail/enable_lit.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/value_at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+namespace boost { namespace spirit
+{
+ namespace tag
+ {
+ template <typename T, unsigned Radix>
+ struct uint_generator
+ {
+ BOOST_SPIRIT_IS_TAG()
+ };
+ }
+
+ namespace karma
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // This one is the class that the user can instantiate directly in
+ // order to create a customized int generator
+ template <typename T = unsigned int, unsigned Radix = 10>
+ struct uint_generator
+ : spirit::terminal<tag::uint_generator<T, Radix> >
+ {};
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, tag::ushort_> // enables ushort_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::uint_> // enables uint_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::ulong_> // enables ulong_
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::bin> // enables bin
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::oct> // enables oct
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::hex> // enables hex
+ : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct use_terminal<karma::domain, tag::ulong_long> // enables ulong_long
+ : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+ template <> // enables lit(unsigned short(0))
+ struct use_terminal<karma::domain, unsigned short>
+ : mpl::true_ {};
+#endif
+
+ template <> // enables lit(0U)
+ struct use_terminal<karma::domain, unsigned int>
+ : mpl::true_ {};
+
+ template <> // enables lit(0UL)
+ struct use_terminal<karma::domain, unsigned long>
+ : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <> // enables lit(0ULL)
+ struct use_terminal<karma::domain, boost::ulong_long_type>
+ : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A0>
+ struct use_terminal<karma::domain // enables ushort_(...)
+ , terminal_ex<tag::ushort_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables uint_(...)
+ , terminal_ex<tag::uint_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables ulong_(...)
+ , terminal_ex<tag::ulong_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables bin(...)
+ , terminal_ex<tag::bin, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables oct(...)
+ , terminal_ex<tag::oct, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables hex(...)
+ , terminal_ex<tag::hex, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename A0>
+ struct use_terminal<karma::domain // enables ulong_long(...)
+ , terminal_ex<tag::ulong_long, fusion::vector1<A0> >
+ > : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables *lazy* ushort_(...)
+ struct use_lazy_terminal<karma::domain, tag::ushort_, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* uint_(...)
+ struct use_lazy_terminal<karma::domain, tag::uint_, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* ulong_(...)
+ struct use_lazy_terminal<karma::domain, tag::ulong_, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* bin(...)
+ struct use_lazy_terminal<karma::domain, tag::bin, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* oct(...)
+ struct use_lazy_terminal<karma::domain, tag::oct, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* hex(...)
+ struct use_lazy_terminal<karma::domain, tag::hex, 1>
+ : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <> // enables *lazy* ulong_long(...)
+ struct use_lazy_terminal<karma::domain, tag::ulong_long, 1>
+ : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // enables any custom uint_generator
+ template <typename T, unsigned Radix>
+ struct use_terminal<karma::domain, tag::uint_generator<T, Radix> >
+ : mpl::true_ {};
+
+ // enables any custom uint_generator(...)
+ template <typename T, unsigned Radix, typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::uint_generator<T, Radix>, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ // enables *lazy* custom uint_generator
+ template <typename T, unsigned Radix>
+ struct use_lazy_terminal<
+ karma::domain
+ , tag::uint_generator<T, Radix>
+ , 1 // arity
+ > : mpl::true_ {};
+
+ // enables lit(uint)
+ template <typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<traits::is_uint<A0> >::type>
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::ushort_;
+ using spirit::uint_;
+ using spirit::ulong_;
+#ifdef BOOST_HAS_LONG_LONG
+ using spirit::ulong_long;
+#endif
+ using spirit::bin;
+ using spirit::oct;
+ using spirit::hex;
+
+ using spirit::lit; // lit(1U) is equivalent to 1U
+#endif
+
+ using spirit::ushort_type;
+ using spirit::uint_type;
+ using spirit::ulong_type;
+#ifdef BOOST_HAS_LONG_LONG
+ using spirit::ulong_long_type;
+#endif
+ using spirit::bin_type;
+ using spirit::oct_type;
+ using spirit::hex_type;
+
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization is used for unsigned int generators not having a
+ // direct initializer: uint_, ulong_ etc. These generators must be used in
+ // conjunction with an Attribute.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename CharEncoding, typename Tag, unsigned Radix>
+ struct any_uint_generator
+ : primitive_generator<any_uint_generator<T, CharEncoding, Tag, Radix> >
+ {
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ // check template Attribute 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix >= 2 && Radix <= 36, not_supported_radix, ());
+
+ BOOST_SPIRIT_ASSERT_MSG(
+ // the following is a workaround for STLPort, where the simpler
+ // `!std::numeric_limits<T>::is_signed` wouldn't compile
+ mpl::not_<mpl::bool_<std::numeric_limits<T>::is_signed> >::value,
+ signed_unsigned_mismatch, ());
+
+ // int has a Attribute attached
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ static bool
+ generate(OutputIterator& sink, Context& context, Delimiter const& d
+ , Attribute const& attr)
+ {
+ if (!traits::has_optional_value(attr))
+ return false; // fail if it's an uninitialized optional
+
+ return uint_inserter<Radix, CharEncoding, Tag>::
+ call(sink, traits::extract_from<T>(attr, context)) &&
+ delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // this int has no Attribute attached, it needs to have been
+ // initialized from a direct literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool
+ generate(OutputIterator&, Context&, Delimiter const&, unused_type)
+ {
+ // It is not possible (doesn't make sense) to use numeric generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false, uint_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("unsigned-integer");
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization is used for unsigned int generators having a direct
+ // initializer: uint_(10), ulong_(20) etc.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T, typename CharEncoding, typename Tag, unsigned Radix
+ , bool no_attribute>
+ struct literal_uint_generator
+ : primitive_generator<literal_uint_generator<T, CharEncoding, Tag, Radix
+ , no_attribute> >
+ {
+ template <typename Context, typename Unused = unused_type>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, T>
+ {};
+
+ literal_uint_generator(typename add_const<T>::type n)
+ : n_(n) {}
+
+ // check template Attribute 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix >= 2 && Radix <= 36, not_supported_radix, ());
+
+ BOOST_SPIRIT_ASSERT_MSG(
+ // the following is a workaround for STLPort, where the simpler
+ // `!std::numeric_limits<T>::is_signed wouldn't` compile
+ mpl::not_<mpl::bool_<std::numeric_limits<T>::is_signed> >::value,
+ signed_unsigned_mismatch, ());
+
+ // A uint(1U) which additionally has an associated attribute emits
+ // its immediate literal only if it matches the attribute, otherwise
+ // it fails.
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ typedef typename attribute<Context>::type attribute_type;
+ if (!traits::has_optional_value(attr) ||
+ n_ != traits::extract_from<attribute_type>(attr, context))
+ {
+ return false;
+ }
+ return uint_inserter<Radix, CharEncoding, Tag>::call(sink, n_) &&
+ delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // A uint(1U) without any associated attribute just emits its
+ // immediate literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , unused_type) const
+ {
+ return uint_inserter<Radix, CharEncoding, Tag>::call(sink, n_) &&
+ delimit_out(sink, d); // always do post-delimiting
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("unsigned-integer");
+ }
+
+ T n_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers, unsigned Radix = 10>
+ struct make_uint
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef any_uint_generator<
+ T
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , Radix
+ > result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::ushort_, Modifiers>
+ : detail::make_uint<unsigned short, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::uint_, Modifiers>
+ : detail::make_uint<unsigned int, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::ulong_, Modifiers>
+ : detail::make_uint<unsigned long, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::bin, Modifiers>
+ : detail::make_uint<unsigned, Modifiers, 2> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::oct, Modifiers>
+ : detail::make_uint<unsigned, Modifiers, 8> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::hex, Modifiers>
+ : detail::make_uint<unsigned, Modifiers, 16> {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers>
+ struct make_primitive<tag::ulong_long, Modifiers>
+ : detail::make_uint<boost::ulong_long_type, Modifiers> {};
+#endif
+
+ template <typename T, unsigned Radix, typename Modifiers>
+ struct make_primitive<tag::uint_generator<T, Radix>, Modifiers>
+ : detail::make_uint<typename remove_const<T>::type, Modifiers, Radix> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers, unsigned Radix = 10>
+ struct make_uint_direct
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_uint_generator<
+ T
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , Radix, false
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+ }
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::ushort_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_uint_direct<unsigned short, Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::uint_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_uint_direct<unsigned int, Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::ulong_, fusion::vector1<A0> >, Modifiers>
+ : detail::make_uint_direct<unsigned long, Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::bin, fusion::vector1<A0> >, Modifiers>
+ : detail::make_uint_direct<unsigned, Modifiers, 2> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::oct, fusion::vector1<A0> >, Modifiers>
+ : detail::make_uint_direct<unsigned, Modifiers, 8> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::hex, fusion::vector1<A0> >, Modifiers>
+ : detail::make_uint_direct<unsigned, Modifiers, 16> {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::ulong_long, fusion::vector1<A0> >, Modifiers>
+ : detail::make_uint_direct<boost::ulong_long_type, Modifiers> {};
+#endif
+
+ template <typename T, unsigned Radix, typename A0, typename Modifiers>
+ struct make_primitive<
+ terminal_ex<tag::uint_generator<T, Radix>, fusion::vector1<A0> >
+ , Modifiers>
+ : detail::make_uint_direct<typename remove_const<T>::type, Modifiers, Radix>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T, typename Modifiers>
+ struct basic_uint_literal
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_uint_generator<
+ T
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , 10, true
+ > result_type;
+
+ template <typename T_>
+ result_type operator()(T_ i, unused_type) const
+ {
+ return result_type(i);
+ }
+ };
+ }
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+ template <typename Modifiers>
+ struct make_primitive<unsigned short, Modifiers>
+ : detail::basic_uint_literal<unsigned short, Modifiers> {};
+#endif
+
+ template <typename Modifiers>
+ struct make_primitive<unsigned int, Modifiers>
+ : detail::basic_uint_literal<unsigned int, Modifiers> {};
+
+ template <typename Modifiers>
+ struct make_primitive<unsigned long, Modifiers>
+ : detail::basic_uint_literal<unsigned long, Modifiers> {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers>
+ struct make_primitive<boost::ulong_long_type, Modifiers>
+ : detail::basic_uint_literal<boost::ulong_long_type, Modifiers> {};
+#endif
+
+ // lit(uint)
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers
+ , typename enable_if<traits::is_uint<A0> >::type>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef literal_uint_generator<
+ typename remove_const<A0>::type
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , 10, true
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/operator.hpp b/boost/spirit/home/karma/operator.hpp
new file mode 100644
index 0000000000..0f76299af9
--- /dev/null
+++ b/boost/spirit/home/karma/operator.hpp
@@ -0,0 +1,22 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_OPERATOR_FEB_28_2007_0351PM)
+#define BOOST_SPIRIT_KARMA_OPERATOR_FEB_28_2007_0351PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/sequence.hpp>
+#include <boost/spirit/home/karma/operator/and_predicate.hpp>
+#include <boost/spirit/home/karma/operator/not_predicate.hpp>
+#include <boost/spirit/home/karma/operator/alternative.hpp>
+#include <boost/spirit/home/karma/operator/kleene.hpp>
+#include <boost/spirit/home/karma/operator/plus.hpp>
+#include <boost/spirit/home/karma/operator/optional.hpp>
+#include <boost/spirit/home/karma/operator/list.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/operator/alternative.hpp b/boost/spirit/home/karma/operator/alternative.hpp
new file mode 100644
index 0000000000..0f709fbd76
--- /dev/null
+++ b/boost/spirit/home/karma/operator/alternative.hpp
@@ -0,0 +1,208 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_ALTERNATIVE_MAR_01_2007_1117AM)
+#define SPIRIT_KARMA_ALTERNATIVE_MAR_01_2007_1117AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/detail/alternative_function.hpp>
+#include <boost/spirit/home/karma/detail/get_stricttag.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/detail/what_function.hpp>
+#include <boost/fusion/include/any.hpp>
+#include <boost/fusion/include/mpl.hpp>
+#include <boost/fusion/include/for_each.hpp>
+#include <boost/mpl/accumulate.hpp>
+#include <boost/mpl/bitor.hpp>
+#include <boost/config.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::bitwise_or> // enables |
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<karma::domain, proto::tag::bitwise_or> // flattens |
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ // specialization for sequences
+ template <typename Elements>
+ struct alternative_properties
+ {
+ struct element_properties
+ {
+ template <typename T>
+ struct result;
+
+ template <typename F, typename Element>
+ struct result<F(Element)>
+ {
+ typedef properties_of<Element> type;
+ };
+
+ // never called, but needed for decltype-based result_of (C++0x)
+#ifndef BOOST_NO_RVALUE_REFERENCES
+ template <typename Element>
+ typename result<element_properties(Element)>::type
+ operator()(Element&&) const;
+#endif
+ };
+
+ typedef typename mpl::accumulate<
+ typename fusion::result_of::transform<
+ Elements, element_properties>::type
+ , mpl::int_<karma::generator_properties::countingbuffer>
+ , mpl::bitor_<mpl::_2, mpl::_1>
+ >::type type;
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Elements, typename Strict, typename Derived>
+ struct base_alternative : nary_generator<Derived>
+ {
+ typedef typename traits::alternative_properties<Elements>::type
+ properties;
+
+ template <typename Context, typename Iterator = unused_type>
+ struct attribute
+ {
+ // Put all the element attributes in a tuple
+ typedef typename traits::build_attribute_sequence<
+ Elements, Context, traits::alternative_attribute_transform
+ , Iterator, karma::domain
+ >::type all_attributes;
+
+ // Ok, now make a variant over the attribute sequence. Note that
+ // build_variant makes sure that 1) all attributes in the variant
+ // are unique 2) puts the unused attribute, if there is any, to
+ // the front and 3) collapses single element variants, variant<T>
+ // to T.
+ typedef typename traits::build_variant<all_attributes>::type type;
+ };
+
+ base_alternative(Elements const& elements)
+ : elements(elements) {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ typedef detail::alternative_generate_function<
+ OutputIterator, Context, Delimiter, Attribute, Strict
+ > functor;
+
+ // f return true if *any* of the parser succeeds
+ functor f (sink, ctx, d, attr);
+ return fusion::any(elements, f);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ info result("alternative");
+ fusion::for_each(elements,
+ spirit::detail::what_function<Context>(result, context));
+ return result;
+ }
+
+ Elements elements;
+ };
+
+ template <typename Elements>
+ struct alternative
+ : base_alternative<Elements, mpl::false_, alternative<Elements> >
+ {
+ typedef base_alternative<Elements, mpl::false_, alternative>
+ base_alternative_;
+
+ alternative(Elements const& elements)
+ : base_alternative_(elements) {}
+ };
+
+ template <typename Elements>
+ struct strict_alternative
+ : base_alternative<Elements, mpl::true_, strict_alternative<Elements> >
+ {
+ typedef base_alternative<Elements, mpl::true_, strict_alternative>
+ base_alternative_;
+
+ strict_alternative(Elements const& elements)
+ : base_alternative_(elements) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Elements, bool strict_mode = false>
+ struct make_alternative
+ : make_nary_composite<Elements, alternative>
+ {};
+
+ template <typename Elements>
+ struct make_alternative<Elements, true>
+ : make_nary_composite<Elements, strict_alternative>
+ {};
+ }
+
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::bitwise_or, Elements, Modifiers>
+ : detail::make_alternative<Elements
+ , detail::get_stricttag<Modifiers>::value>
+ {};
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements>
+ struct has_semantic_action<karma::alternative<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ template <typename Elements>
+ struct has_semantic_action<karma::strict_alternative<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::alternative<Elements>
+ , Attribute, Context, Iterator>
+ : nary_handles_container<Elements, Attribute, Context, Iterator> {};
+
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::strict_alternative<Elements>
+ , Attribute, Context, Iterator>
+ : nary_handles_container<Elements, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/operator/and_predicate.hpp b/boost/spirit/home/karma/operator/and_predicate.hpp
new file mode 100644
index 0000000000..dc821f14b2
--- /dev/null
+++ b/boost/spirit/home/karma/operator/and_predicate.hpp
@@ -0,0 +1,95 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_AND_PREDICATE_MAR_22_2009_0412PM)
+#define SPIRIT_KARMA_AND_PREDICATE_MAR_22_2009_0412PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::address_of> // enables &g
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Subject>
+ struct and_predicate : unary_generator<and_predicate<Subject> >
+ {
+ typedef Subject subject_type;
+ typedef mpl::int_<
+ generator_properties::disabling | subject_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ and_predicate(Subject const& subject)
+ : subject(subject) {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ // inhibits output
+ detail::disable_output<OutputIterator> disable(sink);
+ return subject.generate(sink, ctx, d, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("and-predicate", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::address_of, Elements, Modifiers>
+ : make_unary_composite<Elements, and_predicate> {};
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::and_predicate<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::and_predicate<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/operator/kleene.hpp b/boost/spirit/home/karma/operator/kleene.hpp
new file mode 100644
index 0000000000..48507c84b6
--- /dev/null
+++ b/boost/spirit/home/karma/operator/kleene.hpp
@@ -0,0 +1,208 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_KLEENE_MAR_03_2007_0337AM)
+#define BOOST_SPIRIT_KARMA_KLEENE_MAR_03_2007_0337AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/indirect_iterator.hpp>
+#include <boost/spirit/home/karma/detail/get_stricttag.hpp>
+#include <boost/spirit/home/karma/detail/pass_container.hpp>
+#include <boost/spirit/home/karma/detail/fail_function.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+
+#include <boost/type_traits/add_const.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::dereference> // enables *g
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Subject, typename Strict, typename Derived>
+ struct base_kleene : unary_generator<Derived>
+ {
+ private:
+ // Ignore return value in relaxed mode (failing subject generators
+ // are just skipped). This allows to selectively generate items in
+ // the provided attribute.
+ template <typename F, typename Attribute>
+ bool generate_subject(F f, Attribute const&, mpl::false_) const
+ {
+ bool r = !f(subject);
+ if (!r && !f.is_at_end())
+ f.next();
+ return true;
+ }
+
+ template <typename F, typename Attribute>
+ bool generate_subject(F f, Attribute const&, mpl::true_) const
+ {
+ return !f(subject);
+ }
+
+ // There is no way to distinguish a failed generator from a
+ // generator to be skipped. We assume the user takes responsibility
+ // for ending the loop if no attribute is specified.
+ template <typename F>
+ bool generate_subject(F f, unused_type, mpl::false_) const
+ {
+ return !f(subject);
+ }
+
+// template <typename F>
+// bool generate_subject(F f, unused_type, mpl::true_) const
+// {
+// return !f(subject);
+// }
+
+ public:
+ typedef Subject subject_type;
+ typedef typename subject_type::properties properties;
+
+ // Build a std::vector from the subject's attribute. Note
+ // that build_std_vector may return unused_type if the
+ // subject's attribute is an unused_type.
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::build_std_vector<
+ typename traits::attribute_of<Subject, Context, Iterator>::type
+ >
+ {};
+
+ base_kleene(Subject const& subject)
+ : subject(subject) {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ typedef detail::fail_function<
+ OutputIterator, Context, Delimiter> fail_function;
+
+ typedef typename traits::container_iterator<
+ typename add_const<Attribute>::type
+ >::type iterator_type;
+
+ typedef
+ typename traits::make_indirect_iterator<iterator_type>::type
+ indirect_iterator_type;
+ typedef detail::pass_container<
+ fail_function, Attribute, indirect_iterator_type, mpl::false_>
+ pass_container;
+
+ iterator_type it = traits::begin(attr);
+ iterator_type end = traits::end(attr);
+
+ pass_container pass(fail_function(sink, ctx, d),
+ indirect_iterator_type(it), indirect_iterator_type(end));
+
+ // kleene fails only if the underlying output fails
+ while (!pass.is_at_end())
+ {
+ if (!generate_subject(pass, attr, Strict()))
+ break;
+ }
+ return detail::sink_is_good(sink);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("kleene", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ template <typename Subject>
+ struct kleene
+ : base_kleene<Subject, mpl::false_, kleene<Subject> >
+ {
+ typedef base_kleene<Subject, mpl::false_, kleene> base_kleene_;
+
+ kleene(Subject const& subject)
+ : base_kleene_(subject) {}
+ };
+
+ template <typename Subject>
+ struct strict_kleene
+ : base_kleene<Subject, mpl::true_, strict_kleene<Subject> >
+ {
+ typedef base_kleene<Subject, mpl::true_, strict_kleene> base_kleene_;
+
+ strict_kleene(Subject const& subject)
+ : base_kleene_(subject) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Subject, bool strict_mode = false>
+ struct make_kleene
+ : make_unary_composite<Subject, kleene>
+ {};
+
+ template <typename Subject>
+ struct make_kleene<Subject, true>
+ : make_unary_composite<Subject, strict_kleene>
+ {};
+ }
+
+ template <typename Subject, typename Modifiers>
+ struct make_composite<proto::tag::dereference, Subject, Modifiers>
+ : detail::make_kleene<Subject, detail::get_stricttag<Modifiers>::value>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::kleene<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ template <typename Subject>
+ struct has_semantic_action<karma::strict_kleene<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::kleene<Subject>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::strict_kleene<Subject>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/operator/list.hpp b/boost/spirit/home/karma/operator/list.hpp
new file mode 100644
index 0000000000..45798746d9
--- /dev/null
+++ b/boost/spirit/home/karma/operator/list.hpp
@@ -0,0 +1,229 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_LIST_MAY_01_2007_0229PM)
+#define SPIRIT_KARMA_LIST_MAY_01_2007_0229PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/indirect_iterator.hpp>
+#include <boost/spirit/home/karma/detail/get_stricttag.hpp>
+#include <boost/spirit/home/karma/detail/pass_container.hpp>
+#include <boost/spirit/home/karma/detail/fail_function.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::modulus> // enables g % d
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Left, typename Right, typename Strict, typename Derived>
+ struct base_list : binary_generator<Derived>
+ {
+ private:
+ // iterate over the given container until its exhausted or the embedded
+ // (left) generator succeeds
+ template <typename F, typename Attribute>
+ bool generate_left(F f, Attribute const&, mpl::false_) const
+ {
+ // Failing subject generators are just skipped. This allows to
+ // selectively generate items in the provided attribute.
+ while (!f.is_at_end())
+ {
+ bool r = !f(left);
+ if (r)
+ return true;
+ if (!f.is_at_end())
+ f.next();
+ }
+ return false;
+ }
+
+ template <typename F, typename Attribute>
+ bool generate_left(F f, Attribute const&, mpl::true_) const
+ {
+ return !f(left);
+ }
+
+ // There is no way to distinguish a failed generator from a
+ // generator to be skipped. We assume the user takes responsibility
+ // for ending the loop if no attribute is specified.
+ template <typename F>
+ bool generate_left(F f, unused_type, mpl::false_) const
+ {
+ return !f(left);
+ }
+
+ public:
+ typedef Left left_type;
+ typedef Right right_type;
+
+ typedef mpl::int_<
+ left_type::properties::value
+ | right_type::properties::value
+ | generator_properties::buffering
+ | generator_properties::counting
+ > properties;
+
+ // Build a std::vector from the LHS's attribute. Note
+ // that build_std_vector may return unused_type if the
+ // subject's attribute is an unused_type.
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::build_std_vector<
+ typename traits::attribute_of<Left, Context, Iterator>::type>
+ {};
+
+ base_list(Left const& left, Right const& right)
+ : left(left), right(right)
+ {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ typedef detail::fail_function<
+ OutputIterator, Context, Delimiter
+ > fail_function;
+
+ typedef typename traits::container_iterator<
+ typename add_const<Attribute>::type
+ >::type iterator_type;
+
+ typedef
+ typename traits::make_indirect_iterator<iterator_type>::type
+ indirect_iterator_type;
+ typedef detail::pass_container<
+ fail_function, Attribute, indirect_iterator_type, mpl::false_>
+ pass_container;
+
+ iterator_type it = traits::begin(attr);
+ iterator_type end = traits::end(attr);
+
+ pass_container pass(fail_function(sink, ctx, d),
+ indirect_iterator_type(it), indirect_iterator_type(end));
+
+ if (generate_left(pass, attr, Strict()))
+ {
+ while (!pass.is_at_end())
+ {
+ // wrap the given output iterator as generate_left might fail
+ detail::enable_buffering<OutputIterator> buffering(sink);
+ {
+ detail::disable_counting<OutputIterator> nocounting(sink);
+
+ if (!right.generate(sink, ctx, d, unused))
+ return false; // shouldn't happen
+
+ if (!generate_left(pass, attr, Strict()))
+ break; // return true as one item succeeded
+ }
+ buffering.buffer_copy();
+ }
+ return detail::sink_is_good(sink);
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("list",
+ std::make_pair(left.what(context), right.what(context)));
+ }
+
+ Left left;
+ Right right;
+ };
+
+ template <typename Left, typename Right>
+ struct list
+ : base_list<Left, Right, mpl::false_, list<Left, Right> >
+ {
+ typedef base_list<Left, Right, mpl::false_, list> base_list_;
+
+ list(Left const& left, Right const& right)
+ : base_list_(left, right) {}
+ };
+
+ template <typename Left, typename Right>
+ struct strict_list
+ : base_list<Left, Right, mpl::true_, strict_list<Left, Right> >
+ {
+ typedef base_list<Left, Right, mpl::true_, strict_list> base_list_;
+
+ strict_list (Left const& left, Right const& right)
+ : base_list_(left, right) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Subject, bool strict_mode = false>
+ struct make_list
+ : make_binary_composite<Subject, list>
+ {};
+
+ template <typename Subject>
+ struct make_list<Subject, true>
+ : make_binary_composite<Subject, strict_list>
+ {};
+ }
+
+ template <typename Subject, typename Modifiers>
+ struct make_composite<proto::tag::modulus, Subject, Modifiers>
+ : detail::make_list<Subject, detail::get_stricttag<Modifiers>::value>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Left, typename Right>
+ struct has_semantic_action<karma::list<Left, Right> >
+ : binary_has_semantic_action<Left, Right> {};
+
+ template <typename Left, typename Right>
+ struct has_semantic_action<karma::strict_list<Left, Right> >
+ : binary_has_semantic_action<Left, Right> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Left, typename Right, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::list<Left, Right>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+
+ template <typename Left, typename Right, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::strict_list<Left, Right>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/operator/not_predicate.hpp b/boost/spirit/home/karma/operator/not_predicate.hpp
new file mode 100644
index 0000000000..01c97f29c8
--- /dev/null
+++ b/boost/spirit/home/karma/operator/not_predicate.hpp
@@ -0,0 +1,96 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_NOT_PREDICATE_MAR_21_2009_1132AM)
+#define SPIRIT_KARMA_NOT_PREDICATE_MAR_21_2009_1132AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::logical_not> // enables !g
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Subject>
+ struct not_predicate : unary_generator<not_predicate<Subject> >
+ {
+ typedef Subject subject_type;
+
+ typedef mpl::int_<
+ generator_properties::disabling | subject_type::properties::value
+ > properties;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ not_predicate(Subject const& subject)
+ : subject(subject) {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ // inhibits output
+ detail::disable_output<OutputIterator> disable(sink);
+ return !subject.generate(sink, ctx, d, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("not-predicate", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::logical_not, Elements, Modifiers>
+ : make_unary_composite<Elements, not_predicate> {};
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::not_predicate<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::not_predicate<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/operator/optional.hpp b/boost/spirit/home/karma/operator/optional.hpp
new file mode 100644
index 0000000000..983142d5e7
--- /dev/null
+++ b/boost/spirit/home/karma/operator/optional.hpp
@@ -0,0 +1,105 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_KARMA_OPTIONAL_MARCH_31_2007_0852AM)
+#define SPIRIT_KARMA_OPTIONAL_MARCH_31_2007_0852AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/optional.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::negate> // enables -g
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct optional : unary_generator<optional<Subject> >
+ {
+ typedef Subject subject_type;
+ typedef typename subject_type::properties properties;
+
+ // Build a boost::optional from the subject's attribute. Note
+ // that boost::optional may return unused_type if the
+ // subject's attribute is an unused_type.
+ template <typename Context, typename Iterator = unused_type>
+ struct attribute
+ : traits::build_optional<
+ typename traits::attribute_of<Subject, Context, Iterator>::type
+ >
+ {};
+
+ optional(Subject const& subject)
+ : subject(subject) {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ if (traits::has_optional_value(attr))
+ subject.generate(sink, ctx, d, traits::optional_value(attr));
+ return sink_is_good(sink);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("optional", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::negate, Elements, Modifiers>
+ : make_unary_composite<Elements, optional> {};
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::optional<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::optional<Subject>, Attribute, Context
+ , Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/operator/plus.hpp b/boost/spirit/home/karma/operator/plus.hpp
new file mode 100644
index 0000000000..0d77c099d8
--- /dev/null
+++ b/boost/spirit/home/karma/operator/plus.hpp
@@ -0,0 +1,226 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_POSITIVE_MAR_03_2007_0945PM)
+#define BOOST_SPIRIT_KARMA_POSITIVE_MAR_03_2007_0945PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/detail/indirect_iterator.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/detail/get_stricttag.hpp>
+#include <boost/spirit/home/karma/detail/pass_container.hpp>
+#include <boost/spirit/home/karma/detail/fail_function.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+
+#include <boost/type_traits/add_const.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::unary_plus> // enables +g
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Subject, typename Strict, typename Derived>
+ struct base_plus : unary_generator<Derived>
+ {
+ private:
+ // Ignore return value in relaxed mode (failing subject generators
+ // are just skipped). This allows to selectively generate items in
+ // the provided attribute.
+ template <typename F, typename Attribute>
+ bool generate_subject(F f, Attribute const&, bool& result, mpl::false_) const
+ {
+ bool r = !f(subject);
+ if (r)
+ result = true;
+ else if (!f.is_at_end())
+ f.next();
+ return true;
+ }
+
+ template <typename F, typename Attribute>
+ bool generate_subject(F f, Attribute const&, bool& result, mpl::true_) const
+ {
+ bool r = !f(subject);
+ if (r)
+ result = true;
+ return r;
+ }
+
+ // There is no way to distinguish a failed generator from a
+ // generator to be skipped. We assume the user takes responsibility
+ // for ending the loop if no attribute is specified.
+ template <typename F>
+ bool generate_subject(F f, unused_type, bool& result, mpl::false_) const
+ {
+ bool r = f(subject);
+ if (!r)
+ result = true;
+ return !r;
+ }
+
+// template <typename F>
+// bool generate_subject(F f, unused_type, bool& result, mpl::true_) const
+// {
+// bool r = f(subject);
+// if (!r)
+// result = true;
+// return !r;
+// }
+
+ public:
+ typedef Subject subject_type;
+ typedef typename subject_type::properties properties;
+
+ // Build a std::vector from the subjects attribute. Note
+ // that build_std_vector may return unused_type if the
+ // subject's attribute is an unused_type.
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::build_std_vector<
+ typename traits::attribute_of<subject_type, Context, Iterator>::type
+ >
+ {};
+
+ base_plus(Subject const& subject)
+ : subject(subject) {}
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ typedef detail::fail_function<
+ OutputIterator, Context, Delimiter> fail_function;
+
+ typedef typename traits::container_iterator<
+ typename add_const<Attribute>::type
+ >::type iterator_type;
+
+ typedef
+ typename traits::make_indirect_iterator<iterator_type>::type
+ indirect_iterator_type;
+ typedef detail::pass_container<
+ fail_function, Attribute, indirect_iterator_type, mpl::false_>
+ pass_container;
+
+ iterator_type it = traits::begin(attr);
+ iterator_type end = traits::end(attr);
+
+ // plus fails if the parameter is empty
+ if (traits::compare(it, end))
+ return false;
+
+ pass_container pass(fail_function(sink, ctx, d),
+ indirect_iterator_type(it), indirect_iterator_type(end));
+
+ // from now on plus fails if the underlying output fails or overall
+ // no subject generators succeeded
+ bool result = false;
+ while (!pass.is_at_end())
+ {
+ if (!generate_subject(pass, attr, result, Strict()))
+ break;
+ }
+ return result && detail::sink_is_good(sink);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("plus", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ template <typename Subject>
+ struct plus
+ : base_plus<Subject, mpl::false_, plus<Subject> >
+ {
+ typedef base_plus<Subject, mpl::false_, plus> base_plus_;
+
+ plus(Subject const& subject)
+ : base_plus_(subject) {}
+ };
+
+ template <typename Subject>
+ struct strict_plus
+ : base_plus<Subject, mpl::true_, strict_plus<Subject> >
+ {
+ typedef base_plus<Subject, mpl::true_, strict_plus> base_plus_;
+
+ strict_plus(Subject const& subject)
+ : base_plus_(subject) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Elements, bool strict_mode = false>
+ struct make_plus
+ : make_unary_composite<Elements, plus>
+ {};
+
+ template <typename Elements>
+ struct make_plus<Elements, true>
+ : make_unary_composite<Elements, strict_plus>
+ {};
+ }
+
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::unary_plus, Elements, Modifiers>
+ : detail::make_plus<Elements, detail::get_stricttag<Modifiers>::value>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<karma::plus<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ template <typename Subject>
+ struct has_semantic_action<karma::strict_plus<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::plus<Subject>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::strict_plus<Subject>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/operator/sequence.hpp b/boost/spirit/home/karma/operator/sequence.hpp
new file mode 100644
index 0000000000..c9acc6e3c3
--- /dev/null
+++ b/boost/spirit/home/karma/operator/sequence.hpp
@@ -0,0 +1,313 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_KARMA_SEQUENCE_FEB_28_2007_0247PM)
+#define SPIRIT_KARMA_SEQUENCE_FEB_28_2007_0247PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/detail/fail_function.hpp>
+#include <boost/spirit/home/karma/detail/pass_container.hpp>
+#include <boost/spirit/home/karma/detail/get_stricttag.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/detail/what_function.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/karma/detail/indirect_iterator.hpp>
+#include <boost/spirit/home/support/algorithm/any_if.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/sequence_base_id.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/fusion/include/for_each.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/bitor.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/fusion/include/transform.hpp>
+#include <boost/mpl/accumulate.hpp>
+#include <boost/config.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<karma::domain, proto::tag::shift_left> // enables <<
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<karma::domain, proto::tag::shift_left> // flattens <<
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ // specialization for sequences
+ template <typename Elements>
+ struct sequence_properties
+ {
+ struct element_properties
+ {
+ template <typename T>
+ struct result;
+
+ template <typename F, typename Element>
+ struct result<F(Element)>
+ {
+ typedef properties_of<Element> type;
+ };
+
+ // never called, but needed for decltype-based result_of (C++0x)
+#ifndef BOOST_NO_RVALUE_REFERENCES
+ template <typename Element>
+ typename result<element_properties(Element)>::type
+ operator()(Element&&) const;
+#endif
+ };
+
+ typedef typename mpl::accumulate<
+ typename fusion::result_of::transform<
+ Elements, element_properties>::type
+ , mpl::int_<karma::generator_properties::no_properties>
+ , mpl::bitor_<mpl::_2, mpl::_1>
+ >::type type;
+ };
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Elements, typename Strict, typename Derived>
+ struct base_sequence : nary_generator<Derived>
+ {
+ typedef typename traits::sequence_properties<Elements>::type properties;
+
+ base_sequence(Elements const& elements)
+ : elements(elements) {}
+
+ typedef Elements elements_type;
+ struct sequence_base_id;
+
+ template <typename Context, typename Iterator = unused_type>
+ struct attribute
+ {
+ // Put all the element attributes in a tuple
+ typedef typename traits::build_attribute_sequence<
+ Elements, Context, traits::sequence_attribute_transform
+ , Iterator, karma::domain
+ >::type all_attributes;
+
+ // Now, build a fusion vector over the attributes. Note
+ // that build_fusion_vector 1) removes all unused attributes
+ // and 2) may return unused_type if all elements have
+ // unused_type(s).
+ typedef typename
+ traits::build_fusion_vector<all_attributes>::type
+ type_;
+
+ // Finally, strip single element vectors into its
+ // naked form: vector1<T> --> T
+ typedef typename
+ traits::strip_single_element_vector<type_>::type
+ type;
+ };
+
+ // standard case. Attribute is a fusion tuple
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute, typename Pred1, typename Pred2>
+ bool generate_impl(OutputIterator& sink, Context& ctx
+ , Delimiter const& d, Attribute& attr_, Pred1, Pred2) const
+ {
+ typedef detail::fail_function<
+ OutputIterator, Context, Delimiter> fail_function;
+ typedef traits::attribute_not_unused<Context> predicate;
+
+ // wrap the attribute in a tuple if it is not a tuple or if the
+ // attribute of this sequence is a single element tuple
+ typedef typename attribute<Context>::type_ attr_type_;
+ typename traits::wrap_if_not_tuple<Attribute
+ , typename mpl::and_<
+ traits::one_element_sequence<attr_type_>
+ , mpl::not_<traits::one_element_sequence<Attribute> >
+ >::type
+ >::type attr(attr_);
+
+ // return false if *any* of the generators fail
+ bool r = spirit::any_if(elements, attr
+ , fail_function(sink, ctx, d), predicate());
+
+ typedef typename traits::attribute_size<Attribute>::type size_type;
+
+ // fail generating if sequences have not the same (logical) length
+ return !r && (!Strict::value ||
+ // This ignores container element count (which is not good),
+ // but allows valid attributes to succeed. This will lead to
+ // false positives (failing generators, even if they shouldn't)
+ // if the embedded component is restricting the number of
+ // container elements it consumes (i.e. repeat). This solution
+ // is not optimal but much better than letting _all_ repetitive
+ // components fail.
+ Pred1::value ||
+ size_type(traits::sequence_size<attr_type_>::value) == traits::size(attr_));
+ }
+
+ // Special case when Attribute is an stl container and the sequence's
+ // attribute is not a one element sequence
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate_impl(OutputIterator& sink, Context& ctx
+ , Delimiter const& d, Attribute const& attr_
+ , mpl::true_, mpl::false_) const
+ {
+ // return false if *any* of the generators fail
+ typedef detail::fail_function<
+ OutputIterator, Context, Delimiter> fail_function;
+
+ typedef typename traits::container_iterator<
+ typename add_const<Attribute>::type
+ >::type iterator_type;
+
+ typedef
+ typename traits::make_indirect_iterator<iterator_type>::type
+ indirect_iterator_type;
+ typedef detail::pass_container<
+ fail_function, Attribute, indirect_iterator_type, mpl::true_>
+ pass_container;
+
+ iterator_type begin = traits::begin(attr_);
+ iterator_type end = traits::end(attr_);
+
+ pass_container pass(fail_function(sink, ctx, d),
+ indirect_iterator_type(begin), indirect_iterator_type(end));
+ bool r = fusion::any(elements, pass);
+
+ // fail generating if sequences have not the same (logical) length
+ return !r && (!Strict::value || begin == end);
+ }
+
+ // main generate function. Dispatches to generate_impl depending
+ // on the Attribute type.
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ typedef typename traits::is_container<Attribute>::type
+ is_container;
+
+ typedef typename attribute<Context>::type_ attr_type_;
+ typedef typename traits::one_element_sequence<attr_type_>::type
+ is_one_element_sequence;
+
+ return generate_impl(sink, ctx, d, attr, is_container()
+ , is_one_element_sequence());
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ info result("sequence");
+ fusion::for_each(elements,
+ spirit::detail::what_function<Context>(result, context));
+ return result;
+ }
+
+ Elements elements;
+ };
+
+ template <typename Elements>
+ struct sequence
+ : base_sequence<Elements, mpl::false_, sequence<Elements> >
+ {
+ typedef base_sequence<Elements, mpl::false_, sequence> base_sequence_;
+
+ sequence(Elements const& subject)
+ : base_sequence_(subject) {}
+ };
+
+ template <typename Elements>
+ struct strict_sequence
+ : base_sequence<Elements, mpl::true_, strict_sequence<Elements> >
+ {
+ typedef base_sequence<Elements, mpl::true_, strict_sequence>
+ base_sequence_;
+
+ strict_sequence(Elements const& subject)
+ : base_sequence_(subject) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Elements, bool strict_mode = false>
+ struct make_sequence
+ : make_nary_composite<Elements, sequence>
+ {};
+
+ template <typename Elements>
+ struct make_sequence<Elements, true>
+ : make_nary_composite<Elements, strict_sequence>
+ {};
+ }
+
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::shift_left, Elements, Modifiers>
+ : detail::make_sequence<Elements, detail::get_stricttag<Modifiers>::value>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Helper template allowing to get the required container type for a rule
+ // attribute, which is part of a sequence.
+ template <typename Iterator>
+ struct make_sequence_iterator_range
+ {
+ typedef iterator_range<detail::indirect_iterator<Iterator> > type;
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements>
+ struct has_semantic_action<karma::sequence<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ template <typename Elements>
+ struct has_semantic_action<karma::strict_sequence<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::sequence<Elements>, Attribute, Context
+ , Iterator>
+ : mpl::true_ {};
+
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::strict_sequence<Elements>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/phoenix_attributes.hpp b/boost/spirit/home/karma/phoenix_attributes.hpp
new file mode 100644
index 0000000000..a050cf4271
--- /dev/null
+++ b/boost/spirit/home/karma/phoenix_attributes.hpp
@@ -0,0 +1,124 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_PHOENIX_ATTRIBUTES_OCT_01_2009_1128AM)
+#define BOOST_SPIRIT_KARMA_PHOENIX_ATTRIBUTES_OCT_01_2009_1128AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/version.hpp>
+
+// we support Phoenix attributes only starting with V2.2
+#if SPIRIT_VERSION >= 0x2020
+
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/karma/detail/indirect_iterator.hpp>
+#include <boost/spirit/home/support/container.hpp>
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/utility/result_of.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Provide customization points allowing the use of phoenix expressions as
+ // generator functions in the context of generators expecting a container
+ // attribute (Kleene, plus, list, repeat, etc.)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Eval>
+ struct is_container<phoenix::actor<Eval> const>
+ : is_container<typename boost::result_of<phoenix::actor<Eval>()>::type>
+ {};
+
+ template <typename Eval>
+ struct container_iterator<phoenix::actor<Eval> const>
+ {
+ typedef phoenix::actor<Eval> const& type;
+ };
+
+ template <typename Eval>
+ struct begin_container<phoenix::actor<Eval> const>
+ {
+ typedef phoenix::actor<Eval> const& type;
+ static type call(phoenix::actor<Eval> const& f)
+ {
+ return f;
+ }
+ };
+
+ template <typename Eval>
+ struct end_container<phoenix::actor<Eval> const>
+ {
+ typedef phoenix::actor<Eval> const& type;
+ static type call(phoenix::actor<Eval> const& f)
+ {
+ return f;
+ }
+ };
+
+ template <typename Eval>
+ struct deref_iterator<phoenix::actor<Eval> const>
+ {
+ typedef typename boost::result_of<phoenix::actor<Eval>()>::type type;
+ static type call(phoenix::actor<Eval> const& f)
+ {
+ return f();
+ }
+ };
+
+ template <typename Eval>
+ struct next_iterator<phoenix::actor<Eval> const>
+ {
+ typedef phoenix::actor<Eval> const& type;
+ static type call(phoenix::actor<Eval> const& f)
+ {
+ return f;
+ }
+ };
+
+ template <typename Eval>
+ struct compare_iterators<phoenix::actor<Eval> const>
+ {
+ static bool
+ call(phoenix::actor<Eval> const&, phoenix::actor<Eval> const&)
+ {
+ return false;
+ }
+ };
+
+ template <typename Eval>
+ struct container_value<phoenix::actor<Eval> >
+ {
+ typedef phoenix::actor<Eval> const& type;
+ };
+
+ template <typename Eval>
+ struct make_indirect_iterator<phoenix::actor<Eval> const>
+ {
+ typedef phoenix::actor<Eval> const& type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Handle Phoenix actors as attributes, just invoke the function object
+ // and deal with the result as the attribute.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Eval, typename Exposed>
+ struct extract_from_attribute<phoenix::actor<Eval>, Exposed>
+ {
+ typedef typename boost::result_of<phoenix::actor<Eval>()>::type type;
+
+ template <typename Context>
+ static type call(phoenix::actor<Eval> const& f, Context& context)
+ {
+ return f(unused, context);
+ }
+ };
+}}}
+
+#endif
+#endif
diff --git a/boost/spirit/home/karma/reference.hpp b/boost/spirit/home/karma/reference.hpp
new file mode 100644
index 0000000000..4ee5a78659
--- /dev/null
+++ b/boost/spirit/home/karma/reference.hpp
@@ -0,0 +1,91 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_REFERENCE_APR_17_2009_1057PM)
+#define BOOST_SPIRIT_KARMA_REFERENCE_APR_17_2009_1057PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/ref.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // reference is a generator that references another generator (its Subject)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct reference : generator<reference<Subject> >
+ {
+ typedef mpl::int_<generator_properties::all_properties> properties;
+
+ typedef Subject subject_type;
+
+ reference(Subject& subject)
+ : ref(subject) {}
+
+ template <typename Context, typename Unused>
+ struct attribute : Subject::template attribute<Context, Unused> {};
+
+ // Default overload, used whenever the attribute is not unused and not
+ // used from an aliased rule.
+ template <typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& delim, Attribute const& attr) const
+ {
+ return ref.get().generate(sink, context, delim, attr);
+ }
+
+ // This overload gets called from an aliased rule only, we take the
+ // attribute from the context provided from the wrapper rule.
+ template <typename OutputIterator, typename Context
+ , typename Delimiter>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& delim, unused_type) const
+ {
+ return ref.get().generate(sink, context, delim, context.attributes);
+ }
+
+ // This overload is used whenever no attribute is given and it is used
+ // not from an aliased rule.
+ template <typename OutputIterator, typename Delimiter>
+ bool generate(OutputIterator& sink, unused_type
+ , Delimiter const& delim, unused_type) const
+ {
+ return ref.get().generate(sink, unused, delim, unused);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ // the reference is transparent (does not add any info)
+ return ref.get().what(context);
+ }
+
+ boost::reference_wrapper<Subject> ref;
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::reference<Subject>, Attribute
+ , Context, Iterator>
+ : handles_container<typename remove_const<Subject>::type, Attribute
+ , Context, Iterator>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/stream.hpp b/boost/spirit/home/karma/stream.hpp
new file mode 100644
index 0000000000..77636f8296
--- /dev/null
+++ b/boost/spirit/home/karma/stream.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_STREAM_MAY_01_2007_1254AM)
+#define BOOST_SPIRIT_KARMA_STREAM_MAY_01_2007_1254AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/iterators/ostream_iterator.hpp>
+#include <boost/spirit/home/karma/stream/stream.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/stream/detail/format_manip.hpp b/boost/spirit/home/karma/stream/detail/format_manip.hpp
new file mode 100644
index 0000000000..0c771fc554
--- /dev/null
+++ b/boost/spirit/home/karma/stream/detail/format_manip.hpp
@@ -0,0 +1,207 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_FORMAT_MANIP_MAY_03_2007_1424PM)
+#define BOOST_SPIRIT_KARMA_FORMAT_MANIP_MAY_03_2007_1424PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <iterator>
+#include <string>
+#include <boost/spirit/home/karma/generate.hpp>
+#include <boost/spirit/home/support/iterators/ostream_iterator.hpp>
+#include <boost/mpl/bool.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr
+ , typename CopyExpr = mpl::false_, typename CopyAttr = mpl::false_
+ , typename Delimiter = unused_type, typename Attribute = unused_type>
+ struct format_manip
+ {
+ // This assertion makes sure we don't hit the only code path which is
+ // not implemented (because it isn't needed), where both, the
+ // expression and the attribute need to be held as a copy.
+ BOOST_SPIRIT_ASSERT_MSG(!CopyExpr::value || !CopyAttr::value
+ , error_invalid_should_not_happen, ());
+
+ format_manip(Expr const& xpr, Delimiter const& d, Attribute const& a)
+ : expr(xpr), delim(d), pre(delimit_flag::dont_predelimit), attr(a) {}
+
+ format_manip(Expr const& xpr, Delimiter const& d
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit, Attribute const& a)
+ : expr(xpr), delim(d), pre(pre_delimit), attr(a) {}
+
+ Expr const& expr;
+ Delimiter const& delim;
+ BOOST_SCOPED_ENUM(delimit_flag) const pre;
+ Attribute const& attr;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ format_manip& operator= (format_manip const&);
+ };
+
+ template <typename Expr, typename Delimiter, typename Attribute>
+ struct format_manip<Expr, mpl::false_, mpl::true_, Delimiter, Attribute>
+ {
+ format_manip(Expr const& xpr, Delimiter const& d, Attribute const& a)
+ : expr(xpr), delim(d), pre(delimit_flag::dont_predelimit), attr(a) {}
+
+ format_manip(Expr const& xpr, Delimiter const& d
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit, Attribute const& a)
+ : expr(xpr), delim(d), pre(pre_delimit), attr(a) {}
+
+ Expr const& expr;
+ Delimiter const& delim;
+ BOOST_SCOPED_ENUM(delimit_flag) const pre;
+ Attribute attr;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ format_manip& operator= (format_manip const&);
+ };
+
+ template <typename Expr, typename Delimiter, typename Attribute>
+ struct format_manip<Expr, mpl::true_, mpl::false_, Delimiter, Attribute>
+ {
+ format_manip(Expr const& xpr, Delimiter const& d, Attribute const& a)
+ : expr(xpr), delim(d), pre(delimit_flag::dont_predelimit), attr(a) {}
+
+ format_manip(Expr const& xpr, Delimiter const& d
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit, Attribute const& a)
+ : expr(xpr), delim(d), pre(pre_delimit), attr(a) {}
+
+ Expr expr;
+ Delimiter const& delim;
+ BOOST_SCOPED_ENUM(delimit_flag) const pre;
+ Attribute const& attr;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ format_manip& operator= (format_manip const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Enable = void>
+ struct format
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (Expr) is not a valid spirit karma expression.
+ // Did you intend to use the auto_ facilities while forgetting to
+ // #include <boost/spirit/include/karma_format_auto.hpp>?
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ };
+
+ template <typename Expr>
+ struct format<Expr
+ , typename enable_if<traits::matches<karma::domain, Expr> >::type>
+ {
+ typedef format_manip<Expr> type;
+
+ static type call(Expr const& expr)
+ {
+ return type(expr, unused, unused);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Delimiter, typename Enable = void>
+ struct format_delimited
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (Expr) is not a valid spirit karma expression.
+ // Did you intend to use the auto_ facilities while forgetting to
+ // #include <boost/spirit/include/karma_format_auto.hpp>?
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ };
+
+ template <typename Expr, typename Delimiter>
+ struct format_delimited<Expr, Delimiter
+ , typename enable_if<traits::matches<karma::domain, Expr> >::type>
+ {
+ typedef format_manip<Expr, mpl::false_, mpl::false_, Delimiter> type;
+
+ static type call(
+ Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the delimiter is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
+ return type(expr, delimiter, pre_delimit, unused);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Expr
+ , typename CopyExpr, typename CopyAttr>
+ inline std::basic_ostream<Char, Traits> &
+ operator<< (std::basic_ostream<Char, Traits> &os
+ , format_manip<Expr, CopyExpr, CopyAttr> const& fm)
+ {
+ karma::ostream_iterator<Char, Char, Traits> sink(os);
+ if (!karma::generate (sink, fm.expr))
+ {
+ os.setstate(std::ios_base::failbit);
+ }
+ return os;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Expr
+ , typename CopyExpr, typename CopyAttr, typename Attribute>
+ inline std::basic_ostream<Char, Traits> &
+ operator<< (std::basic_ostream<Char, Traits> &os
+ , format_manip<Expr, CopyExpr, CopyAttr, unused_type, Attribute> const& fm)
+ {
+ karma::ostream_iterator<Char, Char, Traits> sink(os);
+ if (!karma::generate(sink, fm.expr, fm.attr))
+ {
+ os.setstate(std::ios_base::failbit);
+ }
+ return os;
+ }
+
+ template<typename Char, typename Traits, typename Expr
+ , typename CopyExpr, typename CopyAttr, typename Delimiter>
+ inline std::basic_ostream<Char, Traits> &
+ operator<< (std::basic_ostream<Char, Traits> &os
+ , format_manip<Expr, CopyExpr, CopyAttr, Delimiter> const& fm)
+ {
+ karma::ostream_iterator<Char, Char, Traits> sink(os);
+ if (!karma::generate_delimited(sink, fm.expr, fm.delim, fm.pre))
+ {
+ os.setstate(std::ios_base::failbit);
+ }
+ return os;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Expr
+ , typename CopyExpr, typename CopyAttr, typename Delimiter
+ , typename Attribute>
+ inline std::basic_ostream<Char, Traits> &
+ operator<< (std::basic_ostream<Char, Traits> &os
+ , format_manip<Expr, CopyExpr, CopyAttr, Delimiter, Attribute> const& fm)
+ {
+ karma::ostream_iterator<Char, Char, Traits> sink(os);
+ if (!karma::generate_delimited(sink, fm.expr, fm.delim, fm.pre, fm.attr))
+ {
+ os.setstate(std::ios_base::failbit);
+ }
+ return os;
+ }
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/stream/detail/format_manip_auto.hpp b/boost/spirit/home/karma/stream/detail/format_manip_auto.hpp
new file mode 100644
index 0000000000..9fd4ff5af1
--- /dev/null
+++ b/boost/spirit/home/karma/stream/detail/format_manip_auto.hpp
@@ -0,0 +1,56 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_FORMAT_MANIP_AUTO_DEC_02_2009_1246PM)
+#define BOOST_SPIRIT_KARMA_FORMAT_MANIP_AUTO_DEC_02_2009_1246PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/stream/detail/format_manip.hpp>
+#include <boost/spirit/home/karma/auto/create_generator.hpp>
+#include <boost/utility/enable_if.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ struct format<Expr
+ , typename enable_if<traits::meta_create_exists<karma::domain, Expr> >::type>
+ {
+ typedef typename result_of::create_generator<Expr>::type expr_type;
+ typedef format_manip<
+ expr_type, mpl::true_, mpl::false_, unused_type, Expr
+ > type;
+
+ static type call(Expr const& expr)
+ {
+ return type(create_generator<Expr>(), unused, expr);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Delimiter>
+ struct format_delimited<Expr, Delimiter
+ , typename enable_if<traits::meta_create_exists<karma::domain, Expr> >::type>
+ {
+ typedef typename result_of::create_generator<Expr>::type expr_type;
+ typedef format_manip<
+ expr_type, mpl::true_, mpl::false_, Delimiter, Expr
+ > type;
+
+ static type call(Expr const& expr
+ , Delimiter const& delimiter
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit)
+ {
+ return type(create_generator<Expr>(), delimiter, pre_delimit, expr);
+ }
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/stream/detail/iterator_sink.hpp b/boost/spirit/home/karma/stream/detail/iterator_sink.hpp
new file mode 100644
index 0000000000..95a57d42f1
--- /dev/null
+++ b/boost/spirit/home/karma/stream/detail/iterator_sink.hpp
@@ -0,0 +1,55 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boist.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_SPIRIT_ITERATOR_SINK_MAY_27_2007_0133PM)
+#define BOOST_SPIRIT_ITERATOR_SINK_MAY_27_2007_0133PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/iostreams/stream.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename OutputIterator, typename Char, typename CharEncoding
+ , typename Tag
+ >
+ struct iterator_sink
+ {
+ typedef boost::iostreams::sink_tag category;
+ typedef Char char_type;
+
+ iterator_sink (OutputIterator& sink_)
+ : sink(sink_)
+ {}
+
+ // Write up to n characters from the buffer s to the output sequence,
+ // returning the number of characters written
+ std::streamsize write (Char const* s, std::streamsize n)
+ {
+ std::streamsize bytes_written = 0;
+ while (n--) {
+ if (!generate_to(sink, *s, CharEncoding(), Tag()))
+ break;
+ ++s; ++bytes_written;
+ }
+ return bytes_written;
+ }
+
+ OutputIterator& sink;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ iterator_sink& operator= (iterator_sink const&);
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/karma/stream/format_manip.hpp b/boost/spirit/home/karma/stream/format_manip.hpp
new file mode 100644
index 0000000000..2f6c29e7ce
--- /dev/null
+++ b/boost/spirit/home/karma/stream/format_manip.hpp
@@ -0,0 +1,117 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_FORMAT_MANIP_MAY_01_2007_1211PM)
+#define BOOST_SPIRIT_KARMA_FORMAT_MANIP_MAY_01_2007_1211PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/generate.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/detail/output_iterator.hpp>
+#include <boost/spirit/home/karma/stream/detail/format_manip.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ inline typename detail::format<Expr>::type
+ format(Expr const& expr)
+ {
+ return detail::format<Expr>::call(expr);
+ }
+
+ template <typename Expr, typename Attribute>
+ inline detail::format_manip<Expr, mpl::false_, mpl::false_, unused_type, Attribute>
+ format(
+ Expr const& expr
+ , Attribute const& attr)
+ {
+ using karma::detail::format_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ return format_manip<Expr, mpl::false_, mpl::false_, unused_type, Attribute>(
+ expr, unused, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Delimiter>
+ inline typename detail::format_delimited<Expr, Delimiter>::type
+ format_delimited(
+ Expr const& expr
+ , Delimiter const& d
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit =
+ delimit_flag::dont_predelimit)
+ {
+ return detail::format_delimited<Expr, Delimiter>::call(expr, d, pre_delimit);
+ }
+
+ template <typename Expr, typename Delimiter, typename Attribute>
+ inline detail::format_manip<Expr, mpl::false_, mpl::false_, Delimiter, Attribute>
+ format_delimited(
+ Expr const& xpr
+ , Delimiter const& d
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
+ , Attribute const& attr)
+ {
+ using karma::detail::format_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
+ return format_manip<Expr, mpl::false_, mpl::false_, Delimiter, Attribute>(
+ xpr, d, pre_delimit, attr);
+ }
+
+ template <typename Expr, typename Delimiter, typename Attribute>
+ inline detail::format_manip<Expr, mpl::false_, mpl::false_, Delimiter, Attribute>
+ format_delimited(
+ Expr const& xpr
+ , Delimiter const& d
+ , Attribute const& attr)
+ {
+ using karma::detail::format_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
+ return format_manip<Expr, mpl::false_, mpl::false_, Delimiter, Attribute>(
+ xpr, d, delimit_flag::dont_predelimit, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Derived>
+ inline std::basic_ostream<Char, Traits> &
+ operator<< (std::basic_ostream<Char, Traits> &os, generator<Derived> const& g)
+ {
+ typedef traits::properties_of<
+ typename result_of::compile<karma::domain, Derived>::type
+ > properties;
+ typedef karma::ostream_iterator<Char, Char, Traits> outiter_type;
+
+ outiter_type target_sink(os);
+ karma::detail::output_iterator<outiter_type, properties> sink(target_sink);
+
+ if (!g.derived().generate(sink, unused, unused, unused))
+ {
+ os.setstate(std::ios_base::failbit);
+ }
+ return os;
+ }
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/karma/stream/format_manip_attr.hpp b/boost/spirit/home/karma/stream/format_manip_attr.hpp
new file mode 100644
index 0000000000..08d53a6d4f
--- /dev/null
+++ b/boost/spirit/home/karma/stream/format_manip_attr.hpp
@@ -0,0 +1,123 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_KARMA_FORMAT_MANIP_ATTR_APR_24_2009_0734AM)
+#define BOOST_SPIRIT_KARMA_FORMAT_MANIP_ATTR_APR_24_2009_0734AM
+
+#include <boost/spirit/home/karma/stream/format_manip.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 \
+ <boost/spirit/home/karma/stream/format_manip_attr.hpp>
+#define BOOST_PP_ITERATION_LIMITS (2, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+#define BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE(z, n, A) \
+ BOOST_PP_CAT(A, n) const&
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline detail::format_manip<Expr, mpl::false_, mpl::true_, unused_type
+ , fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
+ > >
+ format(Expr const& xpr, BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ using karma::detail::format_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return format_manip<Expr, mpl::false_, mpl::true_, unused_type, vector_type>(
+ xpr, unused, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Delimiter
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline detail::format_manip<Expr, mpl::false_, mpl::true_, Delimiter
+ , fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
+ > >
+ format_delimited(Expr const& xpr, Delimiter const& d
+ , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ using karma::detail::format_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return format_manip<Expr, mpl::false_, mpl::true_, Delimiter, vector_type>(
+ xpr, d, pre_delimit, attr);
+ }
+
+ template <typename Expr, typename Delimiter
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline detail::format_manip<Expr, mpl::false_, mpl::true_, Delimiter
+ , fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
+ > >
+ format_delimited(Expr const& xpr, Delimiter const& d
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+ {
+ using karma::detail::format_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return format_manip<Expr, mpl::false_, mpl::true_, Delimiter, vector_type>(
+ xpr, d, delimit_flag::dont_predelimit, attr);
+ }
+}}}
+
+#undef BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE
+#undef N
+
+#endif
+
diff --git a/boost/spirit/home/karma/stream/ostream_iterator.hpp b/boost/spirit/home/karma/stream/ostream_iterator.hpp
new file mode 100644
index 0000000000..8a517287a7
--- /dev/null
+++ b/boost/spirit/home/karma/stream/ostream_iterator.hpp
@@ -0,0 +1,65 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_OSTREAM_ITERATOR_MAY_26_2007_1016PM)
+#define BOOST_SPIRIT_KARMA_OSTREAM_ITERATOR_MAY_26_2007_1016PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <iterator>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // We need our own implementation of an ostream_iterator just to be able
+ // to access the wrapped ostream, which is necessary for the
+ // stream_generator, where we must generate the output using the original
+ // ostream to retain possibly registered facets.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename T, typename Elem = char
+ , typename Traits = std::char_traits<Elem> >
+ class ostream_iterator
+ : public std::iterator<std::output_iterator_tag, void, void, void, void>
+ {
+ public:
+ typedef Elem char_type;
+ typedef Traits traits_type;
+ typedef std::basic_ostream<Elem, Traits> ostream_type;
+ typedef ostream_iterator<T, Elem, Traits> self_type;
+
+ ostream_iterator(ostream_type& os_, Elem const* delim_ = 0)
+ : os(&os_), delim(delim_) {}
+
+ self_type& operator= (T const& val)
+ {
+ *os << val;
+ if (0 != delim)
+ *os << delim;
+ return *this;
+ }
+
+ self_type& operator*() { return *this; }
+ self_type& operator++() { return *this; }
+ self_type operator++(int) { return *this; }
+
+ // expose underlying stream
+ ostream_type& get_ostream() { return *os; }
+ ostream_type const& get_ostream() const { return *os; }
+
+ // expose good bit of underlying stream object
+ bool good() const { return get_ostream().good(); }
+
+ protected:
+ ostream_type *os;
+ Elem const* delim;
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/stream/stream.hpp b/boost/spirit/home/karma/stream/stream.hpp
new file mode 100644
index 0000000000..d1cd45638e
--- /dev/null
+++ b/boost/spirit/home/karma/stream/stream.hpp
@@ -0,0 +1,371 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_STREAM_MAY_01_2007_0310PM)
+#define BOOST_SPIRIT_KARMA_STREAM_MAY_01_2007_0310PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/detail/hold_any.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/support/detail/is_spirit_tag.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/stream/detail/format_manip.hpp>
+#include <boost/spirit/home/karma/stream/detail/iterator_sink.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <iosfwd>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ namespace tag
+ {
+ template <typename Char = char>
+ struct stream_tag
+ {
+ BOOST_SPIRIT_IS_TAG()
+ };
+ }
+
+ namespace karma
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // This one is the class that the user can instantiate directly in
+ // order to create a customized int generator
+ template <typename Char = char>
+ struct stream_generator
+ : spirit::terminal<tag::stream_tag<Char> >
+ {};
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<karma::domain, tag::stream> // enables stream
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<karma::domain, tag::wstream> // enables wstream
+ : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables stream(...)
+ , terminal_ex<tag::stream, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<karma::domain // enables wstream(...)
+ , terminal_ex<tag::wstream, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <> // enables stream(f)
+ struct use_lazy_terminal<
+ karma::domain, tag::stream, 1 /*arity*/
+ > : mpl::true_ {};
+
+ template <> // enables wstream(f)
+ struct use_lazy_terminal<
+ karma::domain, tag::wstream, 1 /*arity*/
+ > : mpl::true_ {};
+
+ // enables stream_generator<char_type>
+ template <typename Char>
+ struct use_terminal<karma::domain, tag::stream_tag<Char> >
+ : mpl::true_ {};
+
+ template <typename Char, typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::stream_tag<Char>, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename Char>
+ struct use_lazy_terminal<
+ karma::domain, tag::stream_tag<Char>, 1 /*arity*/
+ > : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::stream;
+ using spirit::wstream;
+#endif
+ using spirit::stream_type;
+ using spirit::wstream_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char, typename CharEncoding, typename Tag>
+ struct any_stream_generator
+ : primitive_generator<any_stream_generator<Char, CharEncoding, Tag> >
+ {
+ template <typename Context, typename Unused = unused_type>
+ struct attribute
+ {
+ typedef spirit::basic_hold_any<Char> type;
+ };
+
+ // any_stream_generator has an attached attribute
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute
+ >
+ static bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr)
+ {
+ typedef karma::detail::iterator_sink<
+ OutputIterator, Char, CharEncoding, Tag
+ > sink_device;
+
+ if (!traits::has_optional_value(attr))
+ return false;
+
+ // use existing operator<<()
+ typedef typename attribute<Context>::type attribute_type;
+
+ boost::iostreams::stream<sink_device> ostr(sink);
+ ostr << traits::extract_from<attribute_type>(attr, context) << std::flush;
+
+ if (ostr.good())
+ return karma::delimit_out(sink, d); // always do post-delimiting
+ return false;
+ }
+
+ // this is a special overload to detect if the output iterator has been
+ // generated by a format_manip object.
+ template <
+ typename T, typename Traits, typename Properties, typename Context
+ , typename Delimiter, typename Attribute
+ >
+ static bool generate(
+ karma::detail::output_iterator<
+ karma::ostream_iterator<T, Char, Traits>, Properties
+ >& sink, Context& context, Delimiter const& d
+ , Attribute const& attr)
+ {
+ typedef karma::detail::output_iterator<
+ karma::ostream_iterator<T, Char, Traits>, Properties
+ > output_iterator;
+ typedef karma::detail::iterator_sink<
+ output_iterator, Char, CharEncoding, Tag
+ > sink_device;
+
+ if (!traits::has_optional_value(attr))
+ return false;
+
+ // use existing operator<<()
+ typedef typename attribute<Context>::type attribute_type;
+
+ boost::iostreams::stream<sink_device> ostr(sink);
+ ostr.imbue(sink.get_ostream().getloc());
+ ostr << traits::extract_from<attribute_type>(attr, context)
+ << std::flush;
+
+ if (ostr.good())
+ return karma::delimit_out(sink, d); // always do post-delimiting
+ return false;
+ }
+
+ // this any_stream has no parameter attached, it needs to have been
+ // initialized from a value/variable
+ template <typename OutputIterator, typename Context
+ , typename Delimiter>
+ static bool
+ generate(OutputIterator&, Context&, Delimiter const&, unused_type)
+ {
+ // It is not possible (doesn't make sense) to use stream generators
+ // without providing any attribute, as the generator doesn't 'know'
+ // what to output. The following assertion fires if this situation
+ // is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false, stream_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("stream");
+ }
+ };
+
+ template <typename T, typename Char, typename CharEncoding, typename Tag>
+ struct lit_stream_generator
+ : primitive_generator<lit_stream_generator<T, Char, CharEncoding, Tag> >
+ {
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ lit_stream_generator(typename add_reference<T>::type t)
+ : t_(t)
+ {}
+
+ // lit_stream_generator has an attached parameter
+
+ // this overload will be used in the normal case (not called from
+ // format_manip).
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , Attribute const&) const
+ {
+ typedef karma::detail::iterator_sink<
+ OutputIterator, Char, CharEncoding, Tag
+ > sink_device;
+
+ boost::iostreams::stream<sink_device> ostr(sink);
+ ostr << t_ << std::flush; // use existing operator<<()
+
+ if (ostr.good())
+ return karma::delimit_out(sink, d); // always do post-delimiting
+ return false;
+ }
+
+ // this is a special overload to detect if the output iterator has been
+ // generated by a format_manip object.
+ template <
+ typename T1, typename Traits, typename Properties
+ , typename Context, typename Delimiter, typename Attribute>
+ bool generate(
+ karma::detail::output_iterator<
+ karma::ostream_iterator<T1, Char, Traits>, Properties
+ >& sink, Context&, Delimiter const& d, Attribute const&) const
+ {
+ typedef karma::detail::output_iterator<
+ karma::ostream_iterator<T1, Char, Traits>, Properties
+ > output_iterator;
+ typedef karma::detail::iterator_sink<
+ output_iterator, Char, CharEncoding, Tag
+ > sink_device;
+
+ boost::iostreams::stream<sink_device> ostr(sink);
+ ostr.imbue(sink.get_ostream().getloc());
+ ostr << t_ << std::flush; // use existing operator<<()
+
+ if (ostr.good())
+ return karma::delimit_out(sink, d); // always do post-delimiting
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("any-stream");
+ }
+
+ T t_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ lit_stream_generator& operator= (lit_stream_generator const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char, typename Modifiers>
+ struct make_stream
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef any_stream_generator<
+ Char
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ > result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ // stream
+ template <typename Modifiers>
+ struct make_primitive<tag::stream, Modifiers>
+ : make_stream<char, Modifiers> {};
+
+ // wstream
+ template <typename Modifiers>
+ struct make_primitive<tag::wstream, Modifiers>
+ : make_stream<wchar_t, Modifiers> {};
+
+ // any_stream_generator<char_type>
+ template <typename Char, typename Modifiers>
+ struct make_primitive<tag::stream_tag<Char>, Modifiers>
+ : make_stream<Char, Modifiers> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char, typename A0, typename Modifiers>
+ struct make_any_stream
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef typename add_const<A0>::type const_attribute;
+ typedef lit_stream_generator<
+ const_attribute, Char
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ // stream(...)
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::stream, fusion::vector1<A0> >, Modifiers>
+ : make_any_stream<char, A0, Modifiers> {};
+
+ // wstream(...)
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::wstream, fusion::vector1<A0> >, Modifiers>
+ : make_any_stream<wchar_t, A0, Modifiers> {};
+
+ // any_stream_generator<char_type>(...)
+ template <typename Char, typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::stream_tag<Char>, fusion::vector1<A0> >
+ , Modifiers>
+ : make_any_stream<Char, A0, Modifiers> {};
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/string.hpp b/boost/spirit/home/karma/string.hpp
new file mode 100644
index 0000000000..8326a149bd
--- /dev/null
+++ b/boost/spirit/home/karma/string.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_STRING_FEB_23_2007_0156PM)
+#define BOOST_SPIRIT_KARMA_STRING_FEB_23_2007_0156PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/string/lit.hpp>
+#include <boost/spirit/home/karma/string/symbols.hpp>
+
+#endif
diff --git a/boost/spirit/home/karma/string/lit.hpp b/boost/spirit/home/karma/string/lit.hpp
new file mode 100644
index 0000000000..831063b598
--- /dev/null
+++ b/boost/spirit/home/karma/string/lit.hpp
@@ -0,0 +1,334 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// 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)
+
+#if !defined(BOOST_SPIRIT_KARMA_LIT_FEB_22_2007_0534PM)
+#define BOOST_SPIRIT_KARMA_LIT_FEB_22_2007_0534PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/spirit/home/karma/detail/string_generate.hpp>
+#include <boost/spirit/home/karma/detail/string_compare.hpp>
+#include <boost/spirit/home/karma/detail/enable_lit.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <string>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct use_terminal<karma::domain
+ , tag::char_code<tag::string, CharEncoding> > // enables string
+ : mpl::true_ {};
+
+ template <typename T>
+ struct use_terminal<karma::domain, T
+ , typename enable_if<traits::is_string<T> >::type> // enables string literals
+ : mpl::true_ {};
+
+ template <typename CharEncoding, typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<
+ tag::char_code<tag::string, CharEncoding> // enables string(str)
+ , fusion::vector1<A0> >
+ > : traits::is_string<A0> {};
+
+ template <typename CharEncoding> // enables string(f)
+ struct use_lazy_terminal<
+ karma::domain
+ , tag::char_code<tag::string, CharEncoding>
+ , 1 /*arity*/
+ > : mpl::true_ {};
+
+ // enables lit(str)
+ template <typename A0>
+ struct use_terminal<karma::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<traits::is_string<A0> >::type>
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::lit;
+#endif
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // generate literal strings from a given parameter
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag>
+ struct any_string
+ : primitive_generator<any_string<CharEncoding, Tag> >
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ template <typename Context, typename Unused = unused_type>
+ struct attribute
+ {
+ typedef std::basic_string<char_type> type;
+ };
+
+ // lit has an attached attribute
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ static bool
+ generate(OutputIterator& sink, Context& context, Delimiter const& d,
+ Attribute const& attr)
+ {
+ if (!traits::has_optional_value(attr))
+ return false;
+
+ typedef typename attribute<Context>::type attribute_type;
+ return
+ karma::detail::string_generate(sink
+ , traits::extract_from<attribute_type>(attr, context)
+ , char_encoding(), Tag()) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // this lit has no attribute attached, it needs to have been
+ // initialized from a direct literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ static bool generate(OutputIterator&, Context&, Delimiter const&,
+ unused_type const&)
+ {
+ // It is not possible (doesn't make sense) to use string without
+ // providing any attribute, as the generator doesn't 'know' what
+ // character to output. The following assertion fires if this
+ // situation is detected in your code.
+ BOOST_SPIRIT_ASSERT_MSG(false, string_not_usable_without_attribute, ());
+ return false;
+ }
+
+ template <typename Context>
+ static info what(Context const& /*context*/)
+ {
+ return info("any-string");
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // generate literal strings
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename String, typename CharEncoding, typename Tag, bool no_attribute>
+ struct literal_string
+ : primitive_generator<literal_string<String, CharEncoding, Tag, no_attribute> >
+ {
+ typedef CharEncoding char_encoding;
+ typedef typename
+ remove_const<typename traits::char_type_of<String>::type>::type
+ char_type;
+ typedef std::basic_string<char_type> string_type;
+
+ template <typename Context, typename Unused = unused_type>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, string_type>
+ {};
+
+ literal_string(typename add_reference<String>::type str)
+ : str_(str)
+ {}
+
+ // A string("...") which additionally has an associated attribute emits
+ // its immediate literal only if it matches the attribute, otherwise
+ // it fails.
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& d, Attribute const& attr) const
+ {
+ if (!traits::has_optional_value(attr))
+ return false;
+
+ // fail if attribute isn't matched by immediate literal
+ typedef typename attribute<Context>::type attribute_type;
+
+ typedef typename spirit::result_of::extract_from<attribute_type, Attribute>::type
+ extracted_string_type;
+
+ using spirit::traits::get_c_string;
+ if (!detail::string_compare(
+ get_c_string(
+ traits::extract_from<attribute_type>(attr, context))
+ , get_c_string(str_), char_encoding(), Tag()))
+ {
+ return false;
+ }
+ return detail::string_generate(sink, str_, char_encoding(), Tag()) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ // A string("...") without any associated attribute just emits its
+ // immediate literal
+ template <typename OutputIterator, typename Context, typename Delimiter>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , unused_type) const
+ {
+ return detail::string_generate(sink, str_, char_encoding(), Tag()) &&
+ karma::delimit_out(sink, d); // always do post-delimiting
+ }
+
+ template <typename Context>
+ info what(Context const& /*context*/) const
+ {
+ return info("literal-string", str_);
+ }
+
+ string_type str_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // string
+ template <typename CharEncoding, typename Modifiers>
+ struct make_primitive<
+ tag::char_code<tag::string, CharEncoding>
+ , Modifiers>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef any_string<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers, CharEncoding, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ > result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ // string literal
+ template <typename T, typename Modifiers>
+ struct make_primitive<T, Modifiers
+ , typename enable_if<traits::is_string<T> >::type>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef typename add_const<T>::type const_string;
+ typedef literal_string<
+ const_string
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , true
+ > result_type;
+
+ result_type operator()(
+ typename add_reference<const_string>::type str, unused_type) const
+ {
+ return result_type(str);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename CharEncoding, typename Modifiers, typename A0
+ , bool no_attribute>
+ struct make_string_direct
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef typename add_const<A0>::type const_string;
+ typedef literal_string<
+ const_string
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type
+ , no_attribute
+ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+ }
+
+ // string("..."), lit("...")
+ template <typename CharEncoding, typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::string, CharEncoding>
+ , fusion::vector1<A0> >
+ , Modifiers>
+ : detail::make_string_direct<CharEncoding, Modifiers, A0, false>
+ {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers
+ , typename enable_if<traits::is_string<A0> >::type>
+ : detail::make_string_direct<
+ typename traits::char_encoding_from_char<
+ typename traits::char_type_of<A0>::type>::type
+ , Modifiers, A0, true>
+ {};
+}}} // namespace boost::spirit::karma
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<karma::any_string<CharEncoding, Tag>, Attribute
+ , Context, Iterator>
+ : mpl::false_ {};
+
+ template <typename String, typename CharEncoding, typename Tag
+ , bool no_attribute, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<karma::literal_string<String, CharEncoding, Tag
+ , no_attribute>, Attribute, Context, Iterator>
+ : mpl::false_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/karma/string/symbols.hpp b/boost/spirit/home/karma/string/symbols.hpp
new file mode 100644
index 0000000000..185a280a50
--- /dev/null
+++ b/boost/spirit/home/karma/string/symbols.hpp
@@ -0,0 +1,768 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_KARMA_SYMBOLS_NOV_23_2009_1251PM)
+#define BOOST_SPIRIT_KARMA_SYMBOLS_NOV_23_2009_1251PM
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/karma/detail/extract_from.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/reference.hpp>
+#include <boost/spirit/home/karma/generate.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/string_generate.hpp>
+#include <boost/config.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/mpl/if.hpp>
+#include <map>
+#include <set>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename T, typename Attribute, typename Enable>
+ struct symbols_lookup
+ {
+ typedef
+ mpl::eval_if<fusion::traits::is_sequence<T>
+ , traits::detail::value_at_c<T, 0>
+ , detail::add_const_ref<T> > sequence_type;
+ typedef typename
+ mpl::eval_if<traits::is_container<T>
+ , traits::container_value<T>
+ , sequence_type>::type type;
+
+ // fusion sequence
+ template <typename T_>
+ static type call(T_ const& t, mpl::false_, mpl::true_)
+ {
+ return fusion::at_c<0>(t);
+ }
+
+ // container
+ template <typename T_, typename IsSequence>
+ static type call(T_ const& t, mpl::true_, IsSequence)
+ {
+ return t[0];
+ }
+
+ // not a container and not a fusion sequence
+ template <typename T_>
+ static type call(T_ const& t, mpl::false_, mpl::false_)
+ {
+ return t;
+ }
+
+ static type call(T const& t)
+ {
+ typedef typename traits::is_container<T>::type is_container;
+ typedef typename fusion::traits::is_sequence<T>::type is_sequence;
+
+ return call(t, is_container(), is_sequence());
+ }
+ };
+
+ template <typename Attribute>
+ struct symbols_lookup<Attribute, Attribute>
+ {
+ typedef Attribute const& type;
+
+ static type call(Attribute const& t)
+ {
+ return t;
+ }
+ };
+
+ template <typename Attribute, typename T, typename Enable>
+ struct symbols_value
+ {
+ typedef
+ mpl::eval_if<fusion::traits::is_sequence<T>
+ , traits::detail::value_at_c<T, 1>
+ , mpl::identity<unused_type> > sequence_type;
+ typedef typename
+ mpl::eval_if<traits::is_container<T>
+ , traits::container_value<T>
+ , sequence_type>::type type;
+
+ // fusion sequence
+ template <typename T_>
+ static type call(T_ const& t, mpl::false_, mpl::true_)
+ {
+ return fusion::at_c<1>(t);
+ }
+
+ // container
+ template <typename T_, typename IsSequence>
+ static type call(T_ const& t, mpl::true_, IsSequence)
+ {
+ return t[1];
+ }
+
+ // not a container nor a fusion sequence
+ template <typename T_>
+ static type call(T_ const&, mpl::false_, mpl::false_)
+ {
+ return unused;
+ }
+
+ static type call(T const& t)
+ {
+ typedef typename traits::is_container<T>::type is_container;
+ typedef typename fusion::traits::is_sequence<T>::type is_sequence;
+
+ return call(t, is_container(), is_sequence());
+ }
+ };
+
+ template <typename Attribute>
+ struct symbols_value<Attribute, Attribute>
+ {
+ typedef unused_type type;
+
+ static type call(Attribute const&)
+ {
+ return unused;
+ }
+ };
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Attribute>
+ struct symbols_lookup
+ : mpl::if_<
+ traits::not_is_unused<T>
+ , std::map<Attribute, T>
+ , std::set<Attribute>
+ >
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Tag>
+ struct generate_encoded
+ {
+ typedef typename
+ proto::terminal<tag::char_code<Tag, CharEncoding> >::type
+ encoding_type;
+
+ template <typename OutputIterator, typename Expr, typename Attribute>
+ static bool call(OutputIterator& sink, Expr const& expr
+ , Attribute const& attr)
+ {
+ encoding_type const encoding = encoding_type();
+ return karma::generate(sink, encoding[expr], attr);
+ }
+ };
+
+ template <>
+ struct generate_encoded<unused_type, unused_type>
+ {
+ template <typename OutputIterator, typename Expr, typename Attribute>
+ static bool call(OutputIterator& sink, Expr const& expr
+ , Attribute const& attr)
+ {
+ return karma::generate(sink, expr, attr);
+ }
+ };
+ }
+
+ template <
+ typename Attribute = char, typename T = unused_type
+ , typename Lookup = typename symbols_lookup<T, Attribute>::type
+ , typename CharEncoding = unused_type, typename Tag = unused_type>
+ struct symbols
+ : proto::extends<
+ typename proto::terminal<
+ reference<symbols<Attribute, T, Lookup, CharEncoding, Tag> >
+ >::type
+ , symbols<Attribute, T, Lookup, CharEncoding, Tag> >
+ , primitive_generator<
+ symbols<Attribute, T, Lookup, CharEncoding, Tag> >
+ {
+ typedef T value_type; // the value associated with each entry
+
+ typedef reference<symbols> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, symbols> base_type;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef Attribute type;
+ };
+
+ symbols(std::string const& name = "symbols")
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(new Lookup())
+ , name_(name)
+ {}
+
+ symbols(symbols const& syms)
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(syms.lookup)
+ , name_(syms.name_)
+ {}
+
+ template <typename CharEncoding_, typename Tag_>
+ symbols(symbols<Attribute, T, Lookup, CharEncoding_, Tag_> const& syms)
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(syms.lookup)
+ , name_(syms.name_)
+ {}
+
+ template <typename Symbols, typename Data>
+ symbols(Symbols const& syms, Data const& data
+ , std::string const& name = "symbols")
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(new Lookup())
+ , name_(name)
+ {
+ typename range_const_iterator<Symbols>::type si = boost::begin(syms);
+ typename range_const_iterator<Data>::type di = boost::begin(data);
+ while (si != boost::end(syms))
+ add(*si++, *di++);
+ }
+
+ symbols&
+ operator=(symbols const& rhs)
+ {
+ *lookup = *rhs.lookup;
+ name_ = rhs.name_;
+ return *this;
+ }
+
+ template <typename CharEncoding_, typename Tag_>
+ symbols&
+ operator=(symbols<Attribute, T, Lookup, CharEncoding_, Tag_> const& rhs)
+ {
+ *lookup = *rhs.lookup;
+ name_ = rhs.name_;
+ return *this;
+ }
+
+ void clear()
+ {
+ lookup->clear();
+ }
+
+ struct adder;
+ struct remover;
+
+ template <typename Attr, typename T_>
+ adder const&
+ operator=(std::pair<Attr, T_> const& p)
+ {
+ lookup->clear();
+ return add(p.first, p.second);
+ }
+
+ template <typename Attr, typename T_>
+ friend adder const&
+ operator+= (symbols& sym, std::pair<Attr, T_> const& p)
+ {
+ return sym.add(p.first, p.second);
+ }
+
+ template <typename Attr>
+ friend remover const&
+ operator-= (symbols& sym, Attr const& attr)
+ {
+ return sym.remove(attr);
+ }
+
+#if defined(BOOST_NO_RVALUE_REFERENCES)
+ // non-const version needed to suppress proto's += kicking in
+ template <typename Attr, typename T_>
+ friend adder const&
+ operator+= (symbols& sym, std::pair<Attr, T_>& p)
+ {
+ return sym.add(p.first, p.second);
+ }
+
+ // non-const version needed to suppress proto's -= kicking in
+ template <typename Attr>
+ friend remover const&
+ operator-= (symbols& sym, Attr& attr)
+ {
+ return sym.remove(attr);
+ }
+#else
+ // for rvalue references
+ template <typename Attr, typename T_>
+ friend adder const&
+ operator+= (symbols& sym, std::pair<Attr, T_>&& p)
+ {
+ return sym.add(p.first, p.second);
+ }
+
+ // for rvalue references
+ template <typename Attr>
+ friend remover const&
+ operator-= (symbols& sym, Attr&& attr)
+ {
+ return sym.remove(attr);
+ }
+#endif
+ template <typename F>
+ void for_each(F f) const
+ {
+ std::for_each(lookup->begin(), lookup->end(), f);
+ }
+
+ template <typename Attr>
+ value_type* find(Attr const& attr)
+ {
+ typename Lookup::iterator it = lookup->find(attr);
+ return (it != lookup->end()) ? &(*it).second : 0;
+ }
+
+ template <typename Attr>
+ value_type& at(Attr const& attr)
+ {
+ return (*lookup)[attr];
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attr>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , Attr const& attr) const
+ {
+ typename Lookup::iterator it = lookup->find(
+ traits::symbols_lookup<Attr, Attribute>::call(attr));
+ if (it == lookup->end())
+ return false;
+
+ return karma::detail::generate_encoded<CharEncoding, Tag>::call(
+ sink, (*it).second
+ , traits::symbols_value<Attribute, Attr>::call(attr)) &&
+ karma::delimit_out(sink, d);
+ }
+
+ template <typename Context>
+ info what(Context&) const
+ {
+ return info(name_);
+ }
+
+ void name(std::string const &str)
+ {
+ name_ = str;
+ }
+ std::string const &name() const
+ {
+ return name_;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ struct adder
+ {
+ template <typename, typename = unused_type>
+ struct result { typedef adder const& type; };
+
+ adder(symbols& sym)
+ : sym(sym)
+ {
+ }
+
+ template <typename Attr>
+ adder const&
+ operator()(Attr const& attr, T const& val = T()) const
+ {
+ sym.lookup->insert(typename Lookup::value_type(attr, val));
+ return *this;
+ }
+
+ template <typename Attr>
+ adder const&
+ operator, (Attr const& attr) const
+ {
+ sym.lookup->insert(typename Lookup::value_type(attr, T()));
+ return *this;
+ }
+
+ symbols& sym;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ adder& operator= (adder const&);
+ };
+
+ struct remover
+ {
+ template <typename>
+ struct result { typedef remover const& type; };
+
+ remover(symbols& sym)
+ : sym(sym)
+ {
+ }
+
+ template <typename Attr>
+ remover const&
+ operator()(Attr const& attr) const
+ {
+ sym.lookup->erase(attr);
+ return *this;
+ }
+
+ template <typename Attr>
+ remover const&
+ operator, (Attr const& attr) const
+ {
+ sym.lookup->erase(attr);
+ return *this;
+ }
+
+ symbols& sym;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ remover& operator= (remover const&);
+ };
+
+ adder add;
+ remover remove;
+ shared_ptr<Lookup> lookup;
+ std::string name_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // specialization for unused stored type
+ template <
+ typename Attribute, typename Lookup
+ , typename CharEncoding, typename Tag>
+ struct symbols<Attribute, unused_type, Lookup, CharEncoding, Tag>
+ : proto::extends<
+ typename proto::terminal<
+ spirit::karma::reference<
+ symbols<Attribute, unused_type, Lookup, CharEncoding, Tag> >
+ >::type
+ , symbols<Attribute, unused_type, Lookup, CharEncoding, Tag>
+ >
+ , spirit::karma::generator<
+ symbols<Attribute, unused_type, Lookup, CharEncoding, Tag> >
+ {
+ typedef unused_type value_type; // the value associated with each entry
+
+ typedef spirit::karma::reference<symbols> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, symbols> base_type;
+
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef Attribute type;
+ };
+
+ symbols(std::string const& name = "symbols")
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(new Lookup())
+ , name_(name)
+ {}
+
+ symbols(symbols const& syms)
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(syms.lookup)
+ , name_(syms.name_)
+ {}
+
+ template <typename CharEncoding_, typename Tag_>
+ symbols(symbols<Attribute, unused_type, Lookup, CharEncoding_, Tag_> const& syms)
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(syms.lookup)
+ , name_(syms.name_)
+ {}
+
+ template <typename Symbols, typename Data>
+ symbols(Symbols const& syms, Data const& data
+ , std::string const& name = "symbols")
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(new Lookup())
+ , name_(name)
+ {
+ typename range_const_iterator<Symbols>::type si = boost::begin(syms);
+ typename range_const_iterator<Data>::type di = boost::begin(data);
+ while (si != boost::end(syms))
+ add(*si++, *di++);
+ }
+
+ symbols&
+ operator=(symbols const& rhs)
+ {
+ *lookup = *rhs.lookup;
+ name_ = rhs.name_;
+ return *this;
+ }
+
+ template <typename CharEncoding_, typename Tag_>
+ symbols&
+ operator=(symbols<Attribute, unused_type, Lookup, CharEncoding_, Tag_> const& rhs)
+ {
+ *lookup = *rhs.lookup;
+ name_ = rhs.name_;
+ return *this;
+ }
+
+ void clear()
+ {
+ lookup->clear();
+ }
+
+ struct adder;
+ struct remover;
+
+ template <typename Attr>
+ adder const&
+ operator=(Attr const& attr)
+ {
+ lookup->clear();
+ return add(attr);
+ }
+
+ template <typename Attr>
+ friend adder const&
+ operator+= (symbols& sym, Attr const& attr)
+ {
+ return sym.add(attr);
+ }
+
+ template <typename Attr>
+ friend remover const&
+ operator-= (symbols& sym, Attr const& attr)
+ {
+ return sym.remove(attr);
+ }
+
+ // non-const version needed to suppress proto's += kicking in
+ template <typename Attr>
+ friend adder const&
+ operator+= (symbols& sym, Attr& attr)
+ {
+ return sym.add(attr);
+ }
+
+ // non-const version needed to suppress proto's -= kicking in
+ template <typename Attr>
+ friend remover const&
+ operator-= (symbols& sym, Attr& attr)
+ {
+ return sym.remove(attr);
+ }
+
+ template <typename F>
+ void for_each(F f) const
+ {
+ std::for_each(lookup->begin(), lookup->end(), f);
+ }
+
+ template <typename Attr>
+ value_type const* find(Attr const& attr)
+ {
+ typename Lookup::iterator it = lookup->find(attr);
+ return (it != lookup->end()) ? &unused : 0;
+ }
+
+ template <typename Attr>
+ value_type at(Attr const& attr)
+ {
+ typename Lookup::iterator it = lookup->find(attr);
+ if (it == lookup->end())
+ add(attr);
+ return unused;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attr>
+ bool generate(OutputIterator& sink, Context&, Delimiter const& d
+ , Attr const& attr) const
+ {
+ typename Lookup::iterator it = lookup->find(
+ traits::symbols_lookup<Attr, Attribute>::call(attr));
+ if (it == lookup->end())
+ return false;
+
+ return karma::detail::generate_encoded<CharEncoding, Tag>::
+ call(sink
+ , traits::symbols_lookup<Attr, Attribute>::call(attr)
+ , unused) &&
+ karma::delimit_out(sink, d);
+ }
+
+ template <typename Context>
+ info what(Context&) const
+ {
+ return info(name_);
+ }
+
+ void name(std::string const &str)
+ {
+ name_ = str;
+ }
+ std::string const &name() const
+ {
+ return name_;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ struct adder
+ {
+ template <typename, typename = unused_type>
+ struct result { typedef adder const& type; };
+
+ adder(symbols& sym)
+ : sym(sym)
+ {
+ }
+
+ template <typename Attr>
+ adder const&
+ operator()(Attr const& attr) const
+ {
+ sym.lookup->insert(attr);
+ return *this;
+ }
+
+ template <typename Attr>
+ adder const&
+ operator, (Attr const& attr) const
+ {
+ sym.lookup->insert(attr);
+ return *this;
+ }
+
+ symbols& sym;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ adder& operator= (adder const&);
+ };
+
+ struct remover
+ {
+ template <typename>
+ struct result { typedef remover const& type; };
+
+ remover(symbols& sym)
+ : sym(sym)
+ {
+ }
+
+ template <typename Attr>
+ remover const&
+ operator()(Attr const& attr) const
+ {
+ sym.lookup->erase(attr);
+ return *this;
+ }
+
+ template <typename Attr>
+ remover const&
+ operator, (Attr const& attr) const
+ {
+ sym.lookup->erase(attr);
+ return *this;
+ }
+
+ symbols& sym;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ remover& operator= (remover const&);
+ };
+
+ adder add;
+ remover remove;
+ shared_ptr<Lookup> lookup;
+ std::string name_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename T, typename Lookup
+ , typename CharEnconding, typename Tag, typename Modifiers>
+ struct make_primitive<
+ reference<symbols<Attribute, T, Lookup, CharEnconding, Tag> >
+ , Modifiers>
+ {
+ static bool const lower =
+ has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+ static bool const upper =
+ has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+ typedef reference<
+ symbols<Attribute, T, Lookup, CharEnconding, Tag>
+ > reference_;
+
+ typedef typename mpl::if_c<
+ lower || upper
+ , symbols<
+ Attribute, T, Lookup
+ , typename spirit::detail::get_encoding_with_case<
+ Modifiers, unused_type, lower || upper>::type
+ , typename detail::get_casetag<Modifiers, lower || upper>::type>
+ , reference_>::type
+ result_type;
+
+ result_type operator()(reference_ ref, unused_type) const
+ {
+ return result_type(ref.ref.get());
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename T, typename Lookup
+ , typename CharEncoding, typename Tag
+ , typename Attr, typename Context, typename Iterator>
+ struct handles_container<karma::symbols<Attribute, T, Lookup, CharEncoding, Tag>
+ , Attr, Context, Iterator>
+ : traits::is_container<Attr> {};
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
+
diff --git a/boost/spirit/home/karma/what.hpp b/boost/spirit/home/karma/what.hpp
new file mode 100644
index 0000000000..c65937e454
--- /dev/null
+++ b/boost/spirit/home/karma/what.hpp
@@ -0,0 +1,33 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_WHAT_MAY_04_2007_0116PM)
+#define BOOST_SPIRIT_WHAT_MAY_04_2007_0116PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/assert.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+
+namespace boost { namespace spirit { namespace karma
+{
+ template <typename Expr>
+ inline info what(Expr const& xpr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression
+ // error message here, then the expression (expr) is not a
+ // valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
+ return compile<karma::domain>(xpr).what(unused);
+ }
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/lex.hpp b/boost/spirit/home/lex.hpp
new file mode 100644
index 0000000000..5d95f5bfc8
--- /dev/null
+++ b/boost/spirit/home/lex.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEXER_MARCH_22_2007_0929PM)
+#define BOOST_SPIRIT_LEXER_MARCH_22_2007_0929PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer.hpp>
+#include <boost/spirit/home/lex/qi.hpp>
+#include <boost/spirit/home/lex/tokenize_and_parse.hpp>
+#include <boost/spirit/home/lex/tokenize_and_parse_attr.hpp>
+
+#endif
diff --git a/boost/spirit/home/lex/argument.hpp b/boost/spirit/home/lex/argument.hpp
new file mode 100644
index 0000000000..edfee0be32
--- /dev/null
+++ b/boost/spirit/home/lex/argument.hpp
@@ -0,0 +1,362 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2010 Bryce Lelbach
+// Copyright (c) 2011 Thomas Heller
+//
+// Distributed under the 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_SPIRIT_LEX_ARGUMENT_JUNE_07_2009_1106AM)
+#define BOOST_SPIRIT_LEX_ARGUMENT_JUNE_07_2009_1106AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/lex/argument_phoenix.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The state_getter is a Phoenix actor used to access the name of the
+ // current lexer state by calling get_state_name() on the context (which
+ // is the 5th parameter to any lexer semantic actions).
+ //
+ // This Phoenix actor is invoked whenever the placeholder '_state' is used
+ // as a rvalue inside a lexer semantic action:
+ //
+ // lex::token_def<> identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
+ // this->self = identifier [ std::cout << _state ];
+ //
+ // The example shows how to print the lexer state after matching a token
+ // 'identifier'.
+ struct state_getter
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef
+ typename remove_reference<
+ typename remove_const<
+ typename mpl::at_c<typename Env::args_type, 4>::type
+ >::type
+ >::type
+ context_type;
+
+ typedef typename context_type::state_name_type type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return fusion::at_c<4>(env.args()).get_state_name();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The state_setter is a Phoenix actor used to change the name of the
+ // current lexer state by calling set_state_name() on the context (which
+ // is the 5th parameter to any lexer semantic actions).
+ //
+ // This Phoenix actor is invoked whenever the placeholder '_state' is used
+ // as a lvalue inside a lexer semantic action:
+ //
+ // lex::token_def<> identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
+ // this->self = identifier [ _state = "SOME_LEXER_STATE" ];
+ //
+ // The example shows how to change the lexer state after matching a token
+ // 'identifier'.
+ template <typename Actor>
+ struct state_setter
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename Env>
+ void eval(Env const& env) const
+ {
+ typedef
+ typename remove_reference<
+ typename remove_const<
+ typename mpl::at_c<typename Env::args_type, 4>::type
+ >::type
+ >::type
+ context_type;
+
+ typedef typename context_type::state_name_type string;
+
+ fusion::at_c<4>(env.args()).set_state_name(
+ traits::get_c_string(actor_.eval(env)));
+ }
+
+ state_setter(Actor const& actor)
+ : actor_(actor) {}
+
+ // see explanation for this constructor at the end of this file
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+ state_setter(phoenix::actor<state_getter>, Actor const& actor)
+ : actor_(actor) {}
+#endif
+
+ Actor actor_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The value_getter is used to create the _val placeholder, which is a
+ // Phoenix actor used to access the value of the current token.
+ //
+ // This Phoenix actor is invoked whenever the placeholder '_val' is used
+ // as a rvalue inside a lexer semantic action:
+ //
+ // lex::token_def<> identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
+ // this->self = identifier [ std::cout << _val ];
+ //
+ // The example shows how to use _val to print the identifier name (which
+ // is the initial token value).
+ struct value_getter
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef
+ typename remove_reference<
+ typename remove_const<
+ typename mpl::at_c<typename Env::args_type, 4>::type
+ >::type
+ >::type
+ context_type;
+
+ typedef typename context_type::get_value_type type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return fusion::at_c<4>(env.args()).get_value();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The value_setter is a Phoenix actor used to change the name of the
+ // current lexer state by calling set_state_name() on the context (which
+ // is the 5th parameter to any lexer semantic actions).
+ //
+ // This Phoenix actor is invoked whenever the placeholder '_val' is used
+ // as a lvalue inside a lexer semantic action:
+ //
+ // lex::token_def<> identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
+ // this->self = identifier [ _val = "identifier" ];
+ //
+ // The example shows how to change the token value after matching a token
+ // 'identifier'.
+ template <typename Actor>
+ struct value_setter
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename Env>
+ void eval(Env const& env) const
+ {
+ fusion::at_c<4>(env.args()).set_value(actor_.eval(env));
+ }
+
+ value_setter(Actor const& actor)
+ : actor_(actor) {}
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+ // see explanation for this constructor at the end of this file
+ value_setter(phoenix::actor<value_getter>, Actor const& actor)
+ : actor_(actor) {}
+#endif
+
+ Actor actor_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The eoi_getter is used to create the _eoi placeholder, which is a
+ // Phoenix actor used to access the end of input iterator pointing to the
+ // end of the underlying input sequence.
+ //
+ // This actor is invoked whenever the placeholder '_eoi' is used in a
+ // lexer semantic action:
+ //
+ // lex::token_def<> identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
+ // this->self = identifier
+ // [ std::cout << construct_<std::string>(_end, _eoi) ];
+ //
+ // The example shows how to use _eoi to print all remaining input after
+ // matching a token 'identifier'.
+ struct eoi_getter
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef
+ typename remove_reference<
+ typename remove_const<
+ typename mpl::at_c<typename Env::args_type, 4>::type
+ >::type
+ >::type
+ context_type;
+
+ typedef typename context_type::base_iterator_type const& type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return fusion::at_c<4>(env.args()).get_eoi();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // '_start' and '_end' may be used to access the start and the end of
+ // the matched sequence of the current token
+ typedef phoenix::arg_names::_1_type _start_type;
+ typedef phoenix::arg_names::_2_type _end_type;
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ _start_type const _start = _start_type();
+ _end_type const _end = _end_type();
+#endif
+
+ // We are reusing the placeholder '_pass' to access and change the pass
+ // status of the current match (see support/argument.hpp for its
+ // definition).
+ // typedef phoenix::arg_names::_3_type _pass_type;
+ using boost::spirit::_pass_type;
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using boost::spirit::_pass;
+#endif
+
+ // '_tokenid' may be used to access and change the tokenid of the current
+ // token
+ typedef phoenix::arg_names::_4_type _tokenid_type;
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ _tokenid_type const _tokenid = _tokenid_type();
+#endif
+
+ typedef phoenix::actor<value_context> _val_type;
+ typedef phoenix::actor<state_context> _state_type;
+ typedef phoenix::actor<eoi_getter> _eoi_type;
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ // '_val' may be used to access and change the token value of the current
+ // token
+ _val_type const _val = _val_type();
+ // _state may be used to access and change the name of the current lexer
+ // state
+ _state_type const _state = _state_type();
+ // '_eoi' may be used to access the end of input iterator of the input
+ // stream used by the lexer to match tokens from
+ _eoi_type const _eoi = _eoi_type();
+#endif
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+namespace boost { namespace phoenix
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The specialization of as_actor_base<> below is needed to convert all
+ // occurrences of _state in places where it's used as a rvalue into the
+ // proper Phoenix actor (spirit::state_getter) accessing the lexer state.
+ template<>
+ struct as_actor_base<actor<spirit::lex::state_context> >
+ {
+ typedef spirit::lex::state_getter type;
+
+ static spirit::lex::state_getter
+ convert(actor<spirit::lex::state_context>)
+ {
+ return spirit::lex::state_getter();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The specialization of as_composite<> below is needed to convert all
+ // assignments to _state (places where it's used as a lvalue) into the
+ // proper Phoenix actor (spirit::state_setter) allowing to change the
+ // lexer state.
+ template <typename RHS>
+ struct as_composite<assign_eval, actor<spirit::lex::state_context>, RHS>
+ {
+ // For an assignment to _state (a spirit::state_context actor), this
+ // specialization makes Phoenix's compose() function construct a
+ // spirit::state_setter actor from 1. the LHS, a spirit::state_getter
+ // actor (due to the specialization of as_actor_base<> above),
+ // and 2. the RHS actor.
+ // This is why spirit::state_setter needs a constructor which takes
+ // a dummy spirit::state_getter as its first argument in addition
+ // to its real, second argument (the RHS actor).
+ typedef spirit::lex::state_setter<typename as_actor<RHS>::type> type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The specialization of as_actor_base<> below is needed to convert all
+ // occurrences of _val in places where it's used as a rvalue into the
+ // proper Phoenix actor (spirit::value_getter) accessing the token value.
+ template<>
+ struct as_actor_base<actor<spirit::lex::value_context> >
+ {
+ typedef spirit::lex::value_getter type;
+
+ static spirit::lex::value_getter
+ convert(actor<spirit::lex::value_context>)
+ {
+ return spirit::lex::value_getter();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The specialization of as_composite<> below is needed to convert all
+ // assignments to _val (places where it's used as a lvalue) into the
+ // proper Phoenix actor (spirit::value_setter) allowing to change the
+ // token value.
+ template <typename RHS>
+ struct as_composite<assign_eval, actor<spirit::lex::value_context>, RHS>
+ {
+ // For an assignment to _val (a spirit::value_context actor), this
+ // specialization makes Phoenix's compose() function construct a
+ // spirit::value_setter actor from 1. the LHS, a spirit::value_getter
+ // actor (due to the specialization of as_actor_base<> above),
+ // and 2. the RHS actor.
+ // This is why spirit::value_setter needs a constructor which takes
+ // a dummy spirit::value_getter as its first argument in addition
+ // to its real, second argument (the RHS actor).
+ typedef spirit::lex::value_setter<typename as_actor<RHS>::type> type;
+ };
+}}
+#endif
+
+#undef SPIRIT_DECLARE_ARG
+#endif
+
diff --git a/boost/spirit/home/lex/argument_phoenix.hpp b/boost/spirit/home/lex/argument_phoenix.hpp
new file mode 100644
index 0000000000..da24503c2a
--- /dev/null
+++ b/boost/spirit/home/lex/argument_phoenix.hpp
@@ -0,0 +1,251 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2011 Thomas Heller
+//
+// Distributed under the 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_SPIRIT_LEX_ARGUMENT_PHEONIX_MARCH_25_2011_1841PM)
+#define BOOST_SPIRIT_LEX_ARGUMENT_PHEONIX_MARCH_25_2011_1841PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The value_context is used as a noop Phoenix actor to create the
+ // placeholder '_val' (see below). It is a noop actor because it is used
+ // as a placeholder only, while it is being converted either to a
+ // value_getter (if used as a rvalue) or to a value_setter (if used as a
+ // lvalue). The conversion is achieved by specializing and overloading a
+ // couple of the Phoenix templates from the Phoenix expression composition
+ // engine (see the end of this file).
+ struct value_context
+ {
+ typedef mpl::true_ no_nullary;
+
+ typedef unused_type result_type;
+
+ template <typename Env>
+ struct result
+ {
+ typedef unused_type type;
+ };
+
+ template <typename Env>
+ unused_type
+ eval(Env const& env) const
+ {
+ return unused;
+ }
+ };
+
+ // forward declarations
+ struct value_getter;
+ template <typename> struct value_setter;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The state_context is used as a noop Phoenix actor to create the
+ // placeholder '_state' (see below). It is a noop actor because it is used
+ // as a placeholder only, while it is being converted either to a
+ // state_getter (if used as a rvalue) or to a state_setter (if used as a
+ // lvalue). The conversion is achieved by specializing and overloading a
+ // couple of the Phoenix templates from the Phoenix expression composition
+ // engine (see the end of this file).
+ struct state_context
+ {
+ typedef mpl::true_ no_nullary;
+
+ typedef unused_type result_type;
+
+ template <typename Env>
+ struct result
+ {
+ typedef unused_type type;
+ };
+
+ template <typename Env>
+ unused_type
+ eval(Env const& env) const
+ {
+ return unused;
+ }
+ };
+
+ // forward declarations
+ struct state_getter;
+ template <typename> struct state_setter;
+ struct eoi_getter;
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+#ifdef BOOST_SPIRIT_USE_PHOENIX_V3
+
+BOOST_PHOENIX_DEFINE_EXPRESSION(
+ (boost)(spirit)(lex)(value_setter)
+ , (boost::phoenix::meta_grammar)
+)
+
+BOOST_PHOENIX_DEFINE_EXPRESSION(
+ (boost)(spirit)(lex)(state_setter)
+ , (boost::phoenix::meta_grammar)
+)
+
+namespace boost { namespace phoenix
+{
+ namespace result_of
+ {
+ template <>
+ struct is_nullary<custom_terminal<boost::spirit::lex::value_context> >
+ : mpl::false_
+ {};
+ }
+
+ template <typename Dummy>
+ struct is_custom_terminal<boost::spirit::lex::value_context, Dummy>: mpl::true_ {};
+
+ template <typename Dummy>
+ struct custom_terminal<boost::spirit::lex::value_context, Dummy>
+ : proto::call<
+ v2_eval(
+ proto::make<boost::spirit::lex::value_getter()>
+ , proto::call<functional::env(proto::_state)>
+ )
+ >
+ {};
+
+ template <typename Dummy>
+ struct is_nullary::when<spirit::lex::rule::value_setter, Dummy>
+ : proto::make<mpl::false_()>
+ {};
+
+ template <typename Dummy>
+ struct default_actions::when<spirit::lex::rule::value_setter, Dummy>
+ : proto::call<
+ v2_eval(
+ proto::make<
+ spirit::lex::value_setter<proto::_child0>(
+ proto::_child0
+ )
+ >
+ , _env
+ )
+ >
+ {};
+
+ template <>
+ struct actor<spirit::lex::value_context>
+ : boost::phoenix::actor<proto::terminal<spirit::lex::value_context>::type>
+ {
+ typedef boost::phoenix::actor<
+ proto::terminal<spirit::lex::value_context>::type
+ > base_type;
+
+ actor(base_type const & base = base_type())
+ : base_type(base)
+ {}
+
+ template <typename Expr>
+ typename spirit::lex::expression::value_setter<
+ typename phoenix::as_actor<Expr>::type>::type const
+ operator=(Expr const & expr) const
+ {
+ return
+ spirit::lex::expression::value_setter<
+ typename phoenix::as_actor<Expr>::type
+ >::make(phoenix::as_actor<Expr>::convert(expr));
+ }
+ };
+
+ namespace result_of
+ {
+ template <>
+ struct is_nullary<custom_terminal<boost::spirit::lex::state_context> >
+ : mpl::false_
+ {};
+ }
+
+ template <typename Dummy>
+ struct is_custom_terminal<boost::spirit::lex::state_context, Dummy>: mpl::true_ {};
+
+ template <typename Dummy>
+ struct custom_terminal<boost::spirit::lex::state_context, Dummy>
+ : proto::call<
+ v2_eval(
+ proto::make<boost::spirit::lex::state_getter()>
+ , proto::call<functional::env(proto::_state)>
+ )
+ >
+ {};
+
+ template <typename Dummy>
+ struct is_nullary::when<spirit::lex::rule::state_setter, Dummy>
+ : proto::make<mpl::false_()>
+ {};
+
+ template <typename Dummy>
+ struct default_actions::when<spirit::lex::rule::state_setter, Dummy>
+ : proto::call<
+ v2_eval(
+ proto::make<
+ spirit::lex::state_setter<proto::_child0>(
+ proto::_child0
+ )
+ >
+ , _env
+ )
+ >
+ {};
+
+ template <>
+ struct actor<spirit::lex::state_context>
+ : boost::phoenix::actor<proto::terminal<spirit::lex::state_context>::type>
+ {
+ typedef boost::phoenix::actor<
+ proto::terminal<spirit::lex::state_context>::type
+ > base_type;
+
+ actor(base_type const & base = base_type())
+ : base_type(base)
+ {}
+
+ template <typename Expr>
+ typename spirit::lex::expression::state_setter<
+ typename phoenix::as_actor<Expr>::type>::type const
+ operator=(Expr const & expr) const
+ {
+ return
+ spirit::lex::expression::state_setter<
+ typename phoenix::as_actor<Expr>::type
+ >::make(phoenix::as_actor<Expr>::convert(expr));
+ }
+ };
+
+ namespace result_of
+ {
+ template <>
+ struct is_nullary<custom_terminal<boost::spirit::lex::eoi_getter> >
+ : mpl::false_
+ {};
+ }
+
+ template <typename Dummy>
+ struct is_custom_terminal<boost::spirit::lex::eoi_getter, Dummy>: mpl::true_ {};
+
+ template <typename Dummy>
+ struct custom_terminal<boost::spirit::lex::eoi_getter, Dummy>
+ : proto::call<
+ v2_eval(
+ proto::make<boost::spirit::lex::eoi_getter()>
+ , proto::call<functional::env(proto::_state)>
+ )
+ >
+ {};
+}}
+
+#endif // BOOST_SPIRIT_USE_PHOENIX_V3
+
+#endif
diff --git a/boost/spirit/home/lex/detail/sequence_function.hpp b/boost/spirit/home/lex/detail/sequence_function.hpp
new file mode 100644
index 0000000000..0f52da8413
--- /dev/null
+++ b/boost/spirit/home/lex/detail/sequence_function.hpp
@@ -0,0 +1,63 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_SEQUENCE_FUNCTION_FEB_28_2007_0249PM)
+#define BOOST_SPIRIT_LEX_SEQUENCE_FUNCTION_FEB_28_2007_0249PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/domain.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace lex { namespace detail
+{
+ template <typename LexerDef, typename String>
+ struct sequence_collect_function
+ {
+ sequence_collect_function(LexerDef& def_, String const& state_
+ , String const& targetstate_)
+ : def(def_), state(state_), targetstate(targetstate_) {}
+
+ template <typename Component>
+ bool operator()(Component const& component) const
+ {
+ component.collect(def, state, targetstate);
+ return false; // execute for all sequence elements
+ }
+
+ LexerDef& def;
+ String const& state;
+ String const& targetstate;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ sequence_collect_function& operator= (sequence_collect_function const&);
+ };
+
+ template <typename LexerDef>
+ struct sequence_add_actions_function
+ {
+ sequence_add_actions_function(LexerDef& def_)
+ : def(def_) {}
+
+ template <typename Component>
+ bool operator()(Component const& component) const
+ {
+ component.add_actions(def);
+ return false; // execute for all sequence elements
+ }
+
+ LexerDef& def;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ sequence_add_actions_function& operator= (sequence_add_actions_function const&);
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/domain.hpp b/boost/spirit/home/lex/domain.hpp
new file mode 100644
index 0000000000..e5aec86abd
--- /dev/null
+++ b/boost/spirit/home/lex/domain.hpp
@@ -0,0 +1,31 @@
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_DOMAIN_MAR_13_2007_0140PM)
+#define BOOST_SPIRIT_LEX_DOMAIN_MAR_13_2007_0140PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/meta_compiler.hpp>
+#include <boost/spirit/home/support/info.hpp>
+
+namespace boost { namespace spirit { namespace lex
+{
+ // lex's domain
+ struct domain {};
+
+ // bring in some of spirit parts into spirit::lex
+ using spirit::unused;
+ using spirit::unused_type;
+ using spirit::compile;
+ using spirit::info;
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer.hpp b/boost/spirit/home/lex/lexer.hpp
new file mode 100644
index 0000000000..535ec284ea
--- /dev/null
+++ b/boost/spirit/home/lex/lexer.hpp
@@ -0,0 +1,21 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEXER_MAR_22_2007_1008PM)
+#define BOOST_SPIRIT_LEXER_MAR_22_2007_1008PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer/terminals.hpp>
+#include <boost/spirit/home/lex/lexer/token_def.hpp>
+#include <boost/spirit/home/lex/lexer/char_token_def.hpp>
+#include <boost/spirit/home/lex/lexer/string_token_def.hpp>
+#include <boost/spirit/home/lex/lexer/sequence.hpp>
+#include <boost/spirit/home/lex/lexer/action.hpp>
+#include <boost/spirit/home/lex/lexer/lexer.hpp>
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/action.hpp b/boost/spirit/home/lex/lexer/action.hpp
new file mode 100644
index 0000000000..8de0c87b71
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/action.hpp
@@ -0,0 +1,97 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_LEX_ACTION_NOV_18_2007_0743PM)
+#define SPIRIT_LEX_ACTION_NOV_18_2007_0743PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/meta_compiler.hpp>
+#include <boost/spirit/home/lex/lexer_type.hpp>
+#include <boost/spirit/home/lex/argument.hpp>
+#include <boost/spirit/home/lex/lexer/support_functions.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Action>
+ struct action : unary_lexer<action<Subject, Action> >
+ {
+ action(Subject const& subject, Action f)
+ : subject(subject), f(f) {}
+
+ template <typename LexerDef, typename String>
+ void collect(LexerDef& lexdef, String const& state
+ , String const& targetstate) const
+ {
+ // collect the token definition information for the token_def
+ // this action is attached to
+ subject.collect(lexdef, state, targetstate);
+ }
+
+ template <typename LexerDef>
+ void add_actions(LexerDef& lexdef) const
+ {
+ // call to add all actions attached further down the hierarchy
+ subject.add_actions(lexdef);
+
+ // retrieve the id of the associated token_def and register the
+ // given semantic action with the lexer instance
+ lexdef.add_action(subject.unique_id(), subject.state(), f);
+ }
+
+ Subject subject;
+ Action f;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ action& operator= (action const&);
+ };
+
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Karma action meta-compiler
+ template <>
+ struct make_component<lex::domain, tag::action>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ remove_const<typename Elements::car_type>::type
+ subject_type;
+
+ typedef typename
+ remove_const<typename Elements::cdr_type::car_type>::type
+ action_type;
+
+ typedef lex::action<subject_type, action_type> type;
+ };
+
+ template <typename Elements>
+ typename result<make_component(Elements, unused_type)>::type
+ operator()(Elements const& elements, unused_type) const
+ {
+ typename result<make_component(Elements, unused_type)>::type
+ result(elements.car, elements.cdr.car);
+ return result;
+ }
+ };
+}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/char_token_def.hpp b/boost/spirit/home/lex/lexer/char_token_def.hpp
new file mode 100644
index 0000000000..aaba2e1b5e
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/char_token_def.hpp
@@ -0,0 +1,242 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_CHAR_TOKEN_DEF_MAR_28_2007_0626PM)
+#define BOOST_SPIRIT_LEX_CHAR_TOKEN_DEF_MAR_28_2007_0626PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/lex/domain.hpp>
+#include <boost/spirit/home/lex/lexer_type.hpp>
+#include <boost/spirit/home/lex/meta_compiler.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables 'x'
+ template <>
+ struct use_terminal<lex::domain, char>
+ : mpl::true_ {};
+
+ // enables "x"
+ template <>
+ struct use_terminal<lex::domain, char[2]>
+ : mpl::true_ {};
+
+ // enables wchar_t
+ template <>
+ struct use_terminal<lex::domain, wchar_t>
+ : mpl::true_ {};
+
+ // enables L"x"
+ template <>
+ struct use_terminal<lex::domain, wchar_t[2]>
+ : mpl::true_ {};
+
+ // enables char_('x'), char_("x")
+ template <typename CharEncoding, typename A0>
+ struct use_terminal<lex::domain
+ , terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector1<A0> > >
+ : mpl::true_ {};
+
+ // enables char_('x', ID), char_("x", ID)
+ template <typename CharEncoding, typename A0, typename A1>
+ struct use_terminal<lex::domain
+ , terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector2<A0, A1> > >
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace lex
+{
+ // use char_ from standard character set by default
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::standard::char_;
+#endif
+ using spirit::standard::char_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // char_token_def
+ // represents a single character token definition
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding = char_encoding::standard
+ , typename IdType = std::size_t>
+ struct char_token_def
+ : primitive_lexer<char_token_def<CharEncoding, IdType> >
+ {
+ typedef typename CharEncoding::char_type char_type;
+
+ char_token_def(char_type ch, IdType const& id)
+ : ch(ch), id_(id), unique_id_(std::size_t(~0))
+ , token_state_(std::size_t(~0))
+ {}
+
+ template <typename LexerDef, typename String>
+ void collect(LexerDef& lexdef, String const& state
+ , String const& targetstate) const
+ {
+ std::size_t state_id = lexdef.add_state(state.c_str());
+
+ // If the following assertion fires you are probably trying to use
+ // a single char_token_def instance in more than one lexer state.
+ // This is not possible. Please create a separate token_def instance
+ // from the same regular expression for each lexer state it needs
+ // to be associated with.
+ BOOST_ASSERT(
+ (std::size_t(~0) == token_state_ || state_id == token_state_) &&
+ "Can't use single char_token_def with more than one lexer state");
+
+ char_type const* target = targetstate.empty() ? 0 : targetstate.c_str();
+ if (target)
+ lexdef.add_state(target);
+
+ token_state_ = state_id;
+ unique_id_ = lexdef.add_token (state.c_str(), ch, id_, target);
+ }
+
+ template <typename LexerDef>
+ void add_actions(LexerDef&) const {}
+
+ IdType id() const { return id_; }
+ std::size_t unique_id() const { return unique_id_; }
+ std::size_t state() const { return token_state_; }
+
+ char_type ch;
+ mutable IdType id_;
+ mutable std::size_t unique_id_;
+ mutable std::size_t token_state_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Lexer generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename CharEncoding>
+ struct basic_literal
+ {
+ typedef char_token_def<CharEncoding> result_type;
+
+ template <typename Char>
+ result_type operator()(Char ch, unused_type) const
+ {
+ return result_type(ch, ch);
+ }
+
+ template <typename Char>
+ result_type operator()(Char const* str, unused_type) const
+ {
+ return result_type(str[0], str[0]);
+ }
+ };
+ }
+
+ // literals: 'x', "x"
+ template <typename Modifiers>
+ struct make_primitive<char, Modifiers>
+ : detail::basic_literal<char_encoding::standard> {};
+
+ template <typename Modifiers>
+ struct make_primitive<char const(&)[2], Modifiers>
+ : detail::basic_literal<char_encoding::standard> {};
+
+ // literals: L'x', L"x"
+ template <typename Modifiers>
+ struct make_primitive<wchar_t, Modifiers>
+ : detail::basic_literal<char_encoding::standard_wide> {};
+
+ template <typename Modifiers>
+ struct make_primitive<wchar_t const(&)[2], Modifiers>
+ : detail::basic_literal<char_encoding::standard_wide> {};
+
+ // handle char_('x')
+ template <typename CharEncoding, typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector1<A0>
+ >
+ , Modifiers>
+ {
+ typedef char_token_def<CharEncoding> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args), fusion::at_c<0>(term.args));
+ }
+ };
+
+ // handle char_("x")
+ template <typename CharEncoding, typename Modifiers, typename Char>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector1<Char(&)[2]> // single char strings
+ >
+ , Modifiers>
+ {
+ typedef char_token_def<CharEncoding> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ Char ch = fusion::at_c<0>(term.args)[0];
+ return result_type(ch, ch);
+ }
+ };
+
+ // handle char_('x', ID)
+ template <typename CharEncoding, typename Modifiers, typename A0, typename A1>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector2<A0, A1>
+ >
+ , Modifiers>
+ {
+ typedef char_token_def<CharEncoding> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(
+ fusion::at_c<0>(term.args), fusion::at_c<1>(term.args));
+ }
+ };
+
+ // handle char_("x", ID)
+ template <typename CharEncoding, typename Modifiers, typename Char, typename A1>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector2<Char(&)[2], A1> // single char strings
+ >
+ , Modifiers>
+ {
+ typedef char_token_def<CharEncoding> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(
+ fusion::at_c<0>(term.args)[0], fusion::at_c<1>(term.args));
+ }
+ };
+}}} // namespace boost::spirit::lex
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexer.hpp b/boost/spirit/home/lex/lexer/lexer.hpp
new file mode 100644
index 0000000000..93412ce8ff
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexer.hpp
@@ -0,0 +1,405 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXER_MAR_13_2007_0145PM)
+#define BOOST_SPIRIT_LEX_LEXER_MAR_13_2007_0145PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/lex/reference.hpp>
+#include <boost/spirit/home/lex/meta_compiler.hpp>
+#include <boost/spirit/home/lex/lexer_type.hpp>
+#include <boost/spirit/home/lex/lexer/token_def.hpp>
+#include <boost/assert.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/detail/iterator.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <string>
+
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename LexerDef>
+ struct lexer_def_
+ : proto::extends<
+ typename proto::terminal<
+ lex::reference<lexer_def_<LexerDef> const>
+ >::type
+ , lexer_def_<LexerDef> >
+ , qi::parser<lexer_def_<LexerDef> >
+ , lex::lexer_type<lexer_def_<LexerDef> >
+ {
+ private:
+ // avoid warnings about using 'this' in constructor
+ lexer_def_& this_() { return *this; }
+
+ typedef typename LexerDef::char_type char_type;
+ typedef typename LexerDef::string_type string_type;
+ typedef typename LexerDef::id_type id_type;
+
+ typedef lex::reference<lexer_def_ const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal_type;
+ typedef proto::extends<terminal_type, lexer_def_> proto_base_type;
+
+ reference_ alias() const
+ {
+ return reference_(*this);
+ }
+
+ public:
+ // Qi interface: metafunction calculating parser attribute type
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // the return value of a token set contains the matched token
+ // id, and the corresponding pair of iterators
+ typedef typename Iterator::base_iterator_type iterator_type;
+ typedef
+ fusion::vector2<id_type, iterator_range<iterator_type> >
+ type;
+ };
+
+ // Qi interface: parse functionality
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+
+ token_type const& t = *first;
+ if (token_is_valid(t) && t.state() == first.get_state()) {
+ // any of the token definitions matched
+ spirit::traits::assign_to(t, attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Qi interface: 'what' functionality
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("lexer");
+ }
+
+ private:
+ // allow to use the lexer.self.add("regex1", id1)("regex2", id2);
+ // syntax
+ struct adder
+ {
+ adder(lexer_def_& def_)
+ : def(def_) {}
+
+ // Add a token definition based on a single character as given
+ // by the first parameter, the second parameter allows to
+ // specify the token id to use for the new token. If no token
+ // id is given the character code is used.
+ adder const& operator()(char_type c
+ , id_type token_id = id_type()) const
+ {
+ if (id_type() == token_id)
+ token_id = static_cast<id_type>(c);
+ def.def.add_token (def.state.c_str(), c, token_id
+ , def.targetstate.empty() ? 0 : def.targetstate.c_str());
+ return *this;
+ }
+
+ // Add a token definition based on a character sequence as
+ // given by the first parameter, the second parameter allows to
+ // specify the token id to use for the new token. If no token
+ // id is given this function will generate a unique id to be
+ // used as the token's id.
+ adder const& operator()(string_type const& s
+ , id_type token_id = id_type()) const
+ {
+ if (id_type() == token_id)
+ token_id = def.def.get_next_id();
+ def.def.add_token (def.state.c_str(), s, token_id
+ , def.targetstate.empty() ? 0 : def.targetstate.c_str());
+ return *this;
+ }
+
+ template <typename Attribute>
+ adder const& operator()(
+ token_def<Attribute, char_type, id_type>& tokdef
+ , id_type token_id = id_type()) const
+ {
+ // make sure we have a token id
+ if (id_type() == token_id) {
+ if (id_type() == tokdef.id()) {
+ token_id = def.def.get_next_id();
+ tokdef.id(token_id);
+ }
+ else {
+ token_id = tokdef.id();
+ }
+ }
+ else {
+ // the following assertion makes sure that the token_def
+ // instance has not been assigned a different id earlier
+ BOOST_ASSERT(id_type() == tokdef.id()
+ || token_id == tokdef.id());
+ tokdef.id(token_id);
+ }
+
+ def.define(tokdef);
+ return *this;
+ }
+
+// template <typename F>
+// adder const& operator()(char_type c, id_type token_id, F act) const
+// {
+// if (id_type() == token_id)
+// token_id = def.def.get_next_id();
+// std::size_t unique_id =
+// def.def.add_token (def.state.c_str(), s, token_id);
+// def.def.add_action(unique_id, def.state.c_str(), act);
+// return *this;
+// }
+
+ lexer_def_& def;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ adder& operator= (adder const&);
+ };
+ friend struct adder;
+
+ // allow to use lexer.self.add_pattern("pattern1", "regex1")(...);
+ // syntax
+ struct pattern_adder
+ {
+ pattern_adder(lexer_def_& def_)
+ : def(def_) {}
+
+ pattern_adder const& operator()(string_type const& p
+ , string_type const& s) const
+ {
+ def.def.add_pattern (def.state.c_str(), p, s);
+ return *this;
+ }
+
+ lexer_def_& def;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ pattern_adder& operator= (pattern_adder const&);
+ };
+ friend struct pattern_adder;
+
+ private:
+ // Helper function to invoke the necessary 2 step compilation
+ // process on token definition expressions
+ template <typename TokenExpr>
+ void compile2pass(TokenExpr const& expr)
+ {
+ expr.collect(def, state, targetstate);
+ expr.add_actions(def);
+ }
+
+ public:
+ ///////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ void define(Expr const& expr)
+ {
+ compile2pass(compile<lex::domain>(expr));
+ }
+
+ lexer_def_(LexerDef& def_, string_type const& state_
+ , string_type const& targetstate_ = string_type())
+ : proto_base_type(terminal_type::make(alias()))
+ , add(this_()), add_pattern(this_()), def(def_)
+ , state(state_), targetstate(targetstate_)
+ {}
+
+ // allow to switch states
+ lexer_def_ operator()(char_type const* state) const
+ {
+ return lexer_def_(def, state);
+ }
+ lexer_def_ operator()(char_type const* state
+ , char_type const* targetstate) const
+ {
+ return lexer_def_(def, state, targetstate);
+ }
+ lexer_def_ operator()(string_type const& state
+ , string_type const& targetstate = string_type()) const
+ {
+ return lexer_def_(def, state, targetstate);
+ }
+
+ // allow to assign a token definition expression
+ template <typename Expr>
+ lexer_def_& operator= (Expr const& xpr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit lex
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(lex::domain, Expr);
+
+ def.clear(state.c_str());
+ define(xpr);
+ return *this;
+ }
+
+ // explicitly tell the lexer that the given state will be defined
+ // (useful in conjunction with "*")
+ std::size_t add_state(char_type const* state = 0)
+ {
+ return def.add_state(state ? state : def.initial_state().c_str());
+ }
+
+ adder add;
+ pattern_adder add_pattern;
+
+ private:
+ LexerDef& def;
+ string_type state;
+ string_type targetstate;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ lexer_def_& operator= (lexer_def_ const&);
+ };
+
+#if defined(BOOST_NO_RVALUE_REFERENCES)
+ // allow to assign a token definition expression
+ template <typename LexerDef, typename Expr>
+ inline lexer_def_<LexerDef>&
+ operator+= (lexer_def_<LexerDef>& lexdef, Expr& xpr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit lex
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(lex::domain, Expr);
+
+ lexdef.define(xpr);
+ return lexdef;
+ }
+#else
+ // allow to assign a token definition expression
+ template <typename LexerDef, typename Expr>
+ inline lexer_def_<LexerDef>&
+ operator+= (lexer_def_<LexerDef>& lexdef, Expr&& xpr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit lex
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(lex::domain, Expr);
+
+ lexdef.define(xpr);
+ return lexdef;
+ }
+#endif
+
+ template <typename LexerDef, typename Expr>
+ inline lexer_def_<LexerDef>&
+ operator+= (lexer_def_<LexerDef>& lexdef, Expr const& xpr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit lex
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(lex::domain, Expr);
+
+ lexdef.define(xpr);
+ return lexdef;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The match_flags flags are used to influence different matching
+ // modes of the lexer
+ struct match_flags
+ {
+ enum enum_type
+ {
+ match_default = 0, // no flags
+ match_not_dot_newline = 1, // the regex '.' doesn't match newlines
+ match_icase = 2 // all matching operations are case insensitive
+ };
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This represents a lexer object
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This is the first token id automatically assigned by the library
+ // if needed
+ enum tokenids
+ {
+ min_token_id = 0x10000
+ };
+
+ template <typename Lexer>
+ class lexer : public Lexer
+ {
+ private:
+ // avoid warnings about using 'this' in constructor
+ lexer& this_() { return *this; }
+
+ std::size_t next_token_id; // has to be an integral type
+
+ public:
+ typedef Lexer lexer_type;
+ typedef typename Lexer::id_type id_type;
+ typedef typename Lexer::char_type char_type;
+ typedef typename Lexer::iterator_type iterator_type;
+ typedef lexer base_type;
+
+ typedef detail::lexer_def_<lexer> lexer_def;
+ typedef std::basic_string<char_type> string_type;
+
+ lexer(unsigned int flags = match_flags::match_default
+ , id_type first_id = id_type(min_token_id))
+ : lexer_type(flags)
+ , next_token_id(first_id)
+ , self(this_(), lexer_type::initial_state())
+ {}
+
+ // access iterator interface
+ template <typename Iterator>
+ iterator_type begin(Iterator& first, Iterator const& last
+ , char_type const* initial_state = 0) const
+ { return this->lexer_type::begin(first, last, initial_state); }
+ iterator_type end() const
+ { return this->lexer_type::end(); }
+
+ std::size_t map_state(char_type const* state)
+ { return this->lexer_type::add_state(state); }
+
+ // create a unique token id
+ id_type get_next_id() { return id_type(next_token_id++); }
+
+ lexer_def self; // allow for easy token definition
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/functor.hpp b/boost/spirit/home/lex/lexer/lexertl/functor.hpp
new file mode 100644
index 0000000000..79e5f073b4
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/functor.hpp
@@ -0,0 +1,300 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXER_FUNCTOR_NOV_18_2007_1112PM)
+#define BOOST_SPIRIT_LEX_LEXER_FUNCTOR_NOV_18_2007_1112PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/detail/iterator.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/spirit/home/lex/lexer/pass_flags.hpp>
+#include <boost/assert.hpp>
+
+#if 0 != __COMO_VERSION__ || !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+#define BOOST_SPIRIT_STATIC_EOF 1
+#define BOOST_SPIRIT_EOF_PREFIX static
+#else
+#define BOOST_SPIRIT_EOF_PREFIX
+#endif
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // functor is a template usable as the functor object for the
+ // multi_pass iterator allowing to wrap a lexertl based dfa into a
+ // iterator based interface.
+ //
+ // Token: the type of the tokens produced by this functor
+ // this needs to expose a constructor with the following
+ // prototype:
+ //
+ // Token(std::size_t id, std::size_t state,
+ // Iterator start, Iterator end)
+ //
+ // where 'id' is the token id, state is the lexer state,
+ // this token has been matched in, and 'first' and 'end'
+ // mark the start and the end of the token with respect
+ // to the underlying character stream.
+ // FunctorData:
+ // this is expected to encapsulate the shared part of the
+ // functor (see lex/lexer/lexertl/functor_data.hpp for an
+ // example and documentation).
+ // Iterator: the type of the underlying iterator
+ // SupportsActors:
+ // this is expected to be a mpl::bool_, if mpl::true_ the
+ // functor invokes functors which (optionally) have
+ // been attached to the token definitions.
+ // SupportState:
+ // this is expected to be a mpl::bool_, if mpl::true_ the
+ // functor supports different lexer states,
+ // otherwise no lexer state is supported.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Token
+ , template <typename, typename, typename, typename> class FunctorData
+ , typename Iterator = typename Token::iterator_type
+ , typename SupportsActors = mpl::false_
+ , typename SupportsState = typename Token::has_state>
+ class functor
+ {
+ public:
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+
+ private:
+ // Needed by compilers not implementing the resolution to DR45. For
+ // reference, see
+ // http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45.
+ typedef typename Token::token_value_type token_value_type;
+ friend class FunctorData<Iterator, SupportsActors, SupportsState
+ , token_value_type>;
+
+ // Helper template allowing to assign a value on exit
+ template <typename T>
+ struct assign_on_exit
+ {
+ assign_on_exit(T& dst, T const& src)
+ : dst_(dst), src_(src) {}
+
+ ~assign_on_exit()
+ {
+ dst_ = src_;
+ }
+
+ T& dst_;
+ T const& src_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ assign_on_exit& operator= (assign_on_exit const&);
+ };
+
+ public:
+ functor()
+#if defined(__PGI)
+ : eof()
+#endif
+ {}
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+ // somehow VC7.1 needs this (meaningless) assignment operator
+ functor& operator=(functor const& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ ///////////////////////////////////////////////////////////////////////
+ // interface to the iterator_policies::split_functor_input policy
+ typedef Token result_type;
+ typedef functor unique;
+ typedef FunctorData<Iterator, SupportsActors, SupportsState
+ , token_value_type> shared;
+
+ BOOST_SPIRIT_EOF_PREFIX result_type const eof;
+
+ ///////////////////////////////////////////////////////////////////////
+ typedef Iterator iterator_type;
+ typedef typename shared::semantic_actions_type semantic_actions_type;
+ typedef typename shared::next_token_functor next_token_functor;
+ typedef typename shared::get_state_name_type get_state_name_type;
+
+ // this is needed to wrap the semantic actions in a proper way
+ typedef typename shared::wrap_action_type wrap_action_type;
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename MultiPass>
+ static result_type& get_next(MultiPass& mp, result_type& result)
+ {
+ typedef typename result_type::id_type id_type;
+
+ shared& data = mp.shared()->ftor;
+ for(;;)
+ {
+ if (data.get_first() == data.get_last())
+#if defined(BOOST_SPIRIT_STATIC_EOF)
+ return result = eof;
+#else
+ return result = mp.ftor.eof;
+#endif
+
+ data.reset_value();
+ Iterator end = data.get_first();
+ std::size_t unique_id = boost::lexer::npos;
+ bool prev_bol = false;
+
+ // lexer matching might change state
+ std::size_t state = data.get_state();
+ std::size_t id = data.next(end, unique_id, prev_bol);
+
+ if (boost::lexer::npos == id) { // no match
+#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
+ std::string next;
+ Iterator it = data.get_first();
+ for (std::size_t i = 0; i < 10 && it != data.get_last(); ++it, ++i)
+ next += *it;
+
+ std::cerr << "Not matched, in state: " << state
+ << ", lookahead: >" << next << "<" << std::endl;
+#endif
+ return result = result_type(0);
+ }
+ else if (0 == id) { // EOF reached
+#if defined(BOOST_SPIRIT_STATIC_EOF)
+ return result = eof;
+#else
+ return result = mp.ftor.eof;
+#endif
+ }
+
+#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
+ {
+ std::string next;
+ Iterator it = end;
+ for (std::size_t i = 0; i < 10 && it != data.get_last(); ++it, ++i)
+ next += *it;
+
+ std::cerr << "Matched: " << id << ", in state: "
+ << state << ", string: >"
+ << std::basic_string<char_type>(data.get_first(), end) << "<"
+ << ", lookahead: >" << next << "<" << std::endl;
+ if (data.get_state() != state) {
+ std::cerr << "Switched to state: "
+ << data.get_state() << std::endl;
+ }
+ }
+#endif
+ // account for a possibly pending lex::more(), i.e. moving
+ // data.first_ back to the start of the previously matched token.
+ bool adjusted = data.adjust_start();
+
+ // set the end of the matched input sequence in the token data
+ data.set_end(end);
+
+ // invoke attached semantic actions, if defined, might change
+ // state, id, data.first_, and/or end
+ BOOST_SCOPED_ENUM(pass_flags) pass =
+ data.invoke_actions(state, id, unique_id, end);
+
+ if (data.has_value()) {
+ // return matched token using the token value as set before
+ // using data.set_value(), advancing 'data.first_' past the
+ // matched sequence
+ assign_on_exit<Iterator> on_exit(data.get_first(), end);
+ return result = result_type(id_type(id), state, data.get_value());
+ }
+ else if (pass_flags::pass_normal == pass) {
+ // return matched token, advancing 'data.first_' past the
+ // matched sequence
+ assign_on_exit<Iterator> on_exit(data.get_first(), end);
+ return result = result_type(id_type(id), state, data.get_first(), end);
+ }
+ else if (pass_flags::pass_fail == pass) {
+#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
+ std::cerr << "Matching forced to fail" << std::endl;
+#endif
+ // if the data.first_ got adjusted above, revert this adjustment
+ if (adjusted)
+ data.revert_adjust_start();
+
+ // one of the semantic actions signaled no-match
+ data.reset_bol(prev_bol);
+ if (state != data.get_state())
+ continue; // retry matching if state has changed
+
+ // if the state is unchanged repeating the match wouldn't
+ // move the input forward, causing an infinite loop
+ return result = result_type(0);
+ }
+
+#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
+ std::cerr << "Token ignored, continuing matching" << std::endl;
+#endif
+ // if this token needs to be ignored, just repeat the matching,
+ // while starting right after the current match
+ data.get_first() = end;
+ }
+ }
+
+ // set_state are propagated up to the iterator interface, allowing to
+ // manipulate the current lexer state through any of the exposed
+ // iterators.
+ template <typename MultiPass>
+ static std::size_t set_state(MultiPass& mp, std::size_t state)
+ {
+ std::size_t oldstate = mp.shared()->ftor.get_state();
+ mp.shared()->ftor.set_state(state);
+
+#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
+ std::cerr << "Switching state from: " << oldstate
+ << " to: " << state
+ << std::endl;
+#endif
+ return oldstate;
+ }
+
+ template <typename MultiPass>
+ static std::size_t get_state(MultiPass& mp)
+ {
+ return mp.shared()->ftor.get_state();
+ }
+
+ template <typename MultiPass>
+ static std::size_t
+ map_state(MultiPass const& mp, char_type const* statename)
+ {
+ return mp.shared()->ftor.get_state_id(statename);
+ }
+
+ // we don't need this, but it must be there
+ template <typename MultiPass>
+ static void destroy(MultiPass const&) {}
+ };
+
+#if defined(BOOST_SPIRIT_STATIC_EOF)
+ ///////////////////////////////////////////////////////////////////////////
+ // eof token
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Token
+ , template <typename, typename, typename, typename> class FunctorData
+ , typename Iterator, typename SupportsActors, typename SupportsState>
+ typename functor<Token, FunctorData, Iterator, SupportsActors, SupportsState>::result_type const
+ functor<Token, FunctorData, Iterator, SupportsActors, SupportsState>::eof =
+ typename functor<Token, FunctorData, Iterator, SupportsActors
+ , SupportsState>::result_type();
+#endif
+
+}}}}
+
+#undef BOOST_SPIRIT_EOF_PREFIX
+#undef BOOST_SPIRIT_STATIC_EOF
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/functor_data.hpp b/boost/spirit/home/lex/lexer/lexertl/functor_data.hpp
new file mode 100644
index 0000000000..207b374772
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/functor_data.hpp
@@ -0,0 +1,552 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXER_FUNCTOR_DATA_JUN_10_2009_0954AM)
+#define BOOST_SPIRIT_LEX_LEXER_FUNCTOR_DATA_JUN_10_2009_0954AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/support/detail/lexer/generator.hpp>
+#include <boost/spirit/home/support/detail/lexer/rules.hpp>
+#include <boost/spirit/home/support/detail/lexer/state_machine.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/semantic_action_data.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/optional.hpp>
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename HasActors, typename HasState
+ , typename TokenValue>
+ class data; // no default specialization
+
+ ///////////////////////////////////////////////////////////////////////
+ // neither supports state, nor actors
+ template <typename Iterator, typename TokenValue>
+ class data<Iterator, mpl::false_, mpl::false_, TokenValue>
+ {
+ protected:
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+
+ public:
+ typedef Iterator base_iterator_type;
+ typedef iterator_range<Iterator> token_value_type;
+ typedef token_value_type get_value_type;
+ typedef std::size_t state_type;
+ typedef char_type const* state_name_type;
+ typedef unused_type semantic_actions_type;
+ typedef detail::wrap_action<unused_type, Iterator, data, std::size_t>
+ wrap_action_type;
+
+ typedef unused_type next_token_functor;
+ typedef unused_type get_state_name_type;
+
+ // initialize the shared data
+ template <typename IterData>
+ data (IterData const& data_, Iterator& first, Iterator const& last)
+ : first_(first), last_(last)
+ , state_machine_(data_.state_machine_)
+ , rules_(data_.rules_)
+ , bol_(data_.state_machine_.data()._seen_BOL_assertion) {}
+
+ // The following functions are used by the implementation of the
+ // placeholder '_state'.
+ template <typename Char>
+ void set_state_name (Char const*)
+ {
+// some (random) versions of gcc instantiate this function even if it's not
+// needed leading to false static asserts
+#if !defined(__GNUC__)
+ // If you see a compile time assertion below you're probably
+ // using a token type not supporting lexer states (the 3rd
+ // template parameter of the token is mpl::false_), but your
+ // code uses state changes anyways.
+ BOOST_STATIC_ASSERT(false);
+#endif
+ }
+ char_type const* get_state_name() const { return rules_.initial(); }
+ std::size_t get_state_id (char_type const*) const
+ {
+ return 0;
+ }
+
+ // The function get_eoi() is used by the implementation of the
+ // placeholder '_eoi'.
+ Iterator const& get_eoi() const { return last_; }
+
+ // The function less() is used by the implementation of the support
+ // function lex::less(). Its functionality is equivalent to flex'
+ // function yyless(): it returns an iterator positioned to the
+ // nth input character beyond the current start iterator (i.e. by
+ // assigning the return value to the placeholder '_end' it is
+ // possible to return all but the first n characters of the current
+ // token back to the input stream.
+ //
+ // This function does nothing as long as no semantic actions are
+ // used.
+ Iterator const& less(Iterator const& it, int)
+ {
+ // The following assertion fires most likely because you are
+ // using lexer semantic actions without using the actor_lexer
+ // as the base class for your token definition class.
+ BOOST_ASSERT(false &&
+ "Are you using lexer semantic actions without using the "
+ "actor_lexer base?");
+ return it;
+ }
+
+ // The function more() is used by the implementation of the support
+ // function lex::more(). Its functionality is equivalent to flex'
+ // function yymore(): it tells the lexer that the next time it
+ // matches a rule, the corresponding token should be appended onto
+ // the current token value rather than replacing it.
+ //
+ // These functions do nothing as long as no semantic actions are
+ // used.
+ void more()
+ {
+ // The following assertion fires most likely because you are
+ // using lexer semantic actions without using the actor_lexer
+ // as the base class for your token definition class.
+ BOOST_ASSERT(false &&
+ "Are you using lexer semantic actions without using the "
+ "actor_lexer base?");
+ }
+ bool adjust_start() { return false; }
+ void revert_adjust_start() {}
+
+ // The function lookahead() is used by the implementation of the
+ // support function lex::lookahead. It can be used to implement
+ // lookahead for lexer engines not supporting constructs like flex'
+ // a/b (match a, but only when followed by b):
+ //
+ // This function does nothing as long as no semantic actions are
+ // used.
+ bool lookahead(std::size_t, std::size_t /*state*/ = std::size_t(~0))
+ {
+ // The following assertion fires most likely because you are
+ // using lexer semantic actions without using the actor_lexer
+ // as the base class for your token definition class.
+ BOOST_ASSERT(false &&
+ "Are you using lexer semantic actions without using the "
+ "actor_lexer base?");
+ return false;
+ }
+
+ // the functions next, invoke_actions, and get_state are used by
+ // the functor implementation below
+
+ // The function next() tries to match the next token from the
+ // underlying input sequence.
+ std::size_t next(Iterator& end, std::size_t& unique_id, bool& prev_bol)
+ {
+ prev_bol = bol_;
+
+ typedef basic_iterator_tokeniser<Iterator> tokenizer;
+ return tokenizer::next(state_machine_, bol_, end, last_
+ , unique_id);
+ }
+
+ // nothing to invoke, so this is empty
+ BOOST_SCOPED_ENUM(pass_flags) invoke_actions(std::size_t
+ , std::size_t, std::size_t, Iterator const&)
+ {
+ return pass_flags::pass_normal; // always accept
+ }
+
+ std::size_t get_state() const { return 0; }
+ void set_state(std::size_t) {}
+
+ void set_end(Iterator const& it) {}
+
+ Iterator& get_first() { return first_; }
+ Iterator const& get_first() const { return first_; }
+ Iterator const& get_last() const { return last_; }
+
+ iterator_range<Iterator> get_value() const
+ {
+ return iterator_range<Iterator>(first_, last_);
+ }
+ bool has_value() const { return false; }
+ void reset_value() {}
+
+ void reset_bol(bool bol) { bol_ = bol; }
+
+ protected:
+ Iterator& first_;
+ Iterator last_;
+
+ boost::lexer::basic_state_machine<char_type> const& state_machine_;
+ boost::lexer::basic_rules<char_type> const& rules_;
+
+ bool bol_; // helper storing whether last character was \n
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ data& operator= (data const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // doesn't support lexer semantic actions, but supports state
+ template <typename Iterator, typename TokenValue>
+ class data<Iterator, mpl::false_, mpl::true_, TokenValue>
+ : public data<Iterator, mpl::false_, mpl::false_, TokenValue>
+ {
+ protected:
+ typedef data<Iterator, mpl::false_, mpl::false_, TokenValue> base_type;
+ typedef typename base_type::char_type char_type;
+
+ public:
+ typedef Iterator base_iterator_type;
+ typedef iterator_range<Iterator> token_value_type;
+ typedef token_value_type get_value_type;
+ typedef typename base_type::state_type state_type;
+ typedef typename base_type::state_name_type state_name_type;
+ typedef typename base_type::semantic_actions_type
+ semantic_actions_type;
+
+ // initialize the shared data
+ template <typename IterData>
+ data (IterData const& data_, Iterator& first, Iterator const& last)
+ : base_type(data_, first, last)
+ , state_(0) {}
+
+ // The following functions are used by the implementation of the
+ // placeholder '_state'.
+ void set_state_name (char_type const* new_state)
+ {
+ std::size_t state_id = this->rules_.state(new_state);
+
+ // If the following assertion fires you've probably been using
+ // a lexer state name which was not defined in your token
+ // definition.
+ BOOST_ASSERT(state_id != boost::lexer::npos);
+
+ if (state_id != boost::lexer::npos)
+ state_ = state_id;
+ }
+ char_type const* get_state_name() const
+ {
+ return this->rules_.state(state_);
+ }
+ std::size_t get_state_id (char_type const* state) const
+ {
+ return this->rules_.state(state);
+ }
+
+ // the functions next() and get_state() are used by the functor
+ // implementation below
+
+ // The function next() tries to match the next token from the
+ // underlying input sequence.
+ std::size_t next(Iterator& end, std::size_t& unique_id, bool& prev_bol)
+ {
+ prev_bol = this->bol_;
+
+ typedef basic_iterator_tokeniser<Iterator> tokenizer;
+ return tokenizer::next(this->state_machine_, state_,
+ this->bol_, end, this->get_eoi(), unique_id);
+ }
+
+ std::size_t& get_state() { return state_; }
+ void set_state(std::size_t state) { state_ = state; }
+
+ protected:
+ std::size_t state_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ data& operator= (data const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // does support lexer semantic actions, may support state
+ template <typename Iterator, typename HasState, typename TokenValue>
+ class data<Iterator, mpl::true_, HasState, TokenValue>
+ : public data<Iterator, mpl::false_, HasState, TokenValue>
+ {
+ public:
+ typedef semantic_actions<Iterator, HasState, data>
+ semantic_actions_type;
+
+ protected:
+ typedef data<Iterator, mpl::false_, HasState, TokenValue> base_type;
+ typedef typename base_type::char_type char_type;
+ typedef typename semantic_actions_type::functor_wrapper_type
+ functor_wrapper_type;
+
+ public:
+ typedef Iterator base_iterator_type;
+ typedef TokenValue token_value_type;
+ typedef TokenValue const& get_value_type;
+ typedef typename base_type::state_type state_type;
+ typedef typename base_type::state_name_type state_name_type;
+
+ typedef detail::wrap_action<functor_wrapper_type
+ , Iterator, data, std::size_t> wrap_action_type;
+
+ template <typename IterData>
+ data (IterData const& data_, Iterator& first, Iterator const& last)
+ : base_type(data_, first, last)
+ , actions_(data_.actions_), hold_()
+ , value_(iterator_range<Iterator>(first, last))
+ , has_value_(false), has_hold_(false) {}
+
+ // invoke attached semantic actions, if defined
+ BOOST_SCOPED_ENUM(pass_flags) invoke_actions(std::size_t state
+ , std::size_t& id, std::size_t unique_id, Iterator& end)
+ {
+ return actions_.invoke_actions(state, id, unique_id, end, *this);
+ }
+
+ // The function less() is used by the implementation of the support
+ // function lex::less(). Its functionality is equivalent to flex'
+ // function yyless(): it returns an iterator positioned to the
+ // nth input character beyond the current start iterator (i.e. by
+ // assigning the return value to the placeholder '_end' it is
+ // possible to return all but the first n characters of the current
+ // token back to the input stream).
+ Iterator const& less(Iterator& it, int n)
+ {
+ it = this->get_first();
+ std::advance(it, n);
+ return it;
+ }
+
+ // The function more() is used by the implementation of the support
+ // function lex::more(). Its functionality is equivalent to flex'
+ // function yymore(): it tells the lexer that the next time it
+ // matches a rule, the corresponding token should be appended onto
+ // the current token value rather than replacing it.
+ void more()
+ {
+ hold_ = this->get_first();
+ has_hold_ = true;
+ }
+
+ // The function lookahead() is used by the implementation of the
+ // support function lex::lookahead. It can be used to implement
+ // lookahead for lexer engines not supporting constructs like flex'
+ // a/b (match a, but only when followed by b)
+ bool lookahead(std::size_t id, std::size_t state = std::size_t(~0))
+ {
+ Iterator end = end_;
+ std::size_t unique_id = boost::lexer::npos;
+ bool bol = this->bol_;
+
+ if (std::size_t(~0) == state)
+ state = this->state_;
+
+ typedef basic_iterator_tokeniser<Iterator> tokenizer;
+ return id == tokenizer::next(this->state_machine_, state,
+ bol, end, this->get_eoi(), unique_id);
+ }
+
+ // The adjust_start() and revert_adjust_start() are helper
+ // functions needed to implement the functionality required for
+ // lex::more(). It is called from the functor body below.
+ bool adjust_start()
+ {
+ if (!has_hold_)
+ return false;
+
+ std::swap(this->get_first(), hold_);
+ has_hold_ = false;
+ return true;
+ }
+ void revert_adjust_start()
+ {
+ // this will be called only if adjust_start above returned true
+ std::swap(this->get_first(), hold_);
+ has_hold_ = true;
+ }
+
+ TokenValue const& get_value() const
+ {
+ if (!has_value_) {
+ value_ = iterator_range<Iterator>(this->get_first(), end_);
+ has_value_ = true;
+ }
+ return value_;
+ }
+ template <typename Value>
+ void set_value(Value const& val)
+ {
+ value_ = val;
+ has_value_ = true;
+ }
+ void set_end(Iterator const& it)
+ {
+ end_ = it;
+ }
+ bool has_value() const { return has_value_; }
+ void reset_value() { has_value_ = false; }
+
+ protected:
+ semantic_actions_type const& actions_;
+ Iterator hold_; // iterator needed to support lex::more()
+ Iterator end_; // iterator pointing to end of matched token
+ mutable TokenValue value_; // token value to use
+ mutable bool has_value_; // 'true' if value_ is valid
+ bool has_hold_; // 'true' if hold_ is valid
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ data& operator= (data const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // does support lexer semantic actions, may support state, is used for
+ // position_token exposing exactly one type
+ template <typename Iterator, typename HasState, typename TokenValue>
+ class data<Iterator, mpl::true_, HasState, boost::optional<TokenValue> >
+ : public data<Iterator, mpl::false_, HasState, TokenValue>
+ {
+ public:
+ typedef semantic_actions<Iterator, HasState, data>
+ semantic_actions_type;
+
+ protected:
+ typedef data<Iterator, mpl::false_, HasState, TokenValue> base_type;
+ typedef typename base_type::char_type char_type;
+ typedef typename semantic_actions_type::functor_wrapper_type
+ functor_wrapper_type;
+
+ public:
+ typedef Iterator base_iterator_type;
+ typedef boost::optional<TokenValue> token_value_type;
+ typedef boost::optional<TokenValue> const& get_value_type;
+ typedef typename base_type::state_type state_type;
+ typedef typename base_type::state_name_type state_name_type;
+
+ typedef detail::wrap_action<functor_wrapper_type
+ , Iterator, data, std::size_t> wrap_action_type;
+
+ template <typename IterData>
+ data (IterData const& data_, Iterator& first, Iterator const& last)
+ : base_type(data_, first, last)
+ , actions_(data_.actions_), hold_()
+ , has_value_(false), has_hold_(false)
+ {
+ spirit::traits::assign_to(first, last, value_);
+ has_value_ = true;
+ }
+
+ // invoke attached semantic actions, if defined
+ BOOST_SCOPED_ENUM(pass_flags) invoke_actions(std::size_t state
+ , std::size_t& id, std::size_t unique_id, Iterator& end)
+ {
+ return actions_.invoke_actions(state, id, unique_id, end, *this);
+ }
+
+ // The function less() is used by the implementation of the support
+ // function lex::less(). Its functionality is equivalent to flex'
+ // function yyless(): it returns an iterator positioned to the
+ // nth input character beyond the current start iterator (i.e. by
+ // assigning the return value to the placeholder '_end' it is
+ // possible to return all but the first n characters of the current
+ // token back to the input stream).
+ Iterator const& less(Iterator& it, int n)
+ {
+ it = this->get_first();
+ std::advance(it, n);
+ return it;
+ }
+
+ // The function more() is used by the implementation of the support
+ // function lex::more(). Its functionality is equivalent to flex'
+ // function yymore(): it tells the lexer that the next time it
+ // matches a rule, the corresponding token should be appended onto
+ // the current token value rather than replacing it.
+ void more()
+ {
+ hold_ = this->get_first();
+ has_hold_ = true;
+ }
+
+ // The function lookahead() is used by the implementation of the
+ // support function lex::lookahead. It can be used to implement
+ // lookahead for lexer engines not supporting constructs like flex'
+ // a/b (match a, but only when followed by b)
+ bool lookahead(std::size_t id, std::size_t state = std::size_t(~0))
+ {
+ Iterator end = end_;
+ std::size_t unique_id = boost::lexer::npos;
+ bool bol = this->bol_;
+
+ if (std::size_t(~0) == state)
+ state = this->state_;
+
+ typedef basic_iterator_tokeniser<Iterator> tokenizer;
+ return id == tokenizer::next(this->state_machine_, state,
+ bol, end, this->get_eoi(), unique_id);
+ }
+
+ // The adjust_start() and revert_adjust_start() are helper
+ // functions needed to implement the functionality required for
+ // lex::more(). It is called from the functor body below.
+ bool adjust_start()
+ {
+ if (!has_hold_)
+ return false;
+
+ std::swap(this->get_first(), hold_);
+ has_hold_ = false;
+ return true;
+ }
+ void revert_adjust_start()
+ {
+ // this will be called only if adjust_start above returned true
+ std::swap(this->get_first(), hold_);
+ has_hold_ = true;
+ }
+
+ token_value_type const& get_value() const
+ {
+ if (!has_value_) {
+ spirit::traits::assign_to(this->get_first(), end_, value_);
+ has_value_ = true;
+ }
+ return value_;
+ }
+ template <typename Value>
+ void set_value(Value const& val)
+ {
+ value_ = val;
+ has_value_ = true;
+ }
+ void set_end(Iterator const& it)
+ {
+ end_ = it;
+ }
+ bool has_value() const { return has_value_; }
+ void reset_value() { has_value_ = false; }
+
+ protected:
+ semantic_actions_type const& actions_;
+ Iterator hold_; // iterator needed to support lex::more()
+ Iterator end_; // iterator pointing to end of matched token
+ mutable token_value_type value_; // token value to use
+ mutable bool has_value_; // 'true' if value_ is valid
+ bool has_hold_; // 'true' if hold_ is valid
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ data& operator= (data const&);
+ };
+ }
+}}}}
+
+#endif
+
diff --git a/boost/spirit/home/lex/lexer/lexertl/generate_static.hpp b/boost/spirit/home/lex/lexer/lexertl/generate_static.hpp
new file mode 100644
index 0000000000..ea9799cc79
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/generate_static.hpp
@@ -0,0 +1,1026 @@
+// Copyright (c) 2008-2009 Ben Hanson
+// Copyright (c) 2008-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXERTL_GENERATE_CPP_FEB_10_2008_0855PM)
+#define BOOST_SPIRIT_LEX_LEXERTL_GENERATE_CPP_FEB_10_2008_0855PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/detail/lexer/char_traits.hpp>
+#include <boost/spirit/home/support/detail/lexer/consts.hpp>
+#include <boost/spirit/home/support/detail/lexer/rules.hpp>
+#include <boost/spirit/home/support/detail/lexer/size_t.hpp>
+#include <boost/spirit/home/support/detail/lexer/state_machine.hpp>
+#include <boost/spirit/home/support/detail/lexer/debug.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/static_version.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/lexical_cast.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ namespace detail
+ {
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharT>
+ struct string_lit;
+
+ template <>
+ struct string_lit<char>
+ {
+ static char get(char c) { return c; }
+ static std::string get(char const* str = "") { return str; }
+ };
+
+ template <>
+ struct string_lit<wchar_t>
+ {
+ static wchar_t get(char c)
+ {
+ typedef std::ctype<wchar_t> ctype_t;
+ return std::use_facet<ctype_t>(std::locale()).widen(c);
+ }
+ static std::basic_string<wchar_t> get(char const* source = "")
+ {
+ using namespace std; // some systems have size_t in ns std
+ size_t len = strlen(source);
+ std::auto_ptr<wchar_t> result (new wchar_t[len+1]);
+ result.get()[len] = '\0';
+
+ // working with wide character streams is supported only if the
+ // platform provides the std::ctype<wchar_t> facet
+ BOOST_ASSERT(std::has_facet<std::ctype<wchar_t> >(std::locale()));
+
+ std::use_facet<std::ctype<wchar_t> >(std::locale())
+ .widen(source, source + len, result.get());
+ return result.get();
+ }
+ };
+
+ template <typename Char>
+ inline Char L(char c)
+ {
+ return string_lit<Char>::get(c);
+ }
+
+ template <typename Char>
+ inline std::basic_string<Char> L(char const* c = "")
+ {
+ return string_lit<Char>::get(c);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ inline bool
+ generate_delimiter(std::basic_ostream<Char> &os_)
+ {
+ os_ << std::basic_string<Char>(80, '/') << "\n";
+ return os_.good();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generate a table of the names of the used lexer states, which is a bit
+ // tricky, because the table stored with the rules is sorted based on the
+ // names, but we need it sorted using the state ids.
+ template <typename Char>
+ inline bool
+ generate_cpp_state_info (boost::lexer::basic_rules<Char> const& rules_
+ , std::basic_ostream<Char> &os_, Char const* name_suffix)
+ {
+ // we need to re-sort the state names in ascending order of the state
+ // ids, filling possible gaps in between later
+ typedef typename
+ boost::lexer::basic_rules<Char>::string_size_t_map::const_iterator
+ state_iterator;
+ typedef std::map<std::size_t, Char const*> reverse_state_map_type;
+
+ reverse_state_map_type reverse_state_map;
+ state_iterator send = rules_.statemap().end();
+ for (state_iterator sit = rules_.statemap().begin(); sit != send; ++sit)
+ {
+ typedef typename reverse_state_map_type::value_type value_type;
+ reverse_state_map.insert(value_type((*sit).second, (*sit).first.c_str()));
+ }
+
+ generate_delimiter(os_);
+ os_ << "// this table defines the names of the lexer states\n";
+ os_ << boost::lexer::detail::strings<Char>::char_name()
+ << " const* const lexer_state_names"
+ << (name_suffix[0] ? "_" : "") << name_suffix
+ << "[" << rules_.statemap().size() << "] = \n{\n";
+
+ typedef typename reverse_state_map_type::iterator iterator;
+ iterator rend = reverse_state_map.end();
+ std::size_t last_id = 0;
+ for (iterator rit = reverse_state_map.begin(); rit != rend; ++last_id)
+ {
+ for (/**/; last_id < (*rit).first; ++last_id)
+ {
+ os_ << " 0, // \"<undefined state>\"\n";
+ }
+ os_ << " "
+ << boost::lexer::detail::strings<Char>::char_prefix()
+ << "\"" << (*rit).second << "\"";
+ if (++rit != rend)
+ os_ << ",\n";
+ else
+ os_ << "\n"; // don't generate the final comma
+ }
+ os_ << "};\n\n";
+
+ generate_delimiter(os_);
+ os_ << "// this variable defines the number of lexer states\n";
+ os_ << "std::size_t const lexer_state_count"
+ << (name_suffix[0] ? "_" : "") << name_suffix
+ << " = " << rules_.statemap().size() << ";\n\n";
+ return os_.good();
+ }
+
+ template <typename Char>
+ inline bool
+ generate_cpp_state_table (std::basic_ostream<Char> &os_
+ , Char const* name_suffix, bool bol, bool eol)
+ {
+ std::basic_string<Char> suffix(L<Char>(name_suffix[0] ? "_" : ""));
+ suffix += name_suffix;
+
+ generate_delimiter(os_);
+ os_ << "// this defines a generic accessors for the information above\n";
+ os_ << "struct lexer" << suffix << "\n{\n";
+ os_ << " // version number and feature-set of compatible static lexer engine\n";
+ os_ << " enum\n";
+ os_ << " {\n static_version = "
+ << boost::lexical_cast<std::basic_string<Char> >(SPIRIT_STATIC_LEXER_VERSION)
+ << ",\n";
+ os_ << " supports_bol = " << std::boolalpha << bol << ",\n";
+ os_ << " supports_eol = " << std::boolalpha << eol << "\n";
+ os_ << " };\n\n";
+ os_ << " // return the number of lexer states\n";
+ os_ << " static std::size_t state_count()\n";
+ os_ << " {\n return lexer_state_count" << suffix << "; \n }\n\n";
+ os_ << " // return the name of the lexer state as given by 'idx'\n";
+ os_ << " static " << boost::lexer::detail::strings<Char>::char_name()
+ << " const* state_name(std::size_t idx)\n";
+ os_ << " {\n return lexer_state_names" << suffix << "[idx]; \n }\n\n";
+ os_ << " // return the next matched token\n";
+ os_ << " template<typename Iterator>\n";
+ os_ << " static std::size_t next(std::size_t &start_state_, bool& bol_\n";
+ os_ << " , Iterator &start_token_, Iterator const& end_, std::size_t& unique_id_)\n";
+ os_ << " {\n return next_token" << suffix
+ << "(start_state_, bol_, start_token_, end_, unique_id_);\n }\n";
+ os_ << "};\n\n";
+ return os_.good();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // generate function body based on traversing the DFA tables
+ template <typename Char>
+ bool generate_function_body_dfa(std::basic_ostream<Char>& os_
+ , boost::lexer::basic_state_machine<Char> const &sm_)
+ {
+ std::size_t const dfas_ = sm_.data()._dfa->size();
+ std::size_t const lookups_ = sm_.data()._lookup->front()->size();
+
+ os_ << " enum {end_state_index, id_index, unique_id_index, "
+ "state_index, bol_index,\n";
+ os_ << " eol_index, dead_state_index, dfa_offset};\n\n";
+ os_ << " static std::size_t const npos = "
+ "static_cast<std::size_t>(~0);\n";
+
+ if (dfas_ > 1)
+ {
+ for (std::size_t state_ = 0; state_ < dfas_; ++state_)
+ {
+ std::size_t i_ = 0;
+ std::size_t j_ = 1;
+ std::size_t count_ = lookups_ / 8;
+ std::size_t const* lookup_ = &sm_.data()._lookup[state_]->front();
+ std::size_t const* dfa_ = &sm_.data()._dfa[state_]->front();
+
+ os_ << " static std::size_t const lookup" << state_
+ << "_[" << lookups_ << "] = {\n ";
+ for (/**/; i_ < count_; ++i_)
+ {
+ std::size_t const index_ = i_ * 8;
+ os_ << lookup_[index_];
+ for (/**/; j_ < 8; ++j_)
+ {
+ os_ << ", " << lookup_[index_ + j_];
+ }
+ if (i_ < count_ - 1)
+ {
+ os_ << ",\n ";
+ }
+ j_ = 1;
+ }
+ os_ << " };\n";
+
+ count_ = sm_.data()._dfa[state_]->size ();
+ os_ << " static const std::size_t dfa" << state_ << "_["
+ << count_ << "] = {\n ";
+ count_ /= 8;
+ for (i_ = 0; i_ < count_; ++i_)
+ {
+ std::size_t const index_ = i_ * 8;
+ os_ << dfa_[index_];
+ for (j_ = 1; j_ < 8; ++j_)
+ {
+ os_ << ", " << dfa_[index_ + j_];
+ }
+ if (i_ < count_ - 1)
+ {
+ os_ << ",\n ";
+ }
+ }
+
+ std::size_t const mod_ = sm_.data()._dfa[state_]->size () % 8;
+ if (mod_)
+ {
+ std::size_t const index_ = count_ * 8;
+ if (count_)
+ {
+ os_ << ",\n ";
+ }
+ os_ << dfa_[index_];
+ for (j_ = 1; j_ < mod_; ++j_)
+ {
+ os_ << ", " << dfa_[index_ + j_];
+ }
+ }
+ os_ << " };\n";
+ }
+
+ std::size_t count_ = sm_.data()._dfa_alphabet.size();
+ std::size_t i_ = 1;
+
+ os_ << " static std::size_t const* lookup_arr_[" << count_
+ << "] = { lookup0_";
+ for (i_ = 1; i_ < count_; ++i_)
+ {
+ os_ << ", " << "lookup" << i_ << "_";
+ }
+ os_ << " };\n";
+
+ os_ << " static std::size_t const dfa_alphabet_arr_["
+ << count_ << "] = { ";
+ os_ << sm_.data()._dfa_alphabet.front ();
+ for (i_ = 1; i_ < count_; ++i_)
+ {
+ os_ << ", " << sm_.data()._dfa_alphabet[i_];
+ }
+ os_ << " };\n";
+
+ os_ << " static std::size_t const* dfa_arr_[" << count_
+ << "] = { ";
+ os_ << "dfa0_";
+ for (i_ = 1; i_ < count_; ++i_)
+ {
+ os_ << ", " << "dfa" << i_ << "_";
+ }
+ os_ << " };\n";
+ }
+ else
+ {
+ std::size_t const* lookup_ = &sm_.data()._lookup[0]->front();
+ std::size_t const* dfa_ = &sm_.data()._dfa[0]->front();
+ std::size_t i_ = 0;
+ std::size_t j_ = 1;
+ std::size_t count_ = lookups_ / 8;
+
+ os_ << " static std::size_t const lookup_[";
+ os_ << sm_.data()._lookup[0]->size() << "] = {\n ";
+ for (/**/; i_ < count_; ++i_)
+ {
+ const std::size_t index_ = i_ * 8;
+ os_ << lookup_[index_];
+ for (/**/; j_ < 8; ++j_)
+ {
+ os_ << ", " << lookup_[index_ + j_];
+ }
+ if (i_ < count_ - 1)
+ {
+ os_ << ",\n ";
+ }
+ j_ = 1;
+ }
+ os_ << " };\n";
+
+ os_ << " static std::size_t const dfa_alphabet_ = "
+ << sm_.data()._dfa_alphabet.front () << ";\n";
+ os_ << " static std::size_t const dfa_["
+ << sm_.data()._dfa[0]->size () << "] = {\n ";
+ count_ = sm_.data()._dfa[0]->size () / 8;
+ for (i_ = 0; i_ < count_; ++i_)
+ {
+ const std::size_t index_ = i_ * 8;
+ os_ << dfa_[index_];
+ for (j_ = 1; j_ < 8; ++j_)
+ {
+ os_ << ", " << dfa_[index_ + j_];
+ }
+ if (i_ < count_ - 1)
+ {
+ os_ << ",\n ";
+ }
+ }
+
+ const std::size_t mod_ = sm_.data()._dfa[0]->size () % 8;
+ if (mod_)
+ {
+ const std::size_t index_ = count_ * 8;
+ if (count_)
+ {
+ os_ << ",\n ";
+ }
+ os_ << dfa_[index_];
+ for (j_ = 1; j_ < mod_; ++j_)
+ {
+ os_ << ", " << dfa_[index_ + j_];
+ }
+ }
+ os_ << " };\n";
+ }
+
+ os_ << "\n if (start_token_ == end_)\n";
+ os_ << " {\n";
+ os_ << " unique_id_ = npos;\n";
+ os_ << " return 0;\n";
+ os_ << " }\n\n";
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bool bol = bol_;\n\n";
+ }
+
+ if (dfas_ > 1)
+ {
+ os_ << "again:\n";
+ os_ << " std::size_t const* lookup_ = lookup_arr_[start_state_];\n";
+ os_ << " std::size_t dfa_alphabet_ = dfa_alphabet_arr_[start_state_];\n";
+ os_ << " std::size_t const*dfa_ = dfa_arr_[start_state_];\n";
+ }
+
+ os_ << " std::size_t const* ptr_ = dfa_ + dfa_alphabet_;\n";
+ os_ << " Iterator curr_ = start_token_;\n";
+ os_ << " bool end_state_ = *ptr_ != 0;\n";
+ os_ << " std::size_t id_ = *(ptr_ + id_index);\n";
+ os_ << " std::size_t uid_ = *(ptr_ + unique_id_index);\n";
+ if (dfas_ > 1)
+ {
+ os_ << " std::size_t end_start_state_ = start_state_;\n";
+ }
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bool end_bol_ = bol_;\n";
+ }
+ os_ << " Iterator end_token_ = start_token_;\n\n";
+
+ os_ << " while (curr_ != end_)\n";
+ os_ << " {\n";
+
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " std::size_t const BOL_state_ = ptr_[bol_index];\n\n";
+ }
+
+ if (sm_.data()._seen_EOL_assertion)
+ {
+ os_ << " std::size_t const EOL_state_ = ptr_[eol_index];\n\n";
+ }
+
+ if (sm_.data()._seen_BOL_assertion && sm_.data()._seen_EOL_assertion)
+ {
+ os_ << " if (BOL_state_ && bol)\n";
+ os_ << " {\n";
+ os_ << " ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];\n";
+ os_ << " }\n";
+ os_ << " else if (EOL_state_ && *curr_ == '\\n')\n";
+ os_ << " {\n";
+ os_ << " ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];\n";
+ os_ << " }\n";
+ os_ << " else\n";
+ os_ << " {\n";
+ if (lookups_ == 256)
+ {
+ os_ << " unsigned char index = \n";
+ os_ << " static_cast<unsigned char>(*curr_++);\n";
+ }
+ else
+ {
+ os_ << " std::size_t index = *curr_++\n";
+ }
+ os_ << " bol = (index == '\n') ? true : false;\n";
+ os_ << " std::size_t const state_ = ptr_[\n";
+ os_ << " lookup_[static_cast<std::size_t>(index)]];\n";
+
+ os_ << '\n';
+ os_ << " if (state_ == 0) break;\n";
+ os_ << '\n';
+ os_ << " ptr_ = &dfa_[state_ * dfa_alphabet_];\n";
+ os_ << " }\n\n";
+ }
+ else if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " if (BOL_state_ && bol)\n";
+ os_ << " {\n";
+ os_ << " ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];\n";
+ os_ << " }\n";
+ os_ << " else\n";
+ os_ << " {\n";
+ if (lookups_ == 256)
+ {
+ os_ << " unsigned char index = \n";
+ os_ << " static_cast<unsigned char>(*curr_++);\n";
+ }
+ else
+ {
+ os_ << " std::size_t index = *curr_++\n";
+ }
+ os_ << " bol = (index == '\n') ? true : false;\n";
+ os_ << " std::size_t const state_ = ptr_[\n";
+ os_ << " lookup_[static_cast<std::size_t>(index)]];\n";
+
+ os_ << '\n';
+ os_ << " if (state_ == 0) break;\n";
+ os_ << '\n';
+ os_ << " ptr_ = &dfa_[state_ * dfa_alphabet_];\n";
+ os_ << " }\n\n";
+ }
+ else if (sm_.data()._seen_EOL_assertion)
+ {
+ os_ << " if (EOL_state_ && *curr_ == '\\n')\n";
+ os_ << " {\n";
+ os_ << " ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];\n";
+ os_ << " }\n";
+ os_ << " else\n";
+ os_ << " {\n";
+ if (lookups_ == 256)
+ {
+ os_ << " unsigned char index = \n";
+ os_ << " static_cast<unsigned char>(*curr_++);\n";
+ }
+ else
+ {
+ os_ << " std::size_t index = *curr_++\n";
+ }
+ os_ << " bol = (index == '\n') ? true : false;\n";
+ os_ << " std::size_t const state_ = ptr_[\n";
+ os_ << " lookup_[static_cast<std::size_t>(index)]];\n";
+
+ os_ << '\n';
+ os_ << " if (state_ == 0) break;\n";
+ os_ << '\n';
+ os_ << " ptr_ = &dfa_[state_ * dfa_alphabet_];\n";
+ os_ << " }\n\n";
+ }
+ else
+ {
+ os_ << " std::size_t const state_ =\n";
+
+ if (lookups_ == 256)
+ {
+ os_ << " ptr_[lookup_["
+ "static_cast<unsigned char>(*curr_++)]];\n";
+ }
+ else
+ {
+ os_ << " ptr_[lookup_[*curr_++]];\n";
+ }
+
+ os_ << '\n';
+ os_ << " if (state_ == 0) break;\n";
+ os_ << '\n';
+ os_ << " ptr_ = &dfa_[state_ * dfa_alphabet_];\n\n";
+ }
+
+ os_ << " if (*ptr_)\n";
+ os_ << " {\n";
+ os_ << " end_state_ = true;\n";
+ os_ << " id_ = *(ptr_ + id_index);\n";
+ os_ << " uid_ = *(ptr_ + unique_id_index);\n";
+ if (dfas_ > 1)
+ {
+ os_ << " end_start_state_ = *(ptr_ + state_index);\n";
+ }
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " end_bol_ = bol;\n";
+ }
+ os_ << " end_token_ = curr_;\n";
+ os_ << " }\n";
+ os_ << " }\n\n";
+
+ if (sm_.data()._seen_EOL_assertion)
+ {
+ os_ << " std::size_t const EOL_state_ = ptr_[eol_index];\n\n";
+
+ os_ << " if (EOL_state_ && curr_ == end_)\n";
+ os_ << " {\n";
+ os_ << " ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];\n\n";
+
+ os_ << " if (*ptr_)\n";
+ os_ << " {\n";
+ os_ << " end_state_ = true;\n";
+ os_ << " id_ = *(ptr_ + id_index);\n";
+ os_ << " uid_ = *(ptr_ + unique_id_index);\n";
+ if (dfas_ > 1)
+ {
+ os_ << " end_start_state_ = *(ptr_ + state_index);\n";
+ }
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " end_bol_ = bol;\n";
+ }
+ os_ << " end_token_ = curr_;\n";
+ os_ << " }\n";
+ os_ << " }\n\n";
+ }
+
+ os_ << " if (end_state_)\n";
+ os_ << " {\n";
+ os_ << " // return longest match\n";
+ os_ << " start_token_ = end_token_;\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " start_state_ = end_start_state_;\n";
+ os_ << " if (id_ == 0)\n";
+ os_ << " {\n";
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bol = end_bol_;\n";
+ }
+ os_ << " goto again;\n";
+ os_ << " }\n";
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " else\n";
+ os_ << " {\n";
+ os_ << " bol_ = end_bol_;\n";
+ os_ << " }\n";
+ }
+ }
+ else if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bol_ = end_bol_;\n";
+ }
+
+ os_ << " }\n";
+ os_ << " else\n";
+ os_ << " {\n";
+
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bol_ = (*start_token_ == '\n') ? true : false;\n";
+ }
+
+ os_ << " id_ = npos;\n";
+ os_ << " uid_ = npos;\n";
+ os_ << " }\n\n";
+
+ os_ << " unique_id_ = uid_;\n";
+ os_ << " return id_;\n";
+ return os_.good();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ inline std::basic_string<Char> get_charlit(Char ch)
+ {
+ std::basic_string<Char> result;
+ boost::lexer::basic_string_token<Char>::escape_char(ch, result);
+ return result;
+ }
+
+ // check whether state0_0 is referenced from any of the other states
+ template <typename Char>
+ bool need_label0_0(boost::lexer::basic_state_machine<Char> const &sm_)
+ {
+ typedef typename boost::lexer::basic_state_machine<Char>::iterator
+ iterator_type;
+ iterator_type iter_ = sm_.begin();
+ std::size_t const states_ = iter_->states;
+
+ for (std::size_t state_ = 0; state_ < states_; ++state_)
+ {
+ if (0 == iter_->bol_index || 0 == iter_->eol_index)
+ {
+ return true;
+ }
+
+ std::size_t const transitions_ = iter_->transitions;
+ for (std::size_t t_ = 0; t_ < transitions_; ++t_)
+ {
+ if (0 == iter_->goto_state)
+ {
+ return true;
+ }
+ ++iter_;
+ }
+ if (transitions_ == 0) ++iter_;
+ }
+ return false;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ bool generate_function_body_switch(std::basic_ostream<Char> & os_
+ , boost::lexer::basic_state_machine<Char> const &sm_)
+ {
+ typedef typename boost::lexer::basic_state_machine<Char>::iterator
+ iterator_type;
+
+ std::size_t const lookups_ = sm_.data()._lookup->front ()->size ();
+ iterator_type iter_ = sm_.begin();
+ iterator_type labeliter_ = iter_;
+ iterator_type end_ = sm_.end();
+ std::size_t const dfas_ = sm_.data()._dfa->size ();
+
+ os_ << " static std::size_t const npos = "
+ "static_cast<std::size_t>(~0);\n";
+
+ os_ << "\n if (start_token_ == end_)\n";
+ os_ << " {\n";
+ os_ << " unique_id_ = npos;\n";
+ os_ << " return 0;\n";
+ os_ << " }\n\n";
+
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bool bol = bol_;\n";
+ }
+
+ if (dfas_ > 1)
+ {
+ os_ << "again:\n";
+ }
+
+ os_ << " Iterator curr_ = start_token_;\n";
+ os_ << " bool end_state_ = false;\n";
+ os_ << " std::size_t id_ = npos;\n";
+ os_ << " std::size_t uid_ = npos;\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " std::size_t end_start_state_ = start_state_;\n";
+ }
+
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bool end_bol_ = bol_;\n";
+ }
+
+ os_ << " Iterator end_token_ = start_token_;\n";
+ os_ << '\n';
+
+ os_ << " " << ((lookups_ == 256) ? "char" : "wchar_t")
+ << " ch_ = 0;\n\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " switch (start_state_)\n";
+ os_ << " {\n";
+
+ for (std::size_t i_ = 0; i_ < dfas_; ++i_)
+ {
+ os_ << " case " << i_ << ":\n";
+ os_ << " goto state" << i_ << "_0;\n";
+ os_ << " break;\n";
+ }
+
+ os_ << " default:\n";
+ os_ << " goto end;\n";
+ os_ << " break;\n";
+ os_ << " }\n";
+ }
+
+ bool need_state0_0_label = need_label0_0(sm_);
+
+ for (std::size_t dfa_ = 0; dfa_ < dfas_; ++dfa_)
+ {
+ std::size_t const states_ = iter_->states;
+ for (std::size_t state_ = 0; state_ < states_; ++state_)
+ {
+ std::size_t const transitions_ = iter_->transitions;
+ std::size_t t_ = 0;
+
+ if (dfas_ > 1 || dfa_ != 0 || state_ != 0 || need_state0_0_label)
+ {
+ os_ << "\nstate" << dfa_ << '_' << state_ << ":\n";
+ }
+
+ if (iter_->end_state)
+ {
+ os_ << " end_state_ = true;\n";
+ os_ << " id_ = " << iter_->id << ";\n";
+ os_ << " uid_ = " << iter_->unique_id << ";\n";
+ os_ << " end_token_ = curr_;\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " end_start_state_ = " << iter_->goto_dfa <<
+ ";\n";
+ }
+
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " end_bol_ = bol;\n";
+ }
+
+ if (transitions_) os_ << '\n';
+ }
+
+ if (t_ < transitions_ ||
+ iter_->bol_index != boost::lexer::npos ||
+ iter_->eol_index != boost::lexer::npos)
+ {
+ os_ << " if (curr_ == end_) goto end;\n";
+ os_ << " ch_ = *curr_;\n";
+ if (iter_->bol_index != boost::lexer::npos)
+ {
+ os_ << "\n if (bol) goto state" << dfa_ << '_'
+ << iter_->bol_index << ";\n";
+ }
+ if (iter_->eol_index != boost::lexer::npos)
+ {
+ os_ << "\n if (ch_ == '\n') goto state" << dfa_
+ << '_' << iter_->eol_index << ";\n";
+ }
+ os_ << " ++curr_;\n";
+ }
+
+ for (/**/; t_ < transitions_; ++t_)
+ {
+ Char const *ptr_ = iter_->token._charset.c_str();
+ Char const *end_ = ptr_ + iter_->token._charset.size();
+ Char start_char_ = 0;
+ Char curr_char_ = 0;
+ bool range_ = false;
+ bool first_char_ = true;
+
+ os_ << "\n if (";
+
+ while (ptr_ != end_)
+ {
+ curr_char_ = *ptr_++;
+
+ if (*ptr_ == curr_char_ + 1)
+ {
+ if (!range_)
+ {
+ start_char_ = curr_char_;
+ }
+ range_ = true;
+ }
+ else
+ {
+ if (!first_char_)
+ {
+ os_ << ((iter_->token._negated) ? " && " : " || ");
+ }
+ else
+ {
+ first_char_ = false;
+ }
+ if (range_)
+ {
+ if (iter_->token._negated)
+ {
+ os_ << "!";
+ }
+ os_ << "(ch_ >= '" << get_charlit(start_char_)
+ << "' && ch_ <= '"
+ << get_charlit(curr_char_) << "')";
+ range_ = false;
+ }
+ else
+ {
+ os_ << "ch_ "
+ << ((iter_->token._negated) ? "!=" : "==")
+ << " '" << get_charlit(curr_char_) << "'";
+ }
+ }
+ }
+
+ os_ << ") goto state" << dfa_ << '_' << iter_->goto_state
+ << ";\n";
+ ++iter_;
+ }
+
+ if (!(dfa_ == dfas_ - 1 && state_ == states_ - 1))
+ {
+ os_ << " goto end;\n";
+ }
+
+ if (transitions_ == 0) ++iter_;
+ }
+ }
+
+ os_ << "\nend:\n";
+ os_ << " if (end_state_)\n";
+ os_ << " {\n";
+ os_ << " // return longest match\n";
+ os_ << " start_token_ = end_token_;\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " start_state_ = end_start_state_;\n";
+ os_ << "\n if (id_ == 0)\n";
+ os_ << " {\n";
+
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bol = end_bol_;\n";
+ }
+
+ os_ << " goto again;\n";
+ os_ << " }\n";
+
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " else\n";
+ os_ << " {\n";
+ os_ << " bol_ = end_bol_;\n";
+ os_ << " }\n";
+ }
+ }
+ else if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bol_ = end_bol_;\n";
+ }
+
+ os_ << " }\n";
+ os_ << " else\n";
+ os_ << " {\n";
+
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << " bol_ = (*start_token_ == '\\n') ? true : false;\n";
+ }
+ os_ << " id_ = npos;\n";
+ os_ << " uid_ = npos;\n";
+ os_ << " }\n\n";
+
+ os_ << " unique_id_ = uid_;\n";
+ os_ << " return id_;\n";
+ return os_.good();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generate a tokenizer for the given state machine.
+ template <typename Char, typename F>
+ inline bool
+ generate_cpp (boost::lexer::basic_state_machine<Char> const& sm_
+ , boost::lexer::basic_rules<Char> const& rules_
+ , std::basic_ostream<Char> &os_, Char const* name_suffix
+ , F generate_function_body)
+ {
+ if (sm_.data()._lookup->empty())
+ return false;
+
+ std::size_t const dfas_ = sm_.data()._dfa->size();
+// std::size_t const lookups_ = sm_.data()._lookup->front()->size();
+
+ os_ << "// Copyright (c) 2008-2009 Ben Hanson\n";
+ os_ << "// Copyright (c) 2008-2011 Hartmut Kaiser\n";
+ os_ << "//\n";
+ os_ << "// Distributed under the Boost Software License, "
+ "Version 1.0. (See accompanying\n";
+ os_ << "// file licence_1_0.txt or copy at "
+ "http://www.boost.org/LICENSE_1_0.txt)\n\n";
+ os_ << "// Auto-generated by boost::lexer, do not edit\n\n";
+
+ std::basic_string<Char> guard(name_suffix);
+ guard += L<Char>(name_suffix[0] ? "_" : "");
+ guard += L<Char>(__DATE__ "_" __TIME__);
+ typename std::basic_string<Char>::size_type p =
+ guard.find_first_of(L<Char>(": "));
+ while (std::string::npos != p)
+ {
+ guard.replace(p, 1, L<Char>("_"));
+ p = guard.find_first_of(L<Char>(": "), p);
+ }
+ boost::to_upper(guard);
+
+ os_ << "#if !defined(BOOST_SPIRIT_LEXER_NEXT_TOKEN_" << guard << ")\n";
+ os_ << "#define BOOST_SPIRIT_LEXER_NEXT_TOKEN_" << guard << "\n\n";
+
+ os_ << "#include <boost/detail/iterator.hpp>\n";
+ os_ << "#include <boost/spirit/home/support/detail/lexer/char_traits.hpp>\n\n";
+
+ generate_delimiter(os_);
+ os_ << "// the generated table of state names and the tokenizer have to be\n"
+ "// defined in the boost::spirit::lex::lexertl::static_ namespace\n";
+ os_ << "namespace boost { namespace spirit { namespace lex { "
+ "namespace lexertl { namespace static_ {\n\n";
+
+ // generate the lexer state information variables
+ if (!generate_cpp_state_info(rules_, os_, name_suffix))
+ return false;
+
+ generate_delimiter(os_);
+ os_ << "// this function returns the next matched token\n";
+ os_ << "template<typename Iterator>\n";
+ os_ << "std::size_t next_token" << (name_suffix[0] ? "_" : "")
+ << name_suffix << " (";
+
+ if (dfas_ > 1)
+ {
+ os_ << "std::size_t& start_state_, ";
+ }
+ else
+ {
+ os_ << "std::size_t& /*start_state_*/, ";
+ }
+ if (sm_.data()._seen_BOL_assertion)
+ {
+ os_ << "bool& bol_, ";
+ }
+ else
+ {
+ os_ << "bool& /*bol_*/, ";
+ }
+ os_ << "\n ";
+
+ os_ << "Iterator &start_token_, Iterator const& end_, ";
+ os_ << "std::size_t& unique_id_)\n";
+ os_ << "{\n";
+ if (!generate_function_body(os_, sm_))
+ return false;
+ os_ << "}\n\n";
+
+ if (!generate_cpp_state_table<Char>(os_, name_suffix
+ , sm_.data()._seen_BOL_assertion, sm_.data()._seen_EOL_assertion))
+ {
+ return false;
+ }
+
+ os_ << "}}}}} // namespace boost::spirit::lex::lexertl::static_\n\n";
+
+ os_ << "#endif\n";
+
+ return os_.good();
+ }
+
+ } // namespace detail
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Lexer, typename F>
+ inline bool
+ generate_static(Lexer const& lexer
+ , std::basic_ostream<typename Lexer::char_type>& os
+ , typename Lexer::char_type const* name_suffix, F f)
+ {
+ if (!lexer.init_dfa(true)) // always minimize DFA for static lexers
+ return false;
+ return detail::generate_cpp(lexer.state_machine_, lexer.rules_, os
+ , name_suffix, f);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // deprecated function, will be removed in the future (this has been
+ // replaced by the function generate_static_dfa - see below).
+ template <typename Lexer>
+ inline bool
+ generate_static(Lexer const& lexer
+ , std::basic_ostream<typename Lexer::char_type>& os
+ , typename Lexer::char_type const* name_suffix =
+ detail::L<typename Lexer::char_type>())
+ {
+ return generate_static(lexer, os, name_suffix
+ , &detail::generate_function_body_dfa<typename Lexer::char_type>);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Lexer>
+ inline bool
+ generate_static_dfa(Lexer const& lexer
+ , std::basic_ostream<typename Lexer::char_type>& os
+ , typename Lexer::char_type const* name_suffix =
+ detail::L<typename Lexer::char_type>())
+ {
+ return generate_static(lexer, os, name_suffix
+ , &detail::generate_function_body_dfa<typename Lexer::char_type>);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Lexer>
+ inline bool
+ generate_static_switch(Lexer const& lexer
+ , std::basic_ostream<typename Lexer::char_type>& os
+ , typename Lexer::char_type const* name_suffix =
+ detail::L<typename Lexer::char_type>())
+ {
+ return generate_static(lexer, os, name_suffix
+ , &detail::generate_function_body_switch<typename Lexer::char_type>);
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/iterator.hpp b/boost/spirit/home/lex/lexer/lexertl/iterator.hpp
new file mode 100644
index 0000000000..f2793ba802
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/iterator.hpp
@@ -0,0 +1,121 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXER_ITERATOR_MAR_16_2007_0353PM)
+#define BOOST_SPIRIT_LEX_LEXER_ITERATOR_MAR_16_2007_0353PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#if defined(BOOST_SPIRIT_DEBUG)
+#include <boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp>
+#else
+#include <boost/spirit/home/support/iterators/detail/no_check_policy.hpp>
+#endif
+#include <boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp>
+#include <boost/spirit/home/support/iterators/multi_pass.hpp>
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename FunctorData>
+ struct make_multi_pass
+ {
+ // Divide the given functor type into its components (unique and
+ // shared) and build a std::pair from these parts
+ typedef std::pair<typename FunctorData::unique
+ , typename FunctorData::shared> functor_data_type;
+
+ // This is the result type returned from the iterator
+ typedef typename FunctorData::result_type result_type;
+
+ // Compose the multi_pass iterator policy type from the appropriate
+ // policies
+ typedef iterator_policies::split_functor_input input_policy;
+ typedef iterator_policies::ref_counted ownership_policy;
+#if defined(BOOST_SPIRIT_DEBUG)
+ typedef iterator_policies::buf_id_check check_policy;
+#else
+ typedef iterator_policies::no_check check_policy;
+#endif
+ typedef iterator_policies::split_std_deque storage_policy;
+
+ typedef iterator_policies::default_policy<
+ ownership_policy, check_policy, input_policy, storage_policy>
+ policy_type;
+
+ // Compose the multi_pass iterator from the policy
+ typedef spirit::multi_pass<functor_data_type, policy_type> type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // lexer_iterator exposes an iterator for a lexertl based dfa (lexer)
+ // The template parameters have the same semantics as described for the
+ // functor above.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Functor>
+ class iterator : public make_multi_pass<Functor>::type
+ {
+ public:
+ typedef typename Functor::unique unique_functor_type;
+ typedef typename Functor::shared shared_functor_type;
+
+ typedef typename Functor::iterator_type base_iterator_type;
+ typedef typename Functor::result_type token_type;
+
+ private:
+ typedef typename make_multi_pass<Functor>::functor_data_type
+ functor_type;
+ typedef typename make_multi_pass<Functor>::type base_type;
+ typedef typename Functor::char_type char_type;
+
+ public:
+ // create a new iterator encapsulating the lexer object to be used
+ // for tokenization
+ template <typename IteratorData>
+ iterator(IteratorData const& iterdata_, base_iterator_type& first
+ , base_iterator_type const& last, char_type const* state = 0)
+ : base_type(functor_type(unique_functor_type()
+ , shared_functor_type(iterdata_, first, last)))
+ {
+ set_state(map_state(state));
+ }
+
+ // create an end iterator usable for end of range checking
+ iterator() {}
+
+ // (wash): < mgaunard> T it; T it2 = ++it; doesn't ocmpile
+ // < mgaunard> this gets fixed by adding
+ iterator(const base_type& base)
+ : base_type(base) { }
+
+ // set the new required state for the underlying lexer object
+ std::size_t set_state(std::size_t state)
+ {
+ return unique_functor_type::set_state(*this, state);
+ }
+
+ // get the curent state for the underlying lexer object
+ std::size_t get_state()
+ {
+ return unique_functor_type::get_state(*this);
+ }
+
+ // map the given state name to a corresponding state id as understood
+ // by the underlying lexer object
+ std::size_t map_state(char_type const* statename)
+ {
+ return (0 != statename)
+ ? unique_functor_type::map_state(*this, statename)
+ : 0;
+ }
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp b/boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp
new file mode 100644
index 0000000000..31dffcedde
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp
@@ -0,0 +1,255 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEXERTL_ITERATOR_TOKENISER_MARCH_22_2007_0859AM)
+#define BOOST_SPIRIT_LEXERTL_ITERATOR_TOKENISER_MARCH_22_2007_0859AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/detail/iterator.hpp>
+#include <boost/spirit/home/support/detail/lexer/state_machine.hpp>
+#include <boost/spirit/home/support/detail/lexer/consts.hpp>
+#include <boost/spirit/home/support/detail/lexer/size_t.hpp>
+#include <boost/spirit/home/support/detail/lexer/char_traits.hpp>
+#include <vector>
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Iterator>
+ class basic_iterator_tokeniser
+ {
+ public:
+ typedef std::vector<std::size_t> size_t_vector;
+ typedef typename boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+
+ static std::size_t next (
+ boost::lexer::basic_state_machine<char_type> const& state_machine_
+ , std::size_t &dfa_state_, bool& bol_, Iterator &start_token_
+ , Iterator const& end_, std::size_t& unique_id_)
+ {
+ if (start_token_ == end_)
+ {
+ unique_id_ = boost::lexer::npos;
+ return 0;
+ }
+
+ bool bol = bol_;
+ boost::lexer::detail::internals const& internals_ =
+ state_machine_.data();
+
+ again:
+ std::size_t const* lookup_ = &internals_._lookup[dfa_state_]->
+ front ();
+ std::size_t dfa_alphabet_ = internals_._dfa_alphabet[dfa_state_];
+ std::size_t const* dfa_ = &internals_._dfa[dfa_state_]->front ();
+
+ std::size_t const* ptr_ = dfa_ + dfa_alphabet_;
+ Iterator curr_ = start_token_;
+ bool end_state_ = *ptr_ != 0;
+ std::size_t id_ = *(ptr_ + boost::lexer::id_index);
+ std::size_t uid_ = *(ptr_ + boost::lexer::unique_id_index);
+ std::size_t end_start_state_ = dfa_state_;
+ bool end_bol_ = bol_;
+ Iterator end_token_ = start_token_;
+
+ while (curr_ != end_)
+ {
+ std::size_t const BOL_state_ = ptr_[boost::lexer::bol_index];
+ std::size_t const EOL_state_ = ptr_[boost::lexer::eol_index];
+
+ if (BOL_state_ && bol)
+ {
+ ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];
+ }
+ else if (EOL_state_ && *curr_ == '\n')
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+ }
+ else
+ {
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ value_type;
+ typedef typename
+ boost::lexer::char_traits<value_type>::index_type
+ index_type;
+
+ index_type index =
+ boost::lexer::char_traits<value_type>::call(*curr_++);
+ bol = (index == '\n') ? true : false;
+ std::size_t const state_ = ptr_[
+ lookup_[static_cast<std::size_t>(index)]];
+
+ if (state_ == 0)
+ {
+ break;
+ }
+
+ ptr_ = &dfa_[state_ * dfa_alphabet_];
+ }
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + boost::lexer::id_index);
+ uid_ = *(ptr_ + boost::lexer::unique_id_index);
+ end_start_state_ = *(ptr_ + boost::lexer::state_index);
+ end_bol_ = bol;
+ end_token_ = curr_;
+ }
+ }
+
+ std::size_t const EOL_state_ = ptr_[boost::lexer::eol_index];
+
+ if (EOL_state_ && curr_ == end_)
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + boost::lexer::id_index);
+ uid_ = *(ptr_ + boost::lexer::unique_id_index);
+ end_start_state_ = *(ptr_ + boost::lexer::state_index);
+ end_bol_ = bol;
+ end_token_ = curr_;
+ }
+ }
+
+ if (end_state_) {
+ // return longest match
+ dfa_state_ = end_start_state_;
+ start_token_ = end_token_;
+
+ if (id_ == 0)
+ {
+ bol = end_bol_;
+ goto again;
+ }
+ else
+ {
+ bol_ = end_bol_;
+ }
+ }
+ else {
+ bol_ = (*start_token_ == '\n') ? true : false;
+ id_ = boost::lexer::npos;
+ uid_ = boost::lexer::npos;
+ }
+
+ unique_id_ = uid_;
+ return id_;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ static std::size_t next (
+ boost::lexer::basic_state_machine<char_type> const& state_machine_
+ , bool& bol_, Iterator &start_token_, Iterator const& end_
+ , std::size_t& unique_id_)
+ {
+ if (start_token_ == end_)
+ {
+ unique_id_ = boost::lexer::npos;
+ return 0;
+ }
+
+ bool bol = bol_;
+ std::size_t const* lookup_ = &state_machine_.data()._lookup[0]->front();
+ std::size_t dfa_alphabet_ = state_machine_.data()._dfa_alphabet[0];
+ std::size_t const* dfa_ = &state_machine_.data()._dfa[0]->front ();
+ std::size_t const* ptr_ = dfa_ + dfa_alphabet_;
+
+ Iterator curr_ = start_token_;
+ bool end_state_ = *ptr_ != 0;
+ std::size_t id_ = *(ptr_ + boost::lexer::id_index);
+ std::size_t uid_ = *(ptr_ + boost::lexer::unique_id_index);
+ bool end_bol_ = bol_;
+ Iterator end_token_ = start_token_;
+
+ while (curr_ != end_)
+ {
+ std::size_t const BOL_state_ = ptr_[boost::lexer::bol_index];
+ std::size_t const EOL_state_ = ptr_[boost::lexer::eol_index];
+
+ if (BOL_state_ && bol)
+ {
+ ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];
+ }
+ else if (EOL_state_ && *curr_ == '\n')
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+ }
+ else
+ {
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ value_type;
+ typedef typename
+ boost::lexer::char_traits<value_type>::index_type
+ index_type;
+
+ index_type index =
+ boost::lexer::char_traits<value_type>::call(*curr_++);
+ bol = (index == '\n') ? true : false;
+ std::size_t const state_ = ptr_[
+ lookup_[static_cast<std::size_t>(index)]];
+
+ if (state_ == 0)
+ {
+ break;
+ }
+
+ ptr_ = &dfa_[state_ * dfa_alphabet_];
+ }
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + boost::lexer::id_index);
+ uid_ = *(ptr_ + boost::lexer::unique_id_index);
+ end_bol_ = bol;
+ end_token_ = curr_;
+ }
+ }
+
+ std::size_t const EOL_state_ = ptr_[boost::lexer::eol_index];
+
+ if (EOL_state_ && curr_ == end_)
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + boost::lexer::id_index);
+ uid_ = *(ptr_ + boost::lexer::unique_id_index);
+ end_bol_ = bol;
+ end_token_ = curr_;
+ }
+ }
+
+ if (end_state_) {
+ // return longest match
+ bol_ = end_bol_;
+ start_token_ = end_token_;
+ }
+ else {
+ bol_ = *start_token_ == '\n';
+ id_ = boost::lexer::npos;
+ uid_ = boost::lexer::npos;
+ }
+
+ unique_id_ = uid_;
+ return id_;
+ }
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/lexer.hpp b/boost/spirit/home/lex/lexer/lexertl/lexer.hpp
new file mode 100644
index 0000000000..0f8af55d0d
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/lexer.hpp
@@ -0,0 +1,399 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXER_MAR_17_2007_0139PM)
+#define BOOST_SPIRIT_LEX_LEXER_MAR_17_2007_0139PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <iosfwd>
+
+#include <boost/spirit/home/support/detail/lexer/generator.hpp>
+#include <boost/spirit/home/support/detail/lexer/rules.hpp>
+#include <boost/spirit/home/support/detail/lexer/consts.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+
+#include <boost/spirit/home/lex/lexer/lexertl/token.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/functor.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/functor_data.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/iterator.hpp>
+#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
+#include <boost/spirit/home/support/detail/lexer/debug.hpp>
+#endif
+
+#include <boost/foreach.hpp>
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // The must_escape function checks if the given character value needs
+ // to be preceded by a backslash character to disable its special
+ // meaning in the context of a regular expression
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ inline bool must_escape(Char c)
+ {
+ // FIXME: more needed?
+ switch (c) {
+ case '+': case '/': case '*': case '?':
+ case '|':
+ case '(': case ')':
+ case '[': case ']':
+ case '{': case '}':
+ case '.':
+ case '^': case '$':
+ case '\\':
+ case '"':
+ return true;
+
+ default:
+ break;
+ }
+ return false;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // The escape function returns the string representation of the given
+ // character value, possibly escaped with a backslash character, to
+ // allow it being safely used in a regular expression definition.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ inline std::basic_string<Char> escape(Char ch)
+ {
+ std::basic_string<Char> result(1, ch);
+ if (detail::must_escape(ch))
+ {
+ typedef typename std::basic_string<Char>::size_type size_type;
+ result.insert((size_type)0, 1, '\\');
+ }
+ return result;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ //
+ ///////////////////////////////////////////////////////////////////////
+ inline boost::lexer::regex_flags map_flags(unsigned int flags)
+ {
+ unsigned int retval = boost::lexer::none;
+ if (flags & match_flags::match_not_dot_newline)
+ retval |= boost::lexer::dot_not_newline;
+ if (flags & match_flags::match_icase)
+ retval |= boost::lexer::icase;
+
+ return boost::lexer::regex_flags(retval);
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Lexer, typename F>
+ bool generate_static(Lexer const&
+ , std::basic_ostream<typename Lexer::char_type>&
+ , typename Lexer::char_type const*, F);
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Every lexer type to be used as a lexer for Spirit has to conform to
+ // the following public interface:
+ //
+ // typedefs:
+ // iterator_type The type of the iterator exposed by this lexer.
+ // token_type The type of the tokens returned from the exposed
+ // iterators.
+ //
+ // functions:
+ // default constructor
+ // Since lexers are instantiated as base classes
+ // only it might be a good idea to make this
+ // constructor protected.
+ // begin, end Return a pair of iterators, when dereferenced
+ // returning the sequence of tokens recognized in
+ // the input stream given as the parameters to the
+ // begin() function.
+ // add_token Should add the definition of a token to be
+ // recognized by this lexer.
+ // clear Should delete all current token definitions
+ // associated with the given state of this lexer
+ // object.
+ //
+ // template parameters:
+ // Iterator The type of the iterator used to access the
+ // underlying character stream.
+ // Token The type of the tokens to be returned from the
+ // exposed token iterator.
+ // Functor The type of the InputPolicy to use to instantiate
+ // the multi_pass iterator type to be used as the
+ // token iterator (returned from begin()/end()).
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The lexer class is a implementation of a Spirit.Lex lexer on
+ // top of Ben Hanson's lexertl library as outlined above (For more
+ // information about lexertl go here: http://www.benhanson.net/lexertl.html).
+ //
+ // This class is supposed to be used as the first and only template
+ // parameter while instantiating instances of a lex::lexer class.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Token = token<>
+ , typename Iterator = typename Token::iterator_type
+ , typename Functor = functor<Token, lexertl::detail::data, Iterator> >
+ class lexer
+ {
+ private:
+ struct dummy { void true_() {} };
+ typedef void (dummy::*safe_bool)();
+
+ static std::size_t const all_states_id = static_cast<std::size_t>(-2);
+
+ public:
+ operator safe_bool() const
+ { return initialized_dfa_ ? &dummy::true_ : 0; }
+
+ typedef typename boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+ typedef std::basic_string<char_type> string_type;
+
+ typedef boost::lexer::basic_rules<char_type> basic_rules_type;
+
+ // Every lexer type to be used as a lexer for Spirit has to conform to
+ // a public interface .
+ typedef Token token_type;
+ typedef typename Token::id_type id_type;
+ typedef iterator<Functor> iterator_type;
+
+ private:
+ // this type is purely used for the iterator_type construction below
+ struct iterator_data_type
+ {
+ typedef typename Functor::semantic_actions_type semantic_actions_type;
+
+ iterator_data_type(
+ boost::lexer::basic_state_machine<char_type> const& sm
+ , boost::lexer::basic_rules<char_type> const& rules
+ , semantic_actions_type const& actions)
+ : state_machine_(sm), rules_(rules), actions_(actions)
+ {}
+
+ boost::lexer::basic_state_machine<char_type> const& state_machine_;
+ boost::lexer::basic_rules<char_type> const& rules_;
+ semantic_actions_type const& actions_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ iterator_data_type& operator= (iterator_data_type const&);
+ };
+
+ public:
+ // Return the start iterator usable for iterating over the generated
+ // tokens.
+ iterator_type begin(Iterator& first, Iterator const& last
+ , char_type const* initial_state = 0) const
+ {
+ if (!init_dfa()) // never minimize DFA for dynamic lexers
+ return iterator_type();
+
+ iterator_data_type iterator_data(state_machine_, rules_, actions_);
+ return iterator_type(iterator_data, first, last, initial_state);
+ }
+
+ // Return the end iterator usable to stop iterating over the generated
+ // tokens.
+ iterator_type end() const
+ {
+ return iterator_type();
+ }
+
+ protected:
+ // Lexer instances can be created by means of a derived class only.
+ lexer(unsigned int flags)
+ : flags_(detail::map_flags(flags))
+ , rules_(flags_)
+ , initialized_dfa_(false)
+ {}
+
+ public:
+ // interface for token definition management
+ std::size_t add_token(char_type const* state, char_type tokendef,
+ std::size_t token_id, char_type const* targetstate)
+ {
+ add_state(state);
+ initialized_dfa_ = false;
+ if (state == all_states())
+ return rules_.add(state, detail::escape(tokendef), token_id, rules_.dot());
+
+ if (0 == targetstate)
+ targetstate = state;
+ else
+ add_state(targetstate);
+ return rules_.add(state, detail::escape(tokendef), token_id, targetstate);
+ }
+ std::size_t add_token(char_type const* state, string_type const& tokendef,
+ std::size_t token_id, char_type const* targetstate)
+ {
+ add_state(state);
+ initialized_dfa_ = false;
+ if (state == all_states())
+ return rules_.add(state, tokendef, token_id, rules_.dot());
+
+ if (0 == targetstate)
+ targetstate = state;
+ else
+ add_state(targetstate);
+ return rules_.add(state, tokendef, token_id, targetstate);
+ }
+
+ // interface for pattern definition management
+ void add_pattern (char_type const* state, string_type const& name,
+ string_type const& patterndef)
+ {
+ add_state(state);
+ rules_.add_macro(name.c_str(), patterndef);
+ initialized_dfa_ = false;
+ }
+
+ boost::lexer::rules const& get_rules() const { return rules_; }
+
+ void clear(char_type const* state)
+ {
+ std::size_t s = rules_.state(state);
+ if (boost::lexer::npos != s)
+ rules_.clear(state);
+ initialized_dfa_ = false;
+ }
+ std::size_t add_state(char_type const* state)
+ {
+ if (state == all_states())
+ return all_states_id;
+
+ std::size_t stateid = rules_.state(state);
+ if (boost::lexer::npos == stateid) {
+ stateid = rules_.add_state(state);
+ initialized_dfa_ = false;
+ }
+ return stateid;
+ }
+ string_type initial_state() const
+ {
+ return string_type(rules_.initial());
+ }
+ string_type all_states() const
+ {
+ return string_type(rules_.all_states());
+ }
+
+ // Register a semantic action with the given id
+ template <typename F>
+ void add_action(std::size_t unique_id, std::size_t state, F act)
+ {
+ // If you see an error here stating add_action is not a member of
+ // fusion::unused_type then you are probably having semantic actions
+ // attached to at least one token in the lexer definition without
+ // using the lex::lexertl::actor_lexer<> as its base class.
+ typedef typename Functor::wrap_action_type wrapper_type;
+ if (state == all_states_id) {
+ // add the action to all known states
+ typedef typename
+ basic_rules_type::string_size_t_map::value_type
+ state_type;
+
+ std::size_t states = rules_.statemap().size();
+ BOOST_FOREACH(state_type const& s, rules_.statemap()) {
+ for (std::size_t j = 0; j < states; ++j)
+ actions_.add_action(unique_id + j, s.second, wrapper_type::call(act));
+ }
+ }
+ else {
+ actions_.add_action(unique_id, state, wrapper_type::call(act));
+ }
+ }
+// template <typename F>
+// void add_action(std::size_t unique_id, char_type const* state, F act)
+// {
+// typedef typename Functor::wrap_action_type wrapper_type;
+// actions_.add_action(unique_id, add_state(state), wrapper_type::call(act));
+// }
+
+ // We do not minimize the state machine by default anymore because
+ // Ben said: "If you can afford to generate a lexer at runtime, there
+ // is little point in calling minimise."
+ // Go figure.
+ bool init_dfa(bool minimize = false) const
+ {
+ if (!initialized_dfa_) {
+ state_machine_.clear();
+ typedef boost::lexer::basic_generator<char_type> generator;
+ generator::build (rules_, state_machine_);
+ if (minimize)
+ generator::minimise (state_machine_);
+
+#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
+ boost::lexer::debug::dump(state_machine_, std::cerr);
+#endif
+ initialized_dfa_ = true;
+
+// // release memory held by rules description
+// basic_rules_type rules;
+// rules.init_state_info(rules_); // preserve states
+// std::swap(rules, rules_);
+ }
+ return true;
+ }
+
+ private:
+ // lexertl specific data
+ mutable boost::lexer::basic_state_machine<char_type> state_machine_;
+ boost::lexer::regex_flags flags_;
+ /*mutable*/ basic_rules_type rules_;
+
+ typename Functor::semantic_actions_type actions_;
+ mutable bool initialized_dfa_;
+
+ // generator functions must be able to access members directly
+ template <typename Lexer, typename F>
+ friend bool generate_static(Lexer const&
+ , std::basic_ostream<typename Lexer::char_type>&
+ , typename Lexer::char_type const*, F);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The actor_lexer class is another implementation of a Spirit.Lex
+ // lexer on top of Ben Hanson's lexertl library as outlined above (For
+ // more information about lexertl go here:
+ // http://www.benhanson.net/lexertl.html).
+ //
+ // The only difference to the lexer class above is that token_def
+ // definitions may have semantic (lexer) actions attached while being
+ // defined:
+ //
+ // int w;
+ // token_def word = "[^ \t\n]+";
+ // self = word[++ref(w)]; // see example: word_count_lexer
+ //
+ // This class is supposed to be used as the first and only template
+ // parameter while instantiating instances of a lex::lexer class.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Token = token<>
+ , typename Iterator = typename Token::iterator_type
+ , typename Functor = functor<Token, lexertl::detail::data, Iterator, mpl::true_> >
+ class actor_lexer : public lexer<Token, Iterator, Functor>
+ {
+ protected:
+ // Lexer instances can be created by means of a derived class only.
+ actor_lexer(unsigned int flags)
+ : lexer<Token, Iterator, Functor>(flags) {}
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/position_token.hpp b/boost/spirit/home/lex/lexer/lexertl/position_token.hpp
new file mode 100644
index 0000000000..025cf55d6a
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/position_token.hpp
@@ -0,0 +1,934 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_POSITION_TOKEN_MAY_13_2011_0846PM)
+#define BOOST_SPIRIT_LEX_POSITION_TOKEN_MAY_13_2011_0846PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/detail/lexer/generator.hpp>
+#include <boost/spirit/home/support/detail/lexer/rules.hpp>
+#include <boost/spirit/home/support/detail/lexer/consts.hpp>
+#include <boost/spirit/home/support/utree/utree_traits_fwd.hpp>
+#include <boost/spirit/home/lex/lexer/terminals.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/value_at.hpp>
+#include <boost/detail/iterator.hpp>
+#include <boost/variant.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/range/iterator_range.hpp>
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+#include <boost/static_assert.hpp>
+#endif
+
+#if defined(BOOST_SPIRIT_DEBUG)
+#include <iosfwd>
+#endif
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The position_token is the type of the objects returned by the
+ // iterator if it has been specified while instantiating the lexer object.
+ //
+ // template parameters:
+ // Iterator The type of the iterator used to access the
+ // underlying character stream.
+ // AttributeTypes A mpl sequence containing the types of all
+ // required different token values to be supported
+ // by this token type.
+ // HasState A mpl::bool_ indicating, whether this token type
+ // should support lexer states.
+ // Idtype The type to use for the token id (defaults to
+ // std::size_t).
+ //
+ // It is possible to use other token types with the spirit::lex
+ // framework as well. If you plan to use a different type as your token
+ // type, you'll need to expose the following things from your token type
+ // to make it compatible with spirit::lex:
+ //
+ // typedefs
+ // iterator_type The type of the iterator used to access the
+ // underlying character stream.
+ //
+ // id_type The type of the token id used.
+ //
+ // methods
+ // default constructor
+ // This should initialize the token as an end of
+ // input token.
+ // constructors The prototype of the other required
+ // constructors should be:
+ //
+ // token(int)
+ // This constructor should initialize the token as
+ // an invalid token (not carrying any specific
+ // values)
+ //
+ // where: the int is used as a tag only and its value is
+ // ignored
+ //
+ // and:
+ //
+ // token(Idtype id, std::size_t state,
+ // iterator_type first, iterator_type last);
+ //
+ // where: id: token id
+ // state: lexer state this token was matched in
+ // first, last: pair of iterators marking the matched
+ // range in the underlying input stream
+ //
+ // accessors
+ // id() return the token id of the matched input sequence
+ // id(newid) set the token id of the token instance
+ //
+ // state() return the lexer state this token was matched in
+ //
+ // value() return the token value
+ //
+ // Additionally, you will have to implement a couple of helper functions
+ // in the same namespace as the token type: a comparison operator==() to
+ // compare your token instances, a token_is_valid() function and different
+ // specializations of the Spirit customization point
+ // assign_to_attribute_from_value as shown below.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator = char const*
+ , typename AttributeTypes = mpl::vector0<>
+ , typename HasState = mpl::true_
+ , typename Idtype = std::size_t>
+ struct position_token;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization of the token type doesn't contain any item data and
+ // doesn't support working with lexer states. Although, like all other
+ // variants of position_token, it carries a pair of iterators marking the
+ // begin and the end of the matched character sequence.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Idtype>
+ struct position_token<Iterator, lex::omit, mpl::false_, Idtype>
+ {
+ typedef Iterator iterator_type;
+ typedef iterator_range<iterator_type> iterpair_type;
+ typedef mpl::false_ has_state;
+ typedef Idtype id_type;
+ typedef unused_type token_value_type;
+
+ // default constructed tokens correspond to EOI tokens
+ position_token()
+ : id_(id_type(boost::lexer::npos)) {}
+
+ // construct an invalid token
+ explicit position_token(int)
+ : id_(id_type(0)) {}
+
+ position_token(id_type id, std::size_t)
+ : id_(id) {}
+
+ position_token(id_type id, std::size_t, token_value_type)
+ : id_(id) {}
+
+ position_token(id_type id, std::size_t, Iterator const& first
+ , Iterator const& last)
+ : id_(id), matched_(first, last) {}
+
+ // this default conversion operator is needed to allow the direct
+ // usage of tokens in conjunction with the primitive parsers defined
+ // in Qi
+ operator id_type() const { return id_; }
+
+ // Retrieve or set the token id of this token instance.
+ id_type id() const { return id_; }
+ void id(id_type newid) { id_ = newid; }
+
+ std::size_t state() const { return 0; } // always '0' (INITIAL state)
+
+ bool is_valid() const
+ {
+ return 0 != id_ && id_type(boost::lexer::npos) != id_;
+ }
+
+ // access the stored iterator range of the matched input sequence
+ iterator_type begin() const { return matched_.begin(); }
+ iterator_type end() const { return matched_.end(); }
+
+ iterpair_type& matched() { return matched_; }
+ iterpair_type const& matched() const { return matched_; }
+
+ token_value_type& value() { static token_value_type u; return u; }
+ token_value_type const& value() const { return unused; }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+ // workaround for MSVC10 which has problems copying a default
+ // constructed iterator_range
+ position_token& operator= (position_token const& rhs)
+ {
+ if (this != &rhs)
+ {
+ id_ = rhs.id_;
+ if (is_valid())
+ matched_ = rhs.matched_;
+ }
+ return *this;
+ }
+#endif
+
+ protected:
+ id_type id_; // token id, 0 if nothing has been matched
+ iterpair_type matched_; // matched input sequence
+ };
+
+#if defined(BOOST_SPIRIT_DEBUG)
+ template <typename Char, typename Traits, typename Iterator
+ , typename AttributeTypes, typename HasState, typename Idtype>
+ inline std::basic_ostream<Char, Traits>&
+ operator<< (std::basic_ostream<Char, Traits>& os
+ , position_token<Iterator, AttributeTypes, HasState, Idtype> const& t)
+ {
+ if (t.is_valid()) {
+ Iterator end = t.end();
+ for (Iterator it = t.begin(); it != end; ++it)
+ os << *it;
+ }
+ else {
+ os << "<invalid token>";
+ }
+ return os;
+ }
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization of the token type doesn't contain any item data but
+ // supports working with lexer states.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Idtype>
+ struct position_token<Iterator, lex::omit, mpl::true_, Idtype>
+ : position_token<Iterator, lex::omit, mpl::false_, Idtype>
+ {
+ private:
+ typedef position_token<Iterator, lex::omit, mpl::false_, Idtype>
+ base_type;
+
+ public:
+ typedef typename base_type::id_type id_type;
+ typedef Iterator iterator_type;
+ typedef mpl::true_ has_state;
+ typedef unused_type token_value_type;
+
+ // default constructed tokens correspond to EOI tokens
+ position_token() : state_(boost::lexer::npos) {}
+
+ // construct an invalid token
+ explicit position_token(int)
+ : base_type(0), state_(boost::lexer::npos) {}
+
+ position_token(id_type id, std::size_t state)
+ : base_type(id, boost::lexer::npos), state_(state) {}
+
+ position_token(id_type id, std::size_t state, token_value_type)
+ : base_type(id, boost::lexer::npos, unused)
+ , state_(state) {}
+
+ position_token(id_type id, std::size_t state
+ , Iterator const& first, Iterator const& last)
+ : base_type(id, boost::lexer::npos, first, last)
+ , state_(state) {}
+
+ std::size_t state() const { return state_; }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+ // workaround for MSVC10 which has problems copying a default
+ // constructed iterator_range
+ position_token& operator= (position_token const& rhs)
+ {
+ if (this != &rhs)
+ {
+ this->base_type::operator=(static_cast<base_type const&>(rhs));
+ state_ = rhs.state_;
+ }
+ return *this;
+ }
+#endif
+
+ protected:
+ std::size_t state_; // lexer state this token was matched in
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // These specializations for an empty attribute list cause all token
+ // instances to expose as it attribute the iterator_range pointing to the
+ // matched input sequence.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename HasState, typename Idtype>
+ struct position_token<Iterator, mpl::vector<>, HasState, Idtype>
+ : position_token<Iterator, lex::omit, HasState, Idtype>
+ {
+ private:
+ typedef position_token<Iterator, lex::omit, HasState, Idtype> base_type;
+
+ public:
+ typedef typename base_type::id_type id_type;
+ typedef typename base_type::iterator_type iterator_type;
+ typedef typename base_type::iterpair_type iterpair_type;
+ typedef HasState has_state;
+ typedef iterpair_type token_value_type;
+
+ // default constructed tokens correspond to EOI tokens
+ position_token() {}
+
+ // construct an invalid token
+ explicit position_token(int)
+ : base_type(0) {}
+
+ position_token(id_type id, std::size_t state)
+ : base_type(id, state) {}
+
+ position_token(id_type id, std::size_t state, token_value_type)
+ : base_type(id, state, unused) {}
+
+ position_token(id_type id, std::size_t state
+ , Iterator const& first, Iterator const& last)
+ : base_type(id, state, first, last) {}
+
+ token_value_type& value() { return this->base_type::matched(); }
+ token_value_type const& value() const { return this->base_type::matched(); }
+ };
+
+ template <typename Iterator, typename HasState, typename Idtype>
+ struct position_token<Iterator, mpl::vector0<>, HasState, Idtype>
+ : position_token<Iterator, lex::omit, HasState, Idtype>
+ {
+ private:
+ typedef position_token<Iterator, lex::omit, HasState, Idtype> base_type;
+
+ public:
+ typedef typename base_type::id_type id_type;
+ typedef typename base_type::iterator_type iterator_type;
+ typedef typename base_type::iterpair_type iterpair_type;
+ typedef HasState has_state;
+ typedef iterpair_type token_value_type;
+
+ // default constructed tokens correspond to EOI tokens
+ position_token() {}
+
+ // construct an invalid token
+ explicit position_token(int)
+ : base_type(0) {}
+
+ position_token(id_type id, std::size_t state)
+ : base_type(id, state) {}
+
+ position_token(id_type id, std::size_t state, token_value_type)
+ : base_type(id, state, unused) {}
+
+ position_token(id_type id, std::size_t state
+ , Iterator const& first, Iterator const& last)
+ : base_type(id, state, first, last) {}
+
+ token_value_type& value() { return this->base_type::matched(); }
+ token_value_type const& value() const { return this->base_type::matched(); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // These specializations for an attribute list of length one cause all token
+ // instances to expose the specified type as its attribute.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Attribute, typename HasState
+ , typename Idtype>
+ struct position_token<Iterator, mpl::vector<Attribute>, HasState, Idtype>
+ : position_token<Iterator, lex::omit, HasState, Idtype>
+ {
+ private:
+ typedef position_token<Iterator, lex::omit, HasState, Idtype> base_type;
+
+ public:
+ typedef typename base_type::id_type id_type;
+ typedef typename base_type::iterator_type iterator_type;
+ typedef typename base_type::iterpair_type iterpair_type;
+ typedef HasState has_state;
+ typedef boost::optional<Attribute> token_value_type;
+
+ // default constructed tokens correspond to EOI tokens
+ position_token() {}
+
+ // construct an invalid token
+ explicit position_token(int)
+ : base_type(0) {}
+
+ position_token(id_type id, std::size_t state)
+ : base_type(id, state) {}
+
+ position_token(id_type id, std::size_t state, token_value_type const& v)
+ : base_type(id, state, unused), value_(v) {}
+
+ position_token(id_type id, std::size_t state
+ , Iterator const& first, Iterator const& last)
+ : base_type(id, state, first, last) {}
+
+ token_value_type& value() { return value_; }
+ token_value_type const& value() const { return value_; }
+
+ bool has_value() const { return value_; }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+ // workaround for MSVC10 which has problems copying a default
+ // constructed iterator_range
+ position_token& operator= (position_token const& rhs)
+ {
+ if (this != &rhs)
+ {
+ this->base_type::operator=(static_cast<base_type const&>(rhs));
+ if (this->is_valid())
+ value_ = rhs.value_;
+ }
+ return *this;
+ }
+#endif
+
+ protected:
+ token_value_type value_; // token value
+ };
+
+ template <typename Iterator, typename Attribute, typename HasState
+ , typename Idtype>
+ struct position_token<Iterator, mpl::vector1<Attribute>, HasState, Idtype>
+ : position_token<Iterator, lex::omit, HasState, Idtype>
+ {
+ private:
+ typedef position_token<Iterator, lex::omit, HasState, Idtype> base_type;
+
+ public:
+ typedef typename base_type::id_type id_type;
+ typedef typename base_type::iterator_type iterator_type;
+ typedef typename base_type::iterpair_type iterpair_type;
+ typedef HasState has_state;
+ typedef boost::optional<Attribute> token_value_type;
+
+ // default constructed tokens correspond to EOI tokens
+ position_token() {}
+
+ // construct an invalid token
+ explicit position_token(int)
+ : base_type(0) {}
+
+ position_token(id_type id, std::size_t state)
+ : base_type(id, state) {}
+
+ position_token(id_type id, std::size_t state, token_value_type const& v)
+ : base_type(id, state, unused), value_(v) {}
+
+ position_token(id_type id, std::size_t state
+ , Iterator const& first, Iterator const& last)
+ : base_type(id, state, first, last) {}
+
+ token_value_type& value() { return value_; }
+ token_value_type const& value() const { return value_; }
+
+ bool has_value() const { return value_; }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+ // workaround for MSVC10 which has problems copying a default
+ // constructed iterator_range
+ position_token& operator= (position_token const& rhs)
+ {
+ if (this != &rhs)
+ {
+ this->base_type::operator=(static_cast<base_type const&>(rhs));
+ if (this->is_valid())
+ value_ = rhs.value_;
+ }
+ return *this;
+ }
+#endif
+
+ protected:
+ token_value_type value_; // token value
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The generic version of the position_token type derives from the
+ // specialization above and adds a single data member holding the item
+ // data carried by the token instance.
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // Meta-function to calculate the type of the variant data item to be
+ // stored with each token instance.
+ //
+ // Note: The iterator pair needs to be the first type in the list of
+ // types supported by the generated variant type (this is being
+ // used to identify whether the stored data item in a particular
+ // token instance needs to be converted from the pair of
+ // iterators (see the first of the assign_to_attribute_from_value
+ // specializations below).
+ ///////////////////////////////////////////////////////////////////////
+ template <typename IteratorPair, typename AttributeTypes>
+ struct position_token_value_typesequence
+ {
+ typedef typename mpl::insert<
+ AttributeTypes
+ , typename mpl::begin<AttributeTypes>::type
+ , IteratorPair
+ >::type sequence_type;
+ typedef typename make_variant_over<sequence_type>::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // The type of the data item stored with a token instance is defined
+ // by the template parameter 'AttributeTypes' and may be:
+ //
+ // lex::omit: no data item is stored with the token
+ // instance (this is handled by the
+ // specializations of the token class
+ // below)
+ // mpl::vector0<>: each token instance stores a pair of
+ // iterators pointing to the matched input
+ // sequence
+ // mpl::vector<...>: each token instance stores a variant being
+ // able to store the pair of iterators pointing
+ // to the matched input sequence, or any of the
+ // types a specified in the mpl::vector<>
+ //
+ // All this is done to ensure the token type is as small (in terms
+ // of its byte-size) as possible.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename IteratorPair, typename AttributeTypes>
+ struct position_token_value
+ : mpl::eval_if<
+ mpl::or_<
+ is_same<AttributeTypes, mpl::vector0<> >
+ , is_same<AttributeTypes, mpl::vector<> > >
+ , mpl::identity<IteratorPair>
+ , position_token_value_typesequence<IteratorPair, AttributeTypes> >
+ {};
+ }
+
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype>
+ struct position_token
+ : position_token<Iterator, lex::omit, HasState, Idtype>
+ {
+ private: // precondition assertions
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+ BOOST_STATIC_ASSERT((mpl::is_sequence<AttributeTypes>::value ||
+ is_same<AttributeTypes, lex::omit>::value));
+#endif
+ typedef position_token<Iterator, lex::omit, HasState, Idtype>
+ base_type;
+
+ protected:
+ // If no additional token value types are given, the the token will
+ // hold no token value at all as the base class already has the
+ // iterator pair of the matched range in the underlying input sequence.
+ // Otherwise the token value is stored as a variant and will
+ // initially hold an unused_type but is able to hold any of
+ // the given data types as well. The conversion from the iterator pair
+ // to the required data type is done when it is accessed for the first
+ // time.
+ typedef iterator_range<Iterator> iterpair_type;
+
+ public:
+ typedef typename base_type::id_type id_type;
+ typedef typename detail::position_token_value<
+ iterpair_type, AttributeTypes>::type token_value_type;
+
+ typedef Iterator iterator_type;
+
+ // default constructed tokens correspond to EOI tokens
+ position_token() {}
+
+ // construct an invalid token
+ explicit position_token(int)
+ : base_type(0) {}
+
+ position_token(id_type id, std::size_t state, token_value_type const& value)
+ : base_type(id, state, value), value_(value) {}
+
+ position_token(id_type id, std::size_t state, Iterator const& first
+ , Iterator const& last)
+ : base_type(id, state, first, last)
+ , value_(iterpair_type(first, last))
+ {}
+
+ token_value_type& value() { return value_; }
+ token_value_type const& value() const { return value_; }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+ // workaround for MSVC10 which has problems copying a default
+ // constructed iterator_range
+ position_token& operator= (position_token const& rhs)
+ {
+ if (this != &rhs)
+ {
+ this->base_type::operator=(static_cast<base_type const&>(rhs));
+ if (this->is_valid())
+ value_ = rhs.value_;
+ }
+ return *this;
+ }
+#endif
+
+ protected:
+ token_value_type value_; // token value, by default a pair of iterators
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // tokens are considered equal, if their id's match (these are unique)
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype>
+ inline bool
+ operator== (position_token<Iterator, AttributeTypes, HasState, Idtype> const& lhs,
+ position_token<Iterator, AttributeTypes, HasState, Idtype> const& rhs)
+ {
+ return lhs.id() == rhs.id();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This overload is needed by the multi_pass/functor_input_policy to
+ // validate a token instance. It has to be defined in the same namespace
+ // as the token class itself to allow ADL to find it.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype>
+ inline bool
+ token_is_valid(position_token<Iterator, AttributeTypes, HasState, Idtype> const& t)
+ {
+ return t.is_valid();
+ }
+}}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // We have to provide specializations for the customization point
+ // assign_to_attribute_from_value allowing to extract the needed value
+ // from the token.
+ ///////////////////////////////////////////////////////////////////////////
+
+ // This is called from the parse function of token_def if the token_def
+ // has been defined to carry a special attribute type
+ template <typename Attribute, typename Iterator, typename AttributeTypes
+ , typename HasState, typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, AttributeTypes, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::position_token<
+ Iterator, AttributeTypes, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // The goal of this function is to avoid the conversion of the pair of
+ // iterators (to the matched character sequence) into the token value
+ // of the required type being done more than once. For this purpose it
+ // checks whether the stored value type is still the default one (pair
+ // of iterators) and if yes, replaces the pair of iterators with the
+ // converted value to be returned from subsequent calls.
+
+ if (0 == t.value().which()) {
+ // first access to the token value
+ typedef iterator_range<Iterator> iterpair_type;
+ iterpair_type const& ip = t.matched();
+
+ // Interestingly enough we use the assign_to() framework defined in
+ // Spirit.Qi allowing to convert the pair of iterators to almost any
+ // required type (assign_to(), if available, uses the standard Spirit
+ // parsers to do the conversion).
+ spirit::traits::assign_to(ip.begin(), ip.end(), attr);
+
+ // If you get an error during the compilation of the following
+ // assignment expression, you probably forgot to list one or more
+ // types used as token value types (in your token_def<...>
+ // definitions) in your definition of the token class. I.e. any token
+ // value type used for a token_def<...> definition has to be listed
+ // during the declaration of the token type to use. For instance let's
+ // assume we have two token_def's:
+ //
+ // token_def<int> number; number = "...";
+ // token_def<std::string> identifier; identifier = "...";
+ //
+ // Then you'll have to use the following token type definition
+ // (assuming you are using the token class):
+ //
+ // typedef mpl::vector<int, std::string> token_values;
+ // typedef token<base_iter_type, token_values> token_type;
+ //
+ // where: base_iter_type is the iterator type used to expose the
+ // underlying input stream.
+ //
+ // This token_type has to be used as the second template parameter
+ // to the lexer class:
+ //
+ // typedef lexer<base_iter_type, token_type> lexer_type;
+ //
+ // again, assuming you're using the lexer<> template for your
+ // tokenization.
+
+ typedef lex::lexertl::position_token<
+ Iterator, AttributeTypes, HasState, Idtype> token_type;
+ spirit::traits::assign_to(
+ attr, const_cast<token_type&>(t).value()); // re-assign value
+ }
+ else {
+ // reuse the already assigned value
+ spirit::traits::assign_to(get<Attribute>(t.value()), attr);
+ }
+ }
+ };
+
+ template <typename Attribute, typename Iterator, typename AttributeTypes
+ , typename HasState, typename Idtype>
+ struct assign_to_container_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, AttributeTypes, HasState, Idtype> >
+ : assign_to_attribute_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, AttributeTypes, HasState, Idtype> >
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // These are called from the parse function of token_def if the token type
+ // has no special attribute type assigned
+ template <typename Attribute, typename Iterator, typename HasState
+ , typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, mpl::vector0<>, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::position_token<
+ Iterator, mpl::vector0<>, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // The default type returned by the token_def parser component (if
+ // it has no token value type assigned) is the pair of iterators
+ // to the matched character sequence.
+ spirit::traits::assign_to(t.begin(), t.end(), attr);
+ }
+ };
+
+// template <typename Attribute, typename Iterator, typename HasState
+// , typename Idtype>
+// struct assign_to_container_from_value<Attribute
+// , lex::lexertl::position_token<Iterator, mpl::vector0<>, HasState, Idtype> >
+// : assign_to_attribute_from_value<Attribute
+// , lex::lexertl::position_token<Iterator, mpl::vector0<>, HasState, Idtype> >
+// {};
+
+ // same as above but using mpl::vector<> instead of mpl::vector0<>
+ template <typename Attribute, typename Iterator, typename HasState
+ , typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, mpl::vector<>, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::position_token<
+ Iterator, mpl::vector<>, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // The default type returned by the token_def parser component (if
+ // it has no token value type assigned) is the pair of iterators
+ // to the matched character sequence.
+ spirit::traits::assign_to(t.begin(), t.end(), attr);
+ }
+ };
+
+// template <typename Attribute, typename Iterator, typename HasState
+// , typename Idtype>
+// struct assign_to_container_from_value<Attribute
+// , lex::lexertl::position_token<Iterator, mpl::vector<>, HasState, Idtype> >
+// : assign_to_attribute_from_value<Attribute
+// , lex::lexertl::position_token<Iterator, mpl::vector<>, HasState, Idtype> >
+// {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // These are called from the parse function of token_def if the token type
+ // has no special attribute type assigned
+ template <typename Attribute, typename Iterator, typename Attr
+ , typename HasState, typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, mpl::vector1<Attr>, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::position_token<
+ Iterator, mpl::vector1<Attr>, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // The goal of this function is to avoid the conversion of the pair of
+ // iterators (to the matched character sequence) into the token value
+ // of the required type being done more than once.
+
+ if (!t.has_value()) {
+ // first access to the token value
+ typedef iterator_range<Iterator> iterpair_type;
+ iterpair_type const& ip = t.matched();
+
+ // Interestingly enough we use the assign_to() framework defined in
+ // Spirit.Qi allowing to convert the pair of iterators to almost any
+ // required type (assign_to(), if available, uses the standard Spirit
+ // parsers to do the conversion).
+ spirit::traits::assign_to(ip.begin(), ip.end(), attr);
+
+ // Re-assign the attribute to the stored value
+ typedef lex::lexertl::position_token<
+ Iterator, mpl::vector1<Attr>, HasState, Idtype> token_type;
+ spirit::traits::assign_to(
+ attr, const_cast<token_type&>(t).value());
+ }
+ else {
+ // reuse the already assigned value
+ spirit::traits::assign_to(t.value(), attr);
+ }
+ }
+ };
+
+// template <typename Attribute, typename Iterator, typename Attr
+// , typename HasState, typename Idtype>
+// struct assign_to_container_from_value<Attribute
+// , lex::lexertl::position_token<Iterator, mpl::vector1<Attr>, HasState, Idtype> >
+// : assign_to_attribute_from_value<Attribute
+// , lex::lexertl::position_token<Iterator, mpl::vector1<Attr>, HasState, Idtype> >
+// {};
+
+ // same as above but using mpl::vector<Attr> instead of mpl::vector1<Attr>
+ template <typename Attribute, typename Iterator, typename Attr
+ , typename HasState, typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, mpl::vector<Attr>, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::position_token<
+ Iterator, mpl::vector<Attr>, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // The goal of this function is to avoid the conversion of the pair of
+ // iterators (to the matched character sequence) into the token value
+ // of the required type being done more than once.
+
+ if (!t.has_value()) {
+ // first access to the token value
+ typedef iterator_range<Iterator> iterpair_type;
+ iterpair_type const& ip = t.matched();
+
+ // Interestingly enough we use the assign_to() framework defined in
+ // Spirit.Qi allowing to convert the pair of iterators to almost any
+ // required type (assign_to(), if available, uses the standard Spirit
+ // parsers to do the conversion).
+ spirit::traits::assign_to(ip.begin(), ip.end(), attr);
+
+ // Re-assign the attribute to the stored value
+ typedef lex::lexertl::position_token<
+ Iterator, mpl::vector<Attr>, HasState, Idtype> token_type;
+ spirit::traits::assign_to(
+ attr, const_cast<token_type&>(t).value());
+ }
+ else {
+ // reuse the already assigned value
+ spirit::traits::assign_to(t.value(), attr);
+ }
+ }
+ };
+
+// template <typename Attribute, typename Iterator, typename Attr
+// , typename HasState, typename Idtype>
+// struct assign_to_container_from_value<Attribute
+// , lex::lexertl::position_token<Iterator, mpl::vector<Attr>, HasState, Idtype> >
+// : assign_to_attribute_from_value<Attribute
+// , lex::lexertl::position_token<Iterator, mpl::vector<Attr>, HasState, Idtype> >
+// {};
+
+ // This is called from the parse function of token_def if the token type
+ // has been explicitly omitted (i.e. no attribute value is used), which
+ // essentially means that every attribute gets initialized using default
+ // constructed values.
+ template <typename Attribute, typename Iterator, typename HasState
+ , typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, lex::omit, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::position_token<Iterator, lex::omit, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // do nothing
+ }
+ };
+
+ template <typename Attribute, typename Iterator, typename HasState
+ , typename Idtype>
+ struct assign_to_container_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, lex::omit, HasState, Idtype> >
+ : assign_to_attribute_from_value<Attribute
+ , lex::lexertl::position_token<Iterator, lex::omit, HasState, Idtype> >
+ {};
+
+ // This is called from the parse function of lexer_def_
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype_, typename Idtype>
+ struct assign_to_attribute_from_value<
+ fusion::vector2<Idtype_, iterator_range<Iterator> >
+ , lex::lexertl::position_token<Iterator, AttributeTypes, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::position_token<Iterator, AttributeTypes, HasState, Idtype> const& t
+ , fusion::vector2<Idtype_, iterator_range<Iterator> >& attr)
+ {
+ // The type returned by the lexer_def_ parser components is a
+ // fusion::vector containing the token id of the matched token
+ // and the pair of iterators to the matched character sequence.
+ typedef iterator_range<Iterator> iterpair_type;
+ typedef fusion::vector2<Idtype_, iterator_range<Iterator> >
+ attribute_type;
+
+ iterpair_type const& ip = t.matched();
+ attr = attribute_type(t.id(), ip);
+ }
+ };
+
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype_, typename Idtype>
+ struct assign_to_container_from_value<
+ fusion::vector2<Idtype_, iterator_range<Iterator> >
+ , lex::lexertl::position_token<Iterator, AttributeTypes, HasState, Idtype> >
+ : assign_to_attribute_from_value<
+ fusion::vector2<Idtype_, iterator_range<Iterator> >
+ , lex::lexertl::position_token<Iterator, AttributeTypes, HasState, Idtype> >
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Overload debug output for a single token, this integrates lexer tokens
+ // with Qi's simple_trace debug facilities
+ template <typename Iterator, typename Attribute, typename HasState
+ , typename Idtype>
+ struct token_printer_debug<
+ lex::lexertl::position_token<Iterator, Attribute, HasState, Idtype> >
+ {
+ typedef lex::lexertl::position_token<Iterator, Attribute, HasState, Idtype> token_type;
+
+ template <typename Out>
+ static void print(Out& out, token_type const& val)
+ {
+ out << '[';
+ spirit::traits::print_token(out, val.value());
+ out << ']';
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/semantic_action_data.hpp b/boost/spirit/home/lex/lexer/lexertl/semantic_action_data.hpp
new file mode 100644
index 0000000000..30748c574d
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/semantic_action_data.hpp
@@ -0,0 +1,121 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXER_SEMANTIC_ACTION_DATA_JUN_10_2009_0417PM)
+#define BOOST_SPIRIT_LEX_LEXER_SEMANTIC_ACTION_DATA_JUN_10_2009_0417PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer/pass_flags.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/function.hpp>
+#include <vector>
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename SupportsState, typename Data>
+ struct semantic_actions;
+
+ // This specialization of semantic_actions will be used if the token
+ // type (lexer definition) does not support states, which simplifies
+ // the data structures used to store the semantic action function
+ // objects.
+ template <typename Iterator, typename Data>
+ struct semantic_actions<Iterator, mpl::false_, Data>
+ {
+ typedef void functor_type(Iterator&, Iterator&
+ , BOOST_SCOPED_ENUM(pass_flags)&, std::size_t&, Data&);
+ typedef boost::function<functor_type> functor_wrapper_type;
+
+ // add a semantic action function object
+ template <typename F>
+ void add_action(std::size_t unique_id, std::size_t, F act)
+ {
+ if (actions_.size() <= unique_id)
+ actions_.resize(unique_id + 1);
+
+ actions_[unique_id] = act;
+ }
+
+ // try to invoke a semantic action for the given token (unique_id)
+ BOOST_SCOPED_ENUM(pass_flags) invoke_actions(std::size_t /*state*/
+ , std::size_t& id, std::size_t unique_id, Iterator& end
+ , Data& data) const
+ {
+ // if there is nothing to invoke, continue with 'match'
+ if (unique_id >= actions_.size() || !actions_[unique_id])
+ return pass_flags::pass_normal;
+
+ // Note: all arguments might be changed by the invoked semantic
+ // action
+ BOOST_SCOPED_ENUM(pass_flags) match = pass_flags::pass_normal;
+ actions_[unique_id](data.get_first(), end, match, id, data);
+ return match;
+ }
+
+ std::vector<functor_wrapper_type> actions_;
+ };
+
+ // This specialization of semantic_actions will be used if the token
+ // type (lexer definition) needs to support states, resulting in a more
+ // complex data structure needed for storing the semantic action
+ // function objects.
+ template <typename Iterator, typename Data>
+ struct semantic_actions<Iterator, mpl::true_, Data>
+ {
+ typedef void functor_type(Iterator&, Iterator&
+ , BOOST_SCOPED_ENUM(pass_flags)&, std::size_t&, Data&);
+ typedef boost::function<functor_type> functor_wrapper_type;
+
+ // add a semantic action function object
+ template <typename F>
+ void add_action(std::size_t unique_id, std::size_t state, F act)
+ {
+ if (actions_.size() <= state)
+ actions_.resize(state + 1);
+
+ std::vector<functor_wrapper_type>& actions (actions_[state]);
+ if (actions.size() <= unique_id)
+ actions.resize(unique_id + 1);
+
+ actions[unique_id] = act;
+ }
+
+ // try to invoke a semantic action for the given token (unique_id)
+ BOOST_SCOPED_ENUM(pass_flags) invoke_actions(std::size_t state
+ , std::size_t& id, std::size_t unique_id, Iterator& end
+ , Data& data) const
+ {
+ // if there is no action defined for this state, return match
+ if (state >= actions_.size())
+ return pass_flags::pass_normal;
+
+ // if there is nothing to invoke, continue with 'match'
+ std::vector<functor_wrapper_type> const& actions = actions_[state];
+ if (unique_id >= actions.size() || !actions[unique_id])
+ return pass_flags::pass_normal;
+
+ // set token value
+ data.set_end(end);
+
+ // Note: all arguments might be changed by the invoked semantic
+ // action
+ BOOST_SCOPED_ENUM(pass_flags) match = pass_flags::pass_normal;
+ actions[unique_id](data.get_first(), end, match, id, data);
+ return match;
+ }
+
+ std::vector<std::vector<functor_wrapper_type> > actions_;
+ };
+ }
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/static_functor_data.hpp b/boost/spirit/home/lex/lexer/lexertl/static_functor_data.hpp
new file mode 100644
index 0000000000..725f5c8edc
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/static_functor_data.hpp
@@ -0,0 +1,572 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXER_STATIC_FUNCTOR_DATA_FEB_10_2008_0755PM)
+#define BOOST_SPIRIT_LEX_LEXER_STATIC_FUNCTOR_DATA_FEB_10_2008_0755PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/detail/lexer/generator.hpp>
+#include <boost/spirit/home/support/detail/lexer/rules.hpp>
+#include <boost/spirit/home/support/detail/lexer/state_machine.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/semantic_action_data.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Char, typename F>
+ inline std::size_t get_state_id(Char const* state, F f
+ , std::size_t numstates)
+ {
+ for (std::size_t i = 0; i < numstates; ++i)
+ {
+ if (boost::algorithm::equals(f(i), state))
+ return i;
+ }
+ return boost::lexer::npos;
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename HasActors, typename HasState
+ , typename TokenValue>
+ class static_data; // no default specialization
+
+ ///////////////////////////////////////////////////////////////////////
+ // doesn't support no state and no actors
+ template <typename Iterator, typename TokenValue>
+ class static_data<Iterator, mpl::false_, mpl::false_, TokenValue>
+ {
+ protected:
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+
+ public:
+ typedef Iterator base_iterator_type;
+ typedef iterator_range<Iterator> token_value_type;
+ typedef token_value_type get_value_type;
+ typedef std::size_t state_type;
+ typedef char_type const* state_name_type;
+ typedef unused_type semantic_actions_type;
+ typedef detail::wrap_action<unused_type, Iterator, static_data
+ , std::size_t> wrap_action_type;
+
+ typedef std::size_t (*next_token_functor)(std::size_t&,
+ bool&, Iterator&, Iterator const&, std::size_t&);
+ typedef char_type const* (*get_state_name_type)(std::size_t);
+
+ // initialize the shared data
+ template <typename IterData>
+ static_data (IterData const& data, Iterator& first
+ , Iterator const& last)
+ : first_(first), last_(last)
+ , next_token_(data.next_)
+ , get_state_name_(data.get_state_name_)
+ , bol_(data.bol_) {}
+
+ // The following functions are used by the implementation of the
+ // placeholder '_state'.
+ template <typename Char>
+ void set_state_name (Char const*)
+ {
+// some (random) versions of gcc instantiate this function even if it's not
+// needed leading to false static asserts
+#if !defined(__GNUC__)
+ // If you see a compile time assertion below you're probably
+ // using a token type not supporting lexer states (the 3rd
+ // template parameter of the token is mpl::false_), but your
+ // code uses state changes anyways.
+ BOOST_STATIC_ASSERT(false);
+#endif
+ }
+ char_type const* get_state_name() const
+ {
+ return get_state_name_(0);
+ }
+ std::size_t get_state_id(char_type const*) const
+ {
+ return 0;
+ }
+
+ // The function get_eoi() is used by the implementation of the
+ // placeholder '_eoi'.
+ Iterator const& get_eoi() const { return last_; }
+
+ // The function less() is used by the implementation of the support
+ // function lex::less(). Its functionality is equivalent to flex'
+ // function yyless(): it returns an iterator positioned to the
+ // nth input character beyond the current start iterator (i.e. by
+ // assigning the return value to the placeholder '_end' it is
+ // possible to return all but the first n characters of the current
+ // token back to the input stream.
+ //
+ // This function does nothing as long as no semantic actions are
+ // used.
+ Iterator const& less(Iterator const& it, int)
+ {
+ // The following assertion fires most likely because you are
+ // using lexer semantic actions without using the actor_lexer
+ // as the base class for your token definition class.
+ BOOST_ASSERT(false &&
+ "Are you using lexer semantic actions without using the "
+ "actor_lexer base?");
+ return it;
+ }
+
+ // The function more() is used by the implementation of the support
+ // function lex::more(). Its functionality is equivalent to flex'
+ // function yymore(): it tells the lexer that the next time it
+ // matches a rule, the corresponding token should be appended onto
+ // the current token value rather than replacing it.
+ //
+ // These functions do nothing as long as no semantic actions are
+ // used.
+ void more()
+ {
+ // The following assertion fires most likely because you are
+ // using lexer semantic actions without using the actor_lexer
+ // as the base class for your token definition class.
+ BOOST_ASSERT(false &&
+ "Are you using lexer semantic actions without using the "
+ "actor_lexer base?");
+ }
+ bool adjust_start() { return false; }
+ void revert_adjust_start() {}
+
+ // The function lookahead() is used by the implementation of the
+ // support function lex::lookahead. It can be used to implement
+ // lookahead for lexer engines not supporting constructs like flex'
+ // a/b (match a, but only when followed by b):
+ //
+ // This function does nothing as long as no semantic actions are
+ // used.
+ bool lookahead(std::size_t, std::size_t /*state*/ = std::size_t(~0))
+ {
+ // The following assertion fires most likely because you are
+ // using lexer semantic actions without using the actor_lexer
+ // as the base class for your token definition class.
+ BOOST_ASSERT(false &&
+ "Are you using lexer semantic actions without using the "
+ "actor_lexer base?");
+ return false;
+ }
+
+ // the functions next, invoke_actions, and get_state are used by
+ // the functor implementation below
+
+ // The function next() tries to match the next token from the
+ // underlying input sequence.
+ std::size_t next(Iterator& end, std::size_t& unique_id, bool& prev_bol)
+ {
+ prev_bol = bol_;
+
+ std::size_t state = 0;
+ return next_token_(state, bol_, end, last_, unique_id);
+ }
+
+ // nothing to invoke, so this is empty
+ BOOST_SCOPED_ENUM(pass_flags) invoke_actions(std::size_t
+ , std::size_t, std::size_t, Iterator const&)
+ {
+ return pass_flags::pass_normal; // always accept
+ }
+
+ std::size_t get_state() const { return 0; }
+ void set_state(std::size_t) {}
+
+ void set_end(Iterator const& it) {}
+
+ Iterator& get_first() { return first_; }
+ Iterator const& get_first() const { return first_; }
+ Iterator const& get_last() const { return last_; }
+
+ iterator_range<Iterator> get_value() const
+ {
+ return iterator_range<Iterator>(first_, last_);
+ }
+ bool has_value() const { return false; }
+ void reset_value() {}
+
+ void reset_bol(bool bol) { bol_ = bol; }
+
+ protected:
+ Iterator& first_;
+ Iterator last_;
+
+ next_token_functor next_token_;
+ get_state_name_type get_state_name_;
+
+ bool bol_; // helper storing whether last character was \n
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ static_data& operator= (static_data const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // doesn't support lexer semantic actions, but supports state
+ template <typename Iterator, typename TokenValue>
+ class static_data<Iterator, mpl::false_, mpl::true_, TokenValue>
+ : public static_data<Iterator, mpl::false_, mpl::false_, TokenValue>
+ {
+ protected:
+ typedef static_data<Iterator, mpl::false_, mpl::false_, TokenValue> base_type;
+ typedef typename base_type::char_type char_type;
+
+ public:
+ typedef Iterator base_iterator_type;
+ typedef iterator_range<Iterator> token_value_type;
+ typedef token_value_type get_value_type;
+ typedef typename base_type::state_type state_type;
+ typedef typename base_type::state_name_type state_name_type;
+ typedef typename base_type::semantic_actions_type
+ semantic_actions_type;
+
+ // initialize the shared data
+ template <typename IterData>
+ static_data (IterData const& data, Iterator& first
+ , Iterator const& last)
+ : base_type(data, first, last), state_(0)
+ , num_states_(data.num_states_) {}
+
+ // The following functions are used by the implementation of the
+ // placeholder '_state'.
+ void set_state_name (char_type const* new_state)
+ {
+ std::size_t state_id = lexertl::detail::get_state_id(new_state
+ , this->get_state_name_, num_states_);
+
+ // if the following assertion fires you've probably been using
+ // a lexer state name which was not defined in your token
+ // definition
+ BOOST_ASSERT(state_id != boost::lexer::npos);
+
+ if (state_id != boost::lexer::npos)
+ state_ = state_id;
+ }
+ char_type const* get_state_name() const
+ {
+ return this->get_state_name_(state_);
+ }
+ std::size_t get_state_id(char_type const* state) const
+ {
+ return lexertl::detail::get_state_id(state
+ , this->get_state_name_, num_states_);
+ }
+
+ // the functions next() and get_state() are used by the functor
+ // implementation below
+
+ // The function next() tries to match the next token from the
+ // underlying input sequence.
+ std::size_t next(Iterator& end, std::size_t& unique_id, bool& prev_bol)
+ {
+ prev_bol = this->bol_;
+ return this->next_token_(state_, this->bol_, end, this->last_
+ , unique_id);
+ }
+
+ std::size_t& get_state() { return state_; }
+ void set_state(std::size_t state) { state_ = state; }
+
+ protected:
+ std::size_t state_;
+ std::size_t num_states_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ static_data& operator= (static_data const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // does support actors, but may have no state
+ template <typename Iterator, typename HasState, typename TokenValue>
+ class static_data<Iterator, mpl::true_, HasState, TokenValue>
+ : public static_data<Iterator, mpl::false_, HasState, TokenValue>
+ {
+ public:
+ typedef semantic_actions<Iterator, HasState, static_data>
+ semantic_actions_type;
+
+ protected:
+ typedef static_data<Iterator, mpl::false_, HasState, TokenValue>
+ base_type;
+ typedef typename base_type::char_type char_type;
+ typedef typename semantic_actions_type::functor_wrapper_type
+ functor_wrapper_type;
+
+ public:
+ typedef Iterator base_iterator_type;
+ typedef TokenValue token_value_type;
+ typedef TokenValue const& get_value_type;
+ typedef typename base_type::state_type state_type;
+ typedef typename base_type::state_name_type state_name_type;
+
+ typedef detail::wrap_action<functor_wrapper_type
+ , Iterator, static_data, std::size_t> wrap_action_type;
+
+ template <typename IterData>
+ static_data (IterData const& data, Iterator& first
+ , Iterator const& last)
+ : base_type(data, first, last)
+ , actions_(data.actions_), hold_()
+ , value_(iterator_range<Iterator>(first, last))
+ , has_value_(false)
+ , has_hold_(false)
+ {}
+
+ // invoke attached semantic actions, if defined
+ BOOST_SCOPED_ENUM(pass_flags) invoke_actions(std::size_t state
+ , std::size_t& id, std::size_t unique_id, Iterator& end)
+ {
+ return actions_.invoke_actions(state, id, unique_id, end, *this);
+ }
+
+ // The function less() is used by the implementation of the support
+ // function lex::less(). Its functionality is equivalent to flex'
+ // function yyless(): it returns an iterator positioned to the
+ // nth input character beyond the current start iterator (i.e. by
+ // assigning the return value to the placeholder '_end' it is
+ // possible to return all but the first n characters of the current
+ // token back to the input stream).
+ Iterator const& less(Iterator& it, int n)
+ {
+ it = this->get_first();
+ std::advance(it, n);
+ return it;
+ }
+
+ // The function more() is used by the implementation of the support
+ // function lex::more(). Its functionality is equivalent to flex'
+ // function yymore(): it tells the lexer that the next time it
+ // matches a rule, the corresponding token should be appended onto
+ // the current token value rather than replacing it.
+ void more()
+ {
+ hold_ = this->get_first();
+ has_hold_ = true;
+ }
+
+ // The function lookahead() is used by the implementation of the
+ // support function lex::lookahead. It can be used to implement
+ // lookahead for lexer engines not supporting constructs like flex'
+ // a/b (match a, but only when followed by b)
+ bool lookahead(std::size_t id, std::size_t state = std::size_t(~0))
+ {
+ Iterator end = end_;
+ std::size_t unique_id = boost::lexer::npos;
+ bool bol = this->bol_;
+
+ if (std::size_t(~0) == state)
+ state = this->state_;
+
+ return id == this->next_token_(
+ state, bol, end, this->get_eoi(), unique_id);
+ }
+
+ // The adjust_start() and revert_adjust_start() are helper
+ // functions needed to implement the functionality required for
+ // lex::more(). It is called from the functor body below.
+ bool adjust_start()
+ {
+ if (!has_hold_)
+ return false;
+
+ std::swap(this->get_first(), hold_);
+ has_hold_ = false;
+ return true;
+ }
+ void revert_adjust_start()
+ {
+ // this will be called only if adjust_start above returned true
+ std::swap(this->get_first(), hold_);
+ has_hold_ = true;
+ }
+
+ TokenValue const& get_value() const
+ {
+ if (!has_value_) {
+ value_ = iterator_range<Iterator>(this->get_first(), end_);
+ has_value_ = true;
+ }
+ return value_;
+ }
+ template <typename Value>
+ void set_value(Value const& val)
+ {
+ value_ = val;
+ has_value_ = true;
+ }
+ void set_end(Iterator const& it)
+ {
+ end_ = it;
+ }
+ bool has_value() const { return has_value_; }
+ void reset_value() { has_value_ = false; }
+
+ protected:
+ semantic_actions_type const& actions_;
+ Iterator hold_; // iterator needed to support lex::more()
+ Iterator end_; // iterator pointing to end of matched token
+ mutable TokenValue value_; // token value to use
+ mutable bool has_value_; // 'true' if value_ is valid
+ bool has_hold_; // 'true' if hold_ is valid
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ static_data& operator= (static_data const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // does support lexer semantic actions, may support state, is used for
+ // position_token exposing exactly one type
+ template <typename Iterator, typename HasState, typename TokenValue>
+ class static_data<Iterator, mpl::true_, HasState, boost::optional<TokenValue> >
+ : public static_data<Iterator, mpl::false_, HasState, TokenValue>
+ {
+ public:
+ typedef semantic_actions<Iterator, HasState, static_data>
+ semantic_actions_type;
+
+ protected:
+ typedef static_data<Iterator, mpl::false_, HasState, TokenValue>
+ base_type;
+ typedef typename base_type::char_type char_type;
+ typedef typename semantic_actions_type::functor_wrapper_type
+ functor_wrapper_type;
+
+ public:
+ typedef Iterator base_iterator_type;
+ typedef boost::optional<TokenValue> token_value_type;
+ typedef boost::optional<TokenValue> const& get_value_type;
+ typedef typename base_type::state_type state_type;
+ typedef typename base_type::state_name_type state_name_type;
+
+ typedef detail::wrap_action<functor_wrapper_type
+ , Iterator, static_data, std::size_t> wrap_action_type;
+
+ template <typename IterData>
+ static_data (IterData const& data_, Iterator& first, Iterator const& last)
+ : base_type(data_, first, last)
+ , actions_(data_.actions_), hold_()
+ , has_value_(false), has_hold_(false)
+ {
+ spirit::traits::assign_to(first, last, value_);
+ has_value_ = true;
+ }
+
+ // invoke attached semantic actions, if defined
+ BOOST_SCOPED_ENUM(pass_flags) invoke_actions(std::size_t state
+ , std::size_t& id, std::size_t unique_id, Iterator& end)
+ {
+ return actions_.invoke_actions(state, id, unique_id, end, *this);
+ }
+
+ // The function less() is used by the implementation of the support
+ // function lex::less(). Its functionality is equivalent to flex'
+ // function yyless(): it returns an iterator positioned to the
+ // nth input character beyond the current start iterator (i.e. by
+ // assigning the return value to the placeholder '_end' it is
+ // possible to return all but the first n characters of the current
+ // token back to the input stream).
+ Iterator const& less(Iterator& it, int n)
+ {
+ it = this->get_first();
+ std::advance(it, n);
+ return it;
+ }
+
+ // The function more() is used by the implementation of the support
+ // function lex::more(). Its functionality is equivalent to flex'
+ // function yymore(): it tells the lexer that the next time it
+ // matches a rule, the corresponding token should be appended onto
+ // the current token value rather than replacing it.
+ void more()
+ {
+ hold_ = this->get_first();
+ has_hold_ = true;
+ }
+
+ // The function lookahead() is used by the implementation of the
+ // support function lex::lookahead. It can be used to implement
+ // lookahead for lexer engines not supporting constructs like flex'
+ // a/b (match a, but only when followed by b)
+ bool lookahead(std::size_t id, std::size_t state = std::size_t(~0))
+ {
+ Iterator end = end_;
+ std::size_t unique_id = boost::lexer::npos;
+ bool bol = this->bol_;
+
+ if (std::size_t(~0) == state)
+ state = this->state_;
+
+ return id == this->next_token_(
+ state, bol, end, this->get_eoi(), unique_id);
+ }
+
+ // The adjust_start() and revert_adjust_start() are helper
+ // functions needed to implement the functionality required for
+ // lex::more(). It is called from the functor body below.
+ bool adjust_start()
+ {
+ if (!has_hold_)
+ return false;
+
+ std::swap(this->get_first(), hold_);
+ has_hold_ = false;
+ return true;
+ }
+ void revert_adjust_start()
+ {
+ // this will be called only if adjust_start above returned true
+ std::swap(this->get_first(), hold_);
+ has_hold_ = true;
+ }
+
+ TokenValue const& get_value() const
+ {
+ if (!has_value_) {
+ spirit::traits::assign_to(this->get_first(), end_, value_);
+ has_value_ = true;
+ }
+ return value_;
+ }
+ template <typename Value>
+ void set_value(Value const& val)
+ {
+ value_ = val;
+ has_value_ = true;
+ }
+ void set_end(Iterator const& it)
+ {
+ end_ = it;
+ }
+ bool has_value() const { return has_value_; }
+ void reset_value() { has_value_ = false; }
+
+ protected:
+ semantic_actions_type const& actions_;
+ Iterator hold_; // iterator needed to support lex::more()
+ Iterator end_; // iterator pointing to end of matched token
+ mutable token_value_type value_; // token value to use
+ mutable bool has_value_; // 'true' if value_ is valid
+ bool has_hold_; // 'true' if hold_ is valid
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ static_data& operator= (static_data const&);
+ };
+ }
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp b/boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp
new file mode 100644
index 0000000000..d6deffc886
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp
@@ -0,0 +1,279 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_STATIC_LEXER_FEB_10_2008_0753PM)
+#define BOOST_SPIRIT_LEX_STATIC_LEXER_FEB_10_2008_0753PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer/lexertl/token.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/functor.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/static_functor_data.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/iterator.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/static_version.hpp>
+#if defined(BOOST_SPIRIT_DEBUG)
+#include <boost/spirit/home/support/detail/lexer/debug.hpp>
+#endif
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // forward declaration
+ ///////////////////////////////////////////////////////////////////////////
+ namespace static_
+ {
+ struct lexer;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Every lexer type to be used as a lexer for Spirit has to conform to
+ // the following public interface:
+ //
+ // typedefs:
+ // iterator_type The type of the iterator exposed by this lexer.
+ // token_type The type of the tokens returned from the exposed
+ // iterators.
+ //
+ // functions:
+ // default constructor
+ // Since lexers are instantiated as base classes
+ // only it might be a good idea to make this
+ // constructor protected.
+ // begin, end Return a pair of iterators, when dereferenced
+ // returning the sequence of tokens recognized in
+ // the input stream given as the parameters to the
+ // begin() function.
+ // add_token Should add the definition of a token to be
+ // recognized by this lexer.
+ // clear Should delete all current token definitions
+ // associated with the given state of this lexer
+ // object.
+ //
+ // template parameters:
+ // Token The type of the tokens to be returned from the
+ // exposed token iterator.
+ // LexerTables See explanations below.
+ // Iterator The type of the iterator used to access the
+ // underlying character stream.
+ // Functor The type of the InputPolicy to use to instantiate
+ // the multi_pass iterator type to be used as the
+ // token iterator (returned from begin()/end()).
+ //
+ // Additionally, this implementation of a static lexer has a template
+ // parameter LexerTables allowing to customize the static lexer tables
+ // to be used. The LexerTables is expected to be a type exposing
+ // the following functions:
+ //
+ // static std::size_t const state_count()
+ //
+ // This function needs toreturn the number of lexer states
+ // contained in the table returned from the state_names()
+ // function.
+ //
+ // static char const* const* state_names()
+ //
+ // This function needs to return a pointer to a table of
+ // names of all lexer states. The table needs to have as
+ // much entries as the state_count() function returns
+ //
+ // template<typename Iterator>
+ // std::size_t next(std::size_t &start_state_, Iterator const& start_
+ // , Iterator &start_token_, Iterator const& end_
+ // , std::size_t& unique_id_);
+ //
+ // This function is expected to return the next matched
+ // token from the underlying input stream.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The static_lexer class is a implementation of a Spirit.Lex
+ // lexer on top of Ben Hanson's lexertl library (For more information
+ // about lexertl go here: http://www.benhanson.net/lexertl.html).
+ //
+ // This class is designed to be used in conjunction with a generated,
+ // static lexer. For more information see the documentation (The Static
+ // Lexer Model).
+ //
+ // This class is supposed to be used as the first and only template
+ // parameter while instantiating instances of a lex::lexer class.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Token = token<>
+ , typename LexerTables = static_::lexer
+ , typename Iterator = typename Token::iterator_type
+ , typename Functor = functor<Token, detail::static_data, Iterator> >
+ class static_lexer
+ {
+ private:
+ struct dummy { void true_() {} };
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ // object is always valid
+ operator safe_bool() const { return &dummy::true_; }
+
+ typedef typename boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+ typedef std::basic_string<char_type> string_type;
+
+ // Every lexer type to be used as a lexer for Spirit has to conform to
+ // a public interface
+ typedef Token token_type;
+ typedef typename Token::id_type id_type;
+ typedef iterator<Functor> iterator_type;
+
+ private:
+ // this type is purely used for the iterator_type construction below
+ struct iterator_data_type
+ {
+ typedef typename Functor::next_token_functor next_token_functor;
+ typedef typename Functor::semantic_actions_type semantic_actions_type;
+ typedef typename Functor::get_state_name_type get_state_name_type;
+
+ iterator_data_type(next_token_functor next
+ , semantic_actions_type const& actions
+ , get_state_name_type get_state_name, std::size_t num_states
+ , bool bol)
+ : next_(next), actions_(actions), get_state_name_(get_state_name)
+ , num_states_(num_states), bol_(bol)
+ {}
+
+ next_token_functor next_;
+ semantic_actions_type const& actions_;
+ get_state_name_type get_state_name_;
+ std::size_t num_states_;
+ bool bol_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ iterator_data_type& operator= (iterator_data_type const&);
+ };
+
+ typedef LexerTables tables_type;
+
+ // The following static assertion fires if the referenced static lexer
+ // tables are generated by a different static lexer version as used for
+ // the current compilation unit. Please regenerate your static lexer
+ // tables before trying to create a static_lexer<> instance.
+ BOOST_SPIRIT_ASSERT_MSG(
+ tables_type::static_version == SPIRIT_STATIC_LEXER_VERSION
+ , incompatible_static_lexer_version, (LexerTables));
+
+ public:
+ // Return the start iterator usable for iterating over the generated
+ // tokens, the generated function next_token(...) is called to match
+ // the next token from the input.
+ template <typename Iterator_>
+ iterator_type begin(Iterator_& first, Iterator_ const& last
+ , char_type const* initial_state = 0) const
+ {
+ iterator_data_type iterator_data(
+ &tables_type::template next<Iterator_>, actions_
+ , &tables_type::state_name, tables_type::state_count()
+ , tables_type::supports_bol
+ );
+ return iterator_type(iterator_data, first, last, initial_state);
+ }
+
+ // Return the end iterator usable to stop iterating over the generated
+ // tokens.
+ iterator_type end() const
+ {
+ return iterator_type();
+ }
+
+ protected:
+ // Lexer instances can be created by means of a derived class only.
+ static_lexer(unsigned int) : unique_id_(0) {}
+
+ public:
+ // interface for token definition management
+ std::size_t add_token (char_type const*, char_type, std::size_t
+ , char_type const*)
+ {
+ return unique_id_++;
+ }
+ std::size_t add_token (char_type const*, string_type const&
+ , std::size_t, char_type const*)
+ {
+ return unique_id_++;
+ }
+
+ // interface for pattern definition management
+ void add_pattern (char_type const*, string_type const&
+ , string_type const&) {}
+
+ void clear(char_type const*) {}
+
+ std::size_t add_state(char_type const* state)
+ {
+ return detail::get_state_id(state, &tables_type::state_name
+ , tables_type::state_count());
+ }
+ string_type initial_state() const
+ {
+ return tables_type::state_name(0);
+ }
+
+ // register a semantic action with the given id
+ template <typename F>
+ void add_action(id_type unique_id, std::size_t state, F act)
+ {
+ typedef typename Functor::wrap_action_type wrapper_type;
+ actions_.add_action(unique_id, state, wrapper_type::call(act));
+ }
+
+ bool init_dfa(bool minimize = false) const { return true; }
+
+ private:
+ typename Functor::semantic_actions_type actions_;
+ std::size_t unique_id_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The static_actor_lexer class is another implementation of a
+ // Spirit.Lex lexer on top of Ben Hanson's lexertl library as outlined
+ // above (For more information about lexertl go here:
+ // http://www.benhanson.net/lexertl.html).
+ //
+ // Just as the static_lexer class it is meant to be used with
+ // a statically generated lexer as outlined above.
+ //
+ // The only difference to the static_lexer class above is that
+ // token_def definitions may have semantic (lexer) actions attached while
+ // being defined:
+ //
+ // int w;
+ // token_def<> word = "[^ \t\n]+";
+ // self = word[++ref(w)]; // see example: word_count_lexer
+ //
+ // This class is supposed to be used as the first and only template
+ // parameter while instantiating instances of a lex::lexer class.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Token = token<>
+ , typename LexerTables = static_::lexer
+ , typename Iterator = typename Token::iterator_type
+ , typename Functor
+ = functor<Token, detail::static_data, Iterator, mpl::true_> >
+ class static_actor_lexer
+ : public static_lexer<Token, LexerTables, Iterator, Functor>
+ {
+ protected:
+ // Lexer instances can be created by means of a derived class only.
+ static_actor_lexer(unsigned int flags)
+ : static_lexer<Token, LexerTables, Iterator, Functor>(flags)
+ {}
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/static_version.hpp b/boost/spirit/home/lex/lexer/lexertl/static_version.hpp
new file mode 100644
index 0000000000..8163dc53c5
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/static_version.hpp
@@ -0,0 +1,20 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_STATIC_LEXER_VERSION_SEP_10_2009_0811PM)
+#define BOOST_SPIRIT_LEX_STATIC_LEXER_VERSION_SEP_10_2009_0811PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// This is the version of the static lexer format. It is used to ensure a
+// static lexer has been generated using the same data format as expected
+// by the executing application.
+///////////////////////////////////////////////////////////////////////////////
+#define SPIRIT_STATIC_LEXER_VERSION 0x010000
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/token.hpp b/boost/spirit/home/lex/lexer/lexertl/token.hpp
new file mode 100644
index 0000000000..90961af156
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/token.hpp
@@ -0,0 +1,654 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_TOKEN_FEB_10_2008_0751PM)
+#define BOOST_SPIRIT_LEX_TOKEN_FEB_10_2008_0751PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/detail/lexer/generator.hpp>
+#include <boost/spirit/home/support/detail/lexer/rules.hpp>
+#include <boost/spirit/home/support/detail/lexer/consts.hpp>
+#include <boost/spirit/home/support/utree/utree_traits_fwd.hpp>
+#include <boost/spirit/home/lex/lexer/terminals.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/value_at.hpp>
+#include <boost/detail/iterator.hpp>
+#include <boost/variant.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/range/iterator_range.hpp>
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+#include <boost/static_assert.hpp>
+#endif
+
+#if defined(BOOST_SPIRIT_DEBUG)
+#include <iosfwd>
+#endif
+
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The token is the type of the objects returned by default by the
+ // iterator.
+ //
+ // template parameters:
+ // Iterator The type of the iterator used to access the
+ // underlying character stream.
+ // AttributeTypes A mpl sequence containing the types of all
+ // required different token values to be supported
+ // by this token type.
+ // HasState A mpl::bool_ indicating, whether this token type
+ // should support lexer states.
+ // Idtype The type to use for the token id (defaults to
+ // std::size_t).
+ //
+ // It is possible to use other token types with the spirit::lex
+ // framework as well. If you plan to use a different type as your token
+ // type, you'll need to expose the following things from your token type
+ // to make it compatible with spirit::lex:
+ //
+ // typedefs
+ // iterator_type The type of the iterator used to access the
+ // underlying character stream.
+ //
+ // id_type The type of the token id used.
+ //
+ // methods
+ // default constructor
+ // This should initialize the token as an end of
+ // input token.
+ // constructors The prototype of the other required
+ // constructors should be:
+ //
+ // token(int)
+ // This constructor should initialize the token as
+ // an invalid token (not carrying any specific
+ // values)
+ //
+ // where: the int is used as a tag only and its value is
+ // ignored
+ //
+ // and:
+ //
+ // token(Idtype id, std::size_t state,
+ // iterator_type first, iterator_type last);
+ //
+ // where: id: token id
+ // state: lexer state this token was matched in
+ // first, last: pair of iterators marking the matched
+ // range in the underlying input stream
+ //
+ // accessors
+ // id() return the token id of the matched input sequence
+ // id(newid) set the token id of the token instance
+ //
+ // state() return the lexer state this token was matched in
+ //
+ // value() return the token value
+ //
+ // Additionally, you will have to implement a couple of helper functions
+ // in the same namespace as the token type: a comparison operator==() to
+ // compare your token instances, a token_is_valid() function and different
+ // specializations of the Spirit customization point
+ // assign_to_attribute_from_value as shown below.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator = char const*
+ , typename AttributeTypes = mpl::vector0<>
+ , typename HasState = mpl::true_
+ , typename Idtype = std::size_t>
+ struct token;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization of the token type doesn't contain any item data and
+ // doesn't support working with lexer states.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Idtype>
+ struct token<Iterator, lex::omit, mpl::false_, Idtype>
+ {
+ typedef Iterator iterator_type;
+ typedef mpl::false_ has_state;
+ typedef Idtype id_type;
+ typedef unused_type token_value_type;
+
+ // default constructed tokens correspond to EOI tokens
+ token() : id_(id_type(boost::lexer::npos)) {}
+
+ // construct an invalid token
+ explicit token(int) : id_(id_type(0)) {}
+
+ token(id_type id, std::size_t) : id_(id) {}
+
+ token(id_type id, std::size_t, token_value_type)
+ : id_(id) {}
+
+ token_value_type& value() { static token_value_type u; return u; }
+ token_value_type const& value() const { return unused; }
+
+#if defined(BOOST_SPIRIT_DEBUG)
+ token(id_type id, std::size_t, Iterator const& first
+ , Iterator const& last)
+ : matched_(first, last)
+ , id_(id) {}
+#else
+ token(id_type id, std::size_t, Iterator const&, Iterator const&)
+ : id_(id) {}
+#endif
+
+ // this default conversion operator is needed to allow the direct
+ // usage of tokens in conjunction with the primitive parsers defined
+ // in Qi
+ operator id_type() const { return id_; }
+
+ // Retrieve or set the token id of this token instance.
+ id_type id() const { return id_; }
+ void id(id_type newid) { id_ = newid; }
+
+ std::size_t state() const { return 0; } // always '0' (INITIAL state)
+
+ bool is_valid() const
+ {
+ return 0 != id_ && id_type(boost::lexer::npos) != id_;
+ }
+
+#if defined(BOOST_SPIRIT_DEBUG)
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+ // workaround for MSVC10 which has problems copying a default
+ // constructed iterator_range
+ token& operator= (token const& rhs)
+ {
+ if (this != &rhs)
+ {
+ id_ = rhs.id_;
+ if (is_valid())
+ matched_ = rhs.matched_;
+ }
+ return *this;
+ }
+#endif
+ std::pair<Iterator, Iterator> matched_;
+#endif
+
+ protected:
+ id_type id_; // token id, 0 if nothing has been matched
+ };
+
+#if defined(BOOST_SPIRIT_DEBUG)
+ template <typename Char, typename Traits, typename Iterator
+ , typename AttributeTypes, typename HasState, typename Idtype>
+ inline std::basic_ostream<Char, Traits>&
+ operator<< (std::basic_ostream<Char, Traits>& os
+ , token<Iterator, AttributeTypes, HasState, Idtype> const& t)
+ {
+ if (t.is_valid()) {
+ Iterator end = t.matched_.second;
+ for (Iterator it = t.matched_.first; it != end; ++it)
+ os << *it;
+ }
+ else {
+ os << "<invalid token>";
+ }
+ return os;
+ }
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This specialization of the token type doesn't contain any item data but
+ // supports working with lexer states.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Idtype>
+ struct token<Iterator, lex::omit, mpl::true_, Idtype>
+ : token<Iterator, lex::omit, mpl::false_, Idtype>
+ {
+ private:
+ typedef token<Iterator, lex::omit, mpl::false_, Idtype> base_type;
+
+ public:
+ typedef typename base_type::id_type id_type;
+ typedef Iterator iterator_type;
+ typedef mpl::true_ has_state;
+ typedef unused_type token_value_type;
+
+ // default constructed tokens correspond to EOI tokens
+ token() : state_(boost::lexer::npos) {}
+
+ // construct an invalid token
+ explicit token(int) : base_type(0), state_(boost::lexer::npos) {}
+
+ token(id_type id, std::size_t state)
+ : base_type(id, boost::lexer::npos), state_(state) {}
+
+ token(id_type id, std::size_t state, token_value_type)
+ : base_type(id, boost::lexer::npos, unused)
+ , state_(state) {}
+
+ token(id_type id, std::size_t state
+ , Iterator const& first, Iterator const& last)
+ : base_type(id, boost::lexer::npos, first, last)
+ , state_(state) {}
+
+ std::size_t state() const { return state_; }
+
+#if defined(BOOST_SPIRIT_DEBUG) && BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+ // workaround for MSVC10 which has problems copying a default
+ // constructed iterator_range
+ token& operator= (token const& rhs)
+ {
+ if (this != &rhs)
+ {
+ this->base_type::operator=(static_cast<base_type const&>(rhs));
+ state_ = rhs.state_;
+ }
+ return *this;
+ }
+#endif
+
+ protected:
+ std::size_t state_; // lexer state this token was matched in
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The generic version of the token type derives from the
+ // specialization above and adds a single data member holding the item
+ // data carried by the token instance.
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // Meta-function to calculate the type of the variant data item to be
+ // stored with each token instance.
+ //
+ // Note: The iterator pair needs to be the first type in the list of
+ // types supported by the generated variant type (this is being
+ // used to identify whether the stored data item in a particular
+ // token instance needs to be converted from the pair of
+ // iterators (see the first of the assign_to_attribute_from_value
+ // specializations below).
+ ///////////////////////////////////////////////////////////////////////
+ template <typename IteratorPair, typename AttributeTypes>
+ struct token_value_typesequence
+ {
+ typedef typename mpl::insert<
+ AttributeTypes
+ , typename mpl::begin<AttributeTypes>::type
+ , IteratorPair
+ >::type sequence_type;
+ typedef typename make_variant_over<sequence_type>::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ // The type of the data item stored with a token instance is defined
+ // by the template parameter 'AttributeTypes' and may be:
+ //
+ // lex::omit: no data item is stored with the token
+ // instance (this is handled by the
+ // specializations of the token class
+ // below)
+ // mpl::vector0<>: each token instance stores a pair of
+ // iterators pointing to the matched input
+ // sequence
+ // mpl::vector<...>: each token instance stores a variant being
+ // able to store the pair of iterators pointing
+ // to the matched input sequence, or any of the
+ // types a specified in the mpl::vector<>
+ //
+ // All this is done to ensure the token type is as small (in terms
+ // of its byte-size) as possible.
+ ///////////////////////////////////////////////////////////////////////
+ template <typename IteratorPair, typename AttributeTypes>
+ struct token_value_type
+ : mpl::eval_if<
+ mpl::or_<
+ is_same<AttributeTypes, mpl::vector0<> >
+ , is_same<AttributeTypes, mpl::vector<> > >
+ , mpl::identity<IteratorPair>
+ , token_value_typesequence<IteratorPair, AttributeTypes> >
+ {};
+ }
+
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype>
+ struct token : token<Iterator, lex::omit, HasState, Idtype>
+ {
+ private: // precondition assertions
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+ BOOST_STATIC_ASSERT((mpl::is_sequence<AttributeTypes>::value ||
+ is_same<AttributeTypes, lex::omit>::value));
+#endif
+ typedef token<Iterator, lex::omit, HasState, Idtype> base_type;
+
+ protected:
+ // If no additional token value types are given, the the token will
+ // hold the plain pair of iterators pointing to the matched range
+ // in the underlying input sequence. Otherwise the token value is
+ // stored as a variant and will again hold the pair of iterators but
+ // is able to hold any of the given data types as well. The conversion
+ // from the iterator pair to the required data type is done when it is
+ // accessed for the first time.
+ typedef iterator_range<Iterator> iterpair_type;
+
+ public:
+ typedef typename base_type::id_type id_type;
+ typedef typename detail::token_value_type<
+ iterpair_type, AttributeTypes
+ >::type token_value_type;
+
+ typedef Iterator iterator_type;
+
+ // default constructed tokens correspond to EOI tokens
+ token() : value_(iterpair_type(iterator_type(), iterator_type())) {}
+
+ // construct an invalid token
+ explicit token(int)
+ : base_type(0)
+ , value_(iterpair_type(iterator_type(), iterator_type())) {}
+
+ token(id_type id, std::size_t state, token_value_type const& value)
+ : base_type(id, state, value)
+ , value_(value) {}
+
+ token(id_type id, std::size_t state, Iterator const& first
+ , Iterator const& last)
+ : base_type(id, state, first, last)
+ , value_(iterpair_type(first, last)) {}
+
+ token_value_type& value() { return value_; }
+ token_value_type const& value() const { return value_; }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+ // workaround for MSVC10 which has problems copying a default
+ // constructed iterator_range
+ token& operator= (token const& rhs)
+ {
+ if (this != &rhs)
+ {
+ this->base_type::operator=(static_cast<base_type const&>(rhs));
+ if (this->is_valid())
+ value_ = rhs.value_;
+ }
+ return *this;
+ }
+#endif
+
+ protected:
+ token_value_type value_; // token value, by default a pair of iterators
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // tokens are considered equal, if their id's match (these are unique)
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype>
+ inline bool
+ operator== (token<Iterator, AttributeTypes, HasState, Idtype> const& lhs,
+ token<Iterator, AttributeTypes, HasState, Idtype> const& rhs)
+ {
+ return lhs.id() == rhs.id();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This overload is needed by the multi_pass/functor_input_policy to
+ // validate a token instance. It has to be defined in the same namespace
+ // as the token class itself to allow ADL to find it.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype>
+ inline bool
+ token_is_valid(token<Iterator, AttributeTypes, HasState, Idtype> const& t)
+ {
+ return t.is_valid();
+ }
+}}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // We have to provide specializations for the customization point
+ // assign_to_attribute_from_value allowing to extract the needed value
+ // from the token.
+ ///////////////////////////////////////////////////////////////////////////
+
+ // This is called from the parse function of token_def if the token_def
+ // has been defined to carry a special attribute type
+ template <typename Attribute, typename Iterator, typename AttributeTypes
+ , typename HasState, typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // The goal of this function is to avoid the conversion of the pair of
+ // iterators (to the matched character sequence) into the token value
+ // of the required type being done more than once. For this purpose it
+ // checks whether the stored value type is still the default one (pair
+ // of iterators) and if yes, replaces the pair of iterators with the
+ // converted value to be returned from subsequent calls.
+
+ if (0 == t.value().which()) {
+ // first access to the token value
+ typedef iterator_range<Iterator> iterpair_type;
+ iterpair_type const& ip = boost::get<iterpair_type>(t.value());
+
+ // Interestingly enough we use the assign_to() framework defined in
+ // Spirit.Qi allowing to convert the pair of iterators to almost any
+ // required type (assign_to(), if available, uses the standard Spirit
+ // parsers to do the conversion).
+ spirit::traits::assign_to(ip.begin(), ip.end(), attr);
+
+ // If you get an error during the compilation of the following
+ // assignment expression, you probably forgot to list one or more
+ // types used as token value types (in your token_def<...>
+ // definitions) in your definition of the token class. I.e. any token
+ // value type used for a token_def<...> definition has to be listed
+ // during the declaration of the token type to use. For instance let's
+ // assume we have two token_def's:
+ //
+ // token_def<int> number; number = "...";
+ // token_def<std::string> identifier; identifier = "...";
+ //
+ // Then you'll have to use the following token type definition
+ // (assuming you are using the token class):
+ //
+ // typedef mpl::vector<int, std::string> token_values;
+ // typedef token<base_iter_type, token_values> token_type;
+ //
+ // where: base_iter_type is the iterator type used to expose the
+ // underlying input stream.
+ //
+ // This token_type has to be used as the second template parameter
+ // to the lexer class:
+ //
+ // typedef lexer<base_iter_type, token_type> lexer_type;
+ //
+ // again, assuming you're using the lexer<> template for your
+ // tokenization.
+
+ typedef lex::lexertl::token<
+ Iterator, AttributeTypes, HasState, Idtype> token_type;
+ spirit::traits::assign_to(
+ attr, const_cast<token_type&>(t).value()); // re-assign value
+ }
+ else {
+ // reuse the already assigned value
+ spirit::traits::assign_to(boost::get<Attribute>(t.value()), attr);
+ }
+ }
+ };
+
+ template <typename Attribute, typename Iterator, typename AttributeTypes
+ , typename HasState, typename Idtype>
+ struct assign_to_container_from_value<Attribute
+ , lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> >
+ : assign_to_attribute_from_value<Attribute
+ , lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> >
+ {};
+
+ template <typename Iterator, typename AttributeTypes
+ , typename HasState, typename Idtype>
+ struct assign_to_container_from_value<utree
+ , lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> >
+ : assign_to_attribute_from_value<utree
+ , lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> >
+ {};
+
+ template <typename Iterator>
+ struct assign_to_container_from_value<
+ iterator_range<Iterator>, iterator_range<Iterator> >
+ {
+ static void
+ call(iterator_range<Iterator> const& val, iterator_range<Iterator>& attr)
+ {
+ attr = val;
+ }
+ };
+
+ // These are called from the parse function of token_def if the token type
+ // has no special attribute type assigned
+ template <typename Attribute, typename Iterator, typename HasState
+ , typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::token<Iterator, mpl::vector0<>, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::token<Iterator, mpl::vector0<>, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // The default type returned by the token_def parser component (if
+ // it has no token value type assigned) is the pair of iterators
+ // to the matched character sequence.
+ spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
+ }
+ };
+
+// template <typename Attribute, typename Iterator, typename HasState
+// , typename Idtype>
+// struct assign_to_container_from_value<Attribute
+// , lex::lexertl::token<Iterator, mpl::vector0<>, HasState, Idtype> >
+// : assign_to_attribute_from_value<Attribute
+// , lex::lexertl::token<Iterator, mpl::vector0<>, HasState, Idtype> >
+// {};
+
+ // same as above but using mpl::vector<> instead of mpl::vector0<>
+ template <typename Attribute, typename Iterator, typename HasState
+ , typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::token<Iterator, mpl::vector<>, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::token<Iterator, mpl::vector<>, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // The default type returned by the token_def parser component (if
+ // it has no token value type assigned) is the pair of iterators
+ // to the matched character sequence.
+ spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
+ }
+ };
+
+// template <typename Attribute, typename Iterator, typename HasState
+// , typename Idtype>
+// struct assign_to_container_from_value<Attribute
+// , lex::lexertl::token<Iterator, mpl::vector<>, HasState, Idtype> >
+// : assign_to_attribute_from_value<Attribute
+// , lex::lexertl::token<Iterator, mpl::vector<>, HasState, Idtype> >
+// {};
+
+ // This is called from the parse function of token_def if the token type
+ // has been explicitly omitted (i.e. no attribute value is used), which
+ // essentially means that every attribute gets initialized using default
+ // constructed values.
+ template <typename Attribute, typename Iterator, typename HasState
+ , typename Idtype>
+ struct assign_to_attribute_from_value<Attribute
+ , lex::lexertl::token<Iterator, lex::omit, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::token<Iterator, lex::omit, HasState, Idtype> const& t
+ , Attribute& attr)
+ {
+ // do nothing
+ }
+ };
+
+ template <typename Attribute, typename Iterator, typename HasState
+ , typename Idtype>
+ struct assign_to_container_from_value<Attribute
+ , lex::lexertl::token<Iterator, lex::omit, HasState, Idtype> >
+ : assign_to_attribute_from_value<Attribute
+ , lex::lexertl::token<Iterator, lex::omit, HasState, Idtype> >
+ {};
+
+ // This is called from the parse function of lexer_def_
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype_, typename Idtype>
+ struct assign_to_attribute_from_value<
+ fusion::vector2<Idtype_, iterator_range<Iterator> >
+ , lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> >
+ {
+ static void
+ call(lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> const& t
+ , fusion::vector2<Idtype_, iterator_range<Iterator> >& attr)
+ {
+ // The type returned by the lexer_def_ parser components is a
+ // fusion::vector containing the token id of the matched token
+ // and the pair of iterators to the matched character sequence.
+ typedef iterator_range<Iterator> iterpair_type;
+ typedef fusion::vector2<Idtype_, iterator_range<Iterator> >
+ attribute_type;
+
+ iterpair_type const& ip = boost::get<iterpair_type>(t.value());
+ attr = attribute_type(t.id(), ip);
+ }
+ };
+
+ template <typename Iterator, typename AttributeTypes, typename HasState
+ , typename Idtype_, typename Idtype>
+ struct assign_to_container_from_value<
+ fusion::vector2<Idtype_, iterator_range<Iterator> >
+ , lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> >
+ : assign_to_attribute_from_value<
+ fusion::vector2<Idtype_, iterator_range<Iterator> >
+ , lex::lexertl::token<Iterator, AttributeTypes, HasState, Idtype> >
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Overload debug output for a single token, this integrates lexer tokens
+ // with Qi's simple_trace debug facilities
+ template <typename Iterator, typename Attribute, typename HasState
+ , typename Idtype>
+ struct token_printer_debug<
+ lex::lexertl::token<Iterator, Attribute, HasState, Idtype> >
+ {
+ typedef lex::lexertl::token<Iterator, Attribute, HasState, Idtype> token_type;
+
+ template <typename Out>
+ static void print(Out& out, token_type const& val)
+ {
+ out << '[';
+ spirit::traits::print_token(out, val.value());
+ out << ']';
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp b/boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp
new file mode 100644
index 0000000000..e128d273ce
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp
@@ -0,0 +1,154 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_WRAP_ACTION_APR_19_2008_0103PM)
+#define BOOST_SPIRIT_WRAP_ACTION_APR_19_2008_0103PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/spirit/include/phoenix_scope.hpp>
+
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/lex/lexer/pass_flags.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace lex { namespace lexertl
+{
+ namespace detail
+ {
+ template <typename FunctionType, typename Iterator, typename Context
+ , typename IdType>
+ struct wrap_action
+ {
+ // plain functions with 5 arguments, function objects (including
+ // phoenix actors) are not touched at all
+ template <typename F>
+ static FunctionType call(F const& f)
+ {
+ return f;
+ }
+
+ // semantic actions with 4 arguments
+ template <typename F>
+ static void arg4_action(F* f, Iterator& start, Iterator& end
+ , BOOST_SCOPED_ENUM(pass_flags)& pass, IdType& id
+ , Context const&)
+ {
+ f(start, end, pass, id);
+ }
+
+ template <typename A0, typename A1, typename A2, typename A3>
+ static FunctionType call(void (*f)(A0, A1, A2, A3))
+ {
+ void (*pf)(void(*)(A0, A1, A2, A3)
+ , Iterator&, Iterator&, BOOST_SCOPED_ENUM(pass_flags)&
+ , IdType&, Context const&) = &wrap_action::arg4_action;
+
+ using phoenix::arg_names::_1;
+ using phoenix::arg_names::_2;
+ using phoenix::arg_names::_3;
+ using phoenix::arg_names::_4;
+ using phoenix::arg_names::_5;
+ return phoenix::bind(pf, f, _1, _2, _3, _4, _5);
+ }
+
+ // semantic actions with 3 arguments
+ template <typename F>
+ static void arg3_action(F* f, Iterator& start, Iterator& end
+ , BOOST_SCOPED_ENUM(pass_flags)& pass, IdType
+ , Context const&)
+ {
+ f(start, end, pass);
+ }
+
+ template <typename A0, typename A1, typename A2>
+ static FunctionType call(void (*f)(A0, A1, A2))
+ {
+ void (*pf)(void(*)(A0, A1, A2), Iterator&, Iterator&
+ , BOOST_SCOPED_ENUM(pass_flags)&, IdType
+ , Context const&) = &wrap_action::arg3_action;
+
+ using phoenix::arg_names::_1;
+ using phoenix::arg_names::_2;
+ using phoenix::arg_names::_3;
+ using phoenix::arg_names::_4;
+ using phoenix::arg_names::_5;
+ return phoenix::bind(pf, f, _1, _2, _3, _4, _5);
+ }
+
+ // semantic actions with 2 arguments
+ template <typename F>
+ static void arg2_action(F* f, Iterator& start, Iterator& end
+ , BOOST_SCOPED_ENUM(pass_flags)&, IdType, Context const&)
+ {
+ f (start, end);
+ }
+
+ template <typename A0, typename A1>
+ static FunctionType call(void (*f)(A0, A1))
+ {
+ void (*pf)(void(*)(A0, A1), Iterator&, Iterator&
+ , BOOST_SCOPED_ENUM(pass_flags)&
+ , IdType, Context const&) = &wrap_action::arg2_action;
+
+ using phoenix::arg_names::_1;
+ using phoenix::arg_names::_2;
+ using phoenix::arg_names::_3;
+ using phoenix::arg_names::_4;
+ using phoenix::arg_names::_5;
+ return phoenix::bind(pf, f, _1, _2, _3, _4, _5);
+ }
+
+ // we assume that either both iterators are to be passed to the
+ // semantic action or none iterator at all (i.e. it's not possible
+ // to have a lexer semantic action function taking one arguments).
+
+ // semantic actions with 0 argument
+ template <typename F>
+ static void arg0_action(F* f, Iterator&, Iterator&
+ , BOOST_SCOPED_ENUM(pass_flags)&, IdType, Context const&)
+ {
+ f();
+ }
+
+ static FunctionType call(void (*f)())
+ {
+ void (*pf)(void(*)(), Iterator&, Iterator&
+ , BOOST_SCOPED_ENUM(pass_flags)&
+ , IdType, Context const&) = &arg0_action;
+
+ using phoenix::arg_names::_1;
+ using phoenix::arg_names::_2;
+ using phoenix::arg_names::_3;
+ using phoenix::arg_names::_4;
+ using phoenix::arg_names::_5;
+ return phoenix::bind(pf, f, _1, _2, _3, _4, _5);
+ }
+ };
+
+ // specialization allowing to skip wrapping for lexer types not
+ // supporting semantic actions
+ template <typename Iterator, typename Context, typename Idtype>
+ struct wrap_action<unused_type, Iterator, Context, Idtype>
+ {
+ // plain function objects are not touched at all
+ template <typename F>
+ static F const& call(F const& f)
+ {
+ return f;
+ }
+ };
+ }
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/pass_flags.hpp b/boost/spirit/home/lex/lexer/pass_flags.hpp
new file mode 100644
index 0000000000..6cda3badd3
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/pass_flags.hpp
@@ -0,0 +1,28 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_PASS_FLAGS_JUN_09_2009_0840PM)
+#define BOOST_SPIRIT_LEX_PASS_FLAGS_JUN_09_2009_0840PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/detail/scoped_enum_emulation.hpp>
+
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_SCOPED_ENUM_START(pass_flags)
+ {
+ pass_fail = 0, // make the current match fail in retrospective
+ pass_normal = 1, // continue normal token matching, that's the default
+ pass_ignore = 2 // ignore the current token and start matching the next
+ };
+ BOOST_SCOPED_ENUM_END
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/sequence.hpp b/boost/spirit/home/lex/lexer/sequence.hpp
new file mode 100644
index 0000000000..b7fad619ec
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/sequence.hpp
@@ -0,0 +1,72 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_LEX_SEQUENCE_MAR_28_2007_0610PM)
+#define SPIRIT_LEX_SEQUENCE_MAR_28_2007_0610PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/domain.hpp>
+#include <boost/spirit/home/lex/lexer_type.hpp>
+#include <boost/spirit/home/lex/meta_compiler.hpp>
+#include <boost/spirit/home/lex/detail/sequence_function.hpp>
+#include <boost/fusion/include/any.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<lex::domain, proto::tag::bitwise_or> // enables |
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<lex::domain, proto::tag::bitwise_or> // flattens |
+ : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace lex
+{
+ template <typename Elements>
+ struct sequence : nary_lexer<sequence<Elements> >
+ {
+ sequence(Elements const& elements)
+ : elements(elements) {}
+
+ template <typename LexerDef, typename String>
+ void collect(LexerDef& lexdef, String const& state
+ , String const& targetstate) const
+ {
+ typedef detail::sequence_collect_function<LexerDef, String>
+ collect_function_type;
+ collect_function_type f (lexdef, state, targetstate);
+ fusion::any(elements, f);
+ }
+
+ template <typename LexerDef>
+ void add_actions(LexerDef& lexdef) const
+ {
+ detail::sequence_add_actions_function<LexerDef> f (lexdef);
+ fusion::any(elements, f);
+ }
+
+ Elements elements;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Lexer generator: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::bitwise_or, Elements, Modifiers>
+ : make_nary_composite<Elements, sequence>
+ {};
+
+}}} // namespace boost::spirit::lex
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/string_token_def.hpp b/boost/spirit/home/lex/lexer/string_token_def.hpp
new file mode 100644
index 0000000000..9eb987020c
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/string_token_def.hpp
@@ -0,0 +1,178 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_STRING_TOKEN_DEF_MAR_28_2007_0722PM)
+#define BOOST_SPIRIT_LEX_STRING_TOKEN_DEF_MAR_28_2007_0722PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/lex/domain.hpp>
+#include <boost/spirit/home/lex/lexer_type.hpp>
+#include <boost/spirit/home/lex/meta_compiler.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables strings
+ template <typename T>
+ struct use_terminal<lex::domain, T
+ , typename enable_if<traits::is_string<T> >::type>
+ : mpl::true_ {};
+
+ // enables string(str)
+ template <typename CharEncoding, typename A0>
+ struct use_terminal<lex::domain
+ , terminal_ex<
+ tag::char_code<tag::string, CharEncoding>
+ , fusion::vector1<A0> > >
+ : traits::is_string<A0> {};
+
+ // enables string(str, ID)
+ template <typename CharEncoding, typename A0, typename A1>
+ struct use_terminal<lex::domain
+ , terminal_ex<
+ tag::char_code<tag::string, CharEncoding>
+ , fusion::vector2<A0, A1> > >
+ : traits::is_string<A0> {};
+}}
+
+namespace boost { namespace spirit { namespace lex
+{
+ // use string from standard character set by default
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::standard::string;
+#endif
+ using spirit::standard::string_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // string_token_def
+ // represents a string based token definition
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename String, typename IdType = std::size_t
+ , typename CharEncoding = char_encoding::standard>
+ struct string_token_def
+ : primitive_lexer<string_token_def<String, IdType, CharEncoding> >
+ {
+ typedef typename
+ remove_const<typename traits::char_type_of<String>::type>::type
+ char_type;
+ typedef std::basic_string<char_type> string_type;
+
+ string_token_def(typename add_reference<String>::type str, IdType const& id)
+ : str_(str), id_(id), unique_id_(std::size_t(~0))
+ , token_state_(std::size_t(~0))
+ {}
+
+ template <typename LexerDef, typename String_>
+ void collect(LexerDef& lexdef, String_ const& state
+ , String_ const& targetstate) const
+ {
+ std::size_t state_id = lexdef.add_state(state.c_str());
+
+ // If the following assertion fires you are probably trying to use
+ // a single string_token_def instance in more than one lexer state.
+ // This is not possible. Please create a separate token_def instance
+ // from the same regular expression for each lexer state it needs
+ // to be associated with.
+ BOOST_ASSERT(
+ (std::size_t(~0) == token_state_ || state_id == token_state_) &&
+ "Can't use single string_token_def with more than one lexer state");
+
+ char_type const* target = targetstate.empty() ? 0 : targetstate.c_str();
+ if (target)
+ lexdef.add_state(target);
+
+ token_state_ = state_id;
+
+ typedef typename LexerDef::id_type id_type;
+ if (IdType(~0) == id_)
+ id_ = IdType(lexdef.get_next_id());
+
+ unique_id_ = lexdef.add_token (state.c_str(), str_, id_, target);
+ }
+
+ template <typename LexerDef>
+ void add_actions(LexerDef&) const {}
+
+ std::size_t id() const { return id_; }
+ std::size_t unique_id() const { return unique_id_; }
+ std::size_t state() const { return token_state_; }
+
+ string_type str_;
+ mutable IdType id_;
+ mutable std::size_t unique_id_;
+ mutable std::size_t token_state_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Lex generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Modifiers>
+ struct make_primitive<T, Modifiers
+ , typename enable_if<traits::is_string<T> >::type>
+ {
+ typedef typename add_const<T>::type const_string;
+ typedef string_token_def<const_string> result_type;
+
+ result_type operator()(
+ typename add_reference<const_string>::type str, unused_type) const
+ {
+ return result_type(str, std::size_t(~0));
+ }
+ };
+
+ template <typename Modifiers, typename CharEncoding, typename A0>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::string, CharEncoding>
+ , fusion::vector1<A0> >
+ , Modifiers>
+ {
+ typedef typename add_const<A0>::type const_string;
+ typedef string_token_def<const_string, std::size_t, CharEncoding>
+ result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args), std::size_t(~0));
+ }
+ };
+
+ template <typename Modifiers, typename CharEncoding, typename A0, typename A1>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::string, CharEncoding>
+ , fusion::vector2<A0, A1> >
+ , Modifiers>
+ {
+ typedef typename add_const<A0>::type const_string;
+ typedef string_token_def<const_string, A1, CharEncoding> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(
+ fusion::at_c<0>(term.args), fusion::at_c<1>(term.args));
+ }
+ };
+}}} // namespace boost::spirit::lex
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/support_functions.hpp b/boost/spirit/home/lex/lexer/support_functions.hpp
new file mode 100644
index 0000000000..f3987c636a
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/support_functions.hpp
@@ -0,0 +1,205 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_LEX_SUPPORT_FUNCTIONS_JUN_08_2009_0211PM)
+#define SPIRIT_LEX_SUPPORT_FUNCTIONS_JUN_08_2009_0211PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/home/support/detail/scoped_enum_emulation.hpp>
+#include <boost/spirit/home/lex/lexer/pass_flags.hpp>
+
+#include <boost/spirit/home/lex/lexer/support_functions_expression.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The function object less_type is used by the implementation of the
+ // support function lex::less(). Its functionality is equivalent to flex'
+ // function yyless(): it returns an iterator positioned to the nth input
+ // character beyond the current start iterator (i.e. by assigning the
+ // return value to the placeholder '_end' it is possible to return all but
+ // the first n characters of the current token back to the input stream.
+ //
+ // This Phoenix actor is invoked whenever the function lex::less(n) is
+ // used inside a lexer semantic action:
+ //
+ // lex::token_def<> identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
+ // this->self = identifier [ _end = lex::less(4) ];
+ //
+ // The example shows how to limit the length of the matched identifier to
+ // four characters.
+ //
+ // Note: the function lex::less() has no effect if used on it's own, you
+ // need to use the returned result in order to make use of its
+ // functionality.
+ template <typename Actor>
+ struct less_type
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ remove_const<
+ typename mpl::at_c<typename Env::args_type, 4>::type
+ >::type
+ context_type;
+ typedef typename context_type::base_iterator_type type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ typename result<Env>::type it;
+ return fusion::at_c<4>(env.args()).less(it, actor_());
+ }
+
+ less_type(Actor const& actor)
+ : actor_(actor) {}
+
+ Actor actor_;
+ };
+
+ // The function lex::less() is used to create a Phoenix actor allowing to
+ // implement functionality similar to flex' function yyless().
+ template <typename T>
+ inline typename expression::less<
+ typename phoenix::as_actor<T>::type
+ >::type const
+ less(T const& v)
+ {
+ return expression::less<T>::make(phoenix::as_actor<T>::convert(v));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The function object more_type is used by the implementation of the
+ // support function lex::more(). Its functionality is equivalent to flex'
+ // function yymore(): it tells the lexer that the next time it matches a
+ // rule, the corresponding token should be appended onto the current token
+ // value rather than replacing it.
+ //
+ // This Phoenix actor is invoked whenever the function lex::more(n) is
+ // used inside a lexer semantic action:
+ //
+ // lex::token_def<> identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
+ // this->self = identifier [ lex::more() ];
+ //
+ // The example shows how prefix the next matched token with the matched
+ // identifier.
+ struct more_type
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename Env>
+ void eval(Env const& env) const
+ {
+ fusion::at_c<4>(env.args()).more();
+ }
+ };
+
+ // The function lex::more() is used to create a Phoenix actor allowing to
+ // implement functionality similar to flex' function yymore().
+ //inline expression::more<mpl::void_>::type const
+ inline phoenix::actor<more_type> more()
+ {
+ return phoenix::actor<more_type>();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The function object lookahead_type is used by the implementation of the
+ // support function lex::lookahead(). Its functionality is needed to
+ // emulate the flex' lookahead operator a/b. Use lex::lookahead() inside
+ // of lexer semantic actions to test whether the argument to this function
+ // matches the current look ahead input. lex::lookahead() can be used with
+ // either a token id or a token_def instance as its argument. It returns
+ // a bool indicating whether the look ahead has been matched.
+ template <typename IdActor, typename StateActor>
+ struct lookahead_type
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef bool type;
+ };
+
+ template <typename Env>
+ bool eval(Env const& env) const
+ {
+ return fusion::at_c<4>(env.args()).
+ lookahead(id_actor_(), state_actor_());
+ }
+
+ lookahead_type(IdActor const& id_actor, StateActor const& state_actor)
+ : id_actor_(id_actor), state_actor_(state_actor) {}
+
+ IdActor id_actor_;
+ StateActor state_actor_;
+ };
+
+ // The function lex::lookahead() is used to create a Phoenix actor
+ // allowing to implement functionality similar to flex' lookahead operator
+ // a/b.
+ template <typename T>
+ inline typename expression::lookahead<
+ typename phoenix::as_actor<T>::type
+ , typename phoenix::as_actor<std::size_t>::type
+ >::type const
+ lookahead(T const& id)
+ {
+ typedef typename phoenix::as_actor<T>::type id_actor_type;
+ typedef typename phoenix::as_actor<std::size_t>::type state_actor_type;
+
+ return expression::lookahead<id_actor_type, state_actor_type>::make(
+ phoenix::as_actor<T>::convert(id),
+ phoenix::as_actor<std::size_t>::convert(std::size_t(~0)));
+ }
+
+ template <typename Attribute, typename Char, typename Idtype>
+ inline typename expression::lookahead<
+ typename phoenix::as_actor<Idtype>::type
+ , typename phoenix::as_actor<std::size_t>::type
+ >::type const
+ lookahead(token_def<Attribute, Char, Idtype> const& tok)
+ {
+ typedef typename phoenix::as_actor<Idtype>::type id_actor_type;
+ typedef typename phoenix::as_actor<std::size_t>::type state_actor_type;
+
+ std::size_t state = tok.state();
+
+ // The following assertion fires if you pass a token_def instance to
+ // lex::lookahead without first associating this instance with the
+ // lexer.
+ BOOST_ASSERT(std::size_t(~0) != state &&
+ "token_def instance not associated with lexer yet");
+
+ return expression::lookahead<id_actor_type, state_actor_type>::make(
+ phoenix::as_actor<Idtype>::convert(tok.id()),
+ phoenix::as_actor<std::size_t>::convert(state));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ inline BOOST_SCOPED_ENUM(pass_flags) ignore()
+ {
+ return pass_flags::pass_ignore;
+ }
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/support_functions_expression.hpp b/boost/spirit/home/lex/lexer/support_functions_expression.hpp
new file mode 100644
index 0000000000..613a4a4704
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/support_functions_expression.hpp
@@ -0,0 +1,135 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2011 Thomas Heller
+//
+// Distributed under the 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(SPIRIT_LEX_SUPPORT_FUNCTIONS_EXPRESSION_MAR_22_2011_0711PM)
+#define SPIRIT_LEX_SUPPORT_FUNCTIONS_EXPRESSION_MAR_22_2011_0711PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+
+namespace boost { namespace spirit { namespace lex
+{
+ template <typename> struct less_type;
+ struct more_type;
+ template <typename, typename> struct lookahead_type;
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+
+namespace boost { namespace spirit { namespace lex
+{
+ namespace expression
+ {
+ template <typename Eval>
+ struct less
+ {
+ typedef phoenix::actor<lex::less_type<Eval> > type;
+
+ static type make(Eval const & eval)
+ {
+ return lex::less_type<Eval>(eval);
+ }
+ };
+
+ template <typename IdType, typename State>
+ struct lookahead
+ {
+ typedef phoenix::actor<lex::lookahead_type<IdType, State> > type;
+
+ static type make(IdType const & id_type, State const & state)
+ {
+ return lex::lookahead_type<IdType, State>(id_type, state);
+ }
+ };
+ }
+}}}
+
+#else // BOOST_SPIRIT_USE_PHOENIX_V3
+
+BOOST_PHOENIX_DEFINE_EXPRESSION(
+ (boost)(spirit)(lex)(less)
+ , (boost::phoenix::meta_grammar)
+)
+
+BOOST_PHOENIX_DEFINE_EXPRESSION(
+ (boost)(spirit)(lex)(lookahead)
+ , (boost::phoenix::meta_grammar)
+ (boost::phoenix::meta_grammar)
+)
+
+namespace boost { namespace phoenix
+{
+
+ namespace result_of
+ {
+ template <>
+ struct is_nullary<custom_terminal<boost::spirit::lex::more_type> >
+ : mpl::false_
+ {};
+ }
+
+ template <typename Dummy>
+ struct is_custom_terminal<boost::spirit::lex::more_type, Dummy> : mpl::true_ {};
+
+ template <typename Dummy>
+ struct custom_terminal<boost::spirit::lex::more_type, Dummy>
+ : proto::call<
+ v2_eval(
+ proto::make<boost::spirit::lex::more_type()>
+ , proto::call<functional::env(proto::_state)>
+ )
+ >
+ {};
+
+
+ template <typename Dummy>
+ struct is_nullary::when<spirit::lex::rule::less, Dummy>
+ : proto::make<mpl::false_()>
+ {};
+
+ template <typename Dummy>
+ struct default_actions::when<spirit::lex::rule::less, Dummy>
+ : proto::call<
+ v2_eval(
+ proto::make<
+ spirit::lex::less_type<proto::_child0>(proto::_child0)
+ >
+ , _env
+ )
+ >
+ {};
+
+ template <typename Dummy>
+ struct is_nullary::when<spirit::lex::rule::lookahead, Dummy>
+ : proto::make<mpl::false_()>
+ {};
+
+ template <typename Dummy>
+ struct default_actions::when<spirit::lex::rule::lookahead, Dummy>
+ : proto::call<
+ v2_eval(
+ proto::make<
+ spirit::lex::lookahead_type<
+ proto::_child0
+ , proto::_child1
+ >(
+ proto::_child0
+ , proto::_child1
+ )
+ >
+ , _env
+ )
+ >
+ {};
+}}
+
+#endif // BOOST_SPIRIT_USE_PHOENIX_V3
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/terminals.hpp b/boost/spirit/home/lex/lexer/terminals.hpp
new file mode 100644
index 0000000000..b5059cc38c
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/terminals.hpp
@@ -0,0 +1,23 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_TERMINALS_APR_20_2009_0550PM)
+#define BOOST_SPIRIT_LEX_TERMINALS_APR_20_2009_0550PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Define a more convenient name for an omitted token attribute type
+ typedef spirit::omit_type omit;
+ using spirit::omit_type;
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/lexer/token_def.hpp b/boost/spirit/home/lex/lexer/token_def.hpp
new file mode 100644
index 0000000000..1bd2534505
--- /dev/null
+++ b/boost/spirit/home/lex/lexer/token_def.hpp
@@ -0,0 +1,246 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_TOKEN_DEF_MAR_13_2007_0145PM)
+#define BOOST_SPIRIT_LEX_TOKEN_DEF_MAR_13_2007_0145PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/detail/construct.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/lex/reference.hpp>
+#include <boost/spirit/home/lex/lexer_type.hpp>
+#include <boost/spirit/home/lex/lexer/terminals.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/detail/iterator.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/variant.hpp>
+
+#include <string>
+#include <cstdlib>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning
+#endif
+
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This component represents a token definition
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Attribute = unused_type
+ , typename Char = char
+ , typename Idtype = std::size_t>
+ struct token_def
+ : proto::extends<
+ typename proto::terminal<
+ lex::reference<token_def<Attribute, Char, Idtype> const, Idtype>
+ >::type
+ , token_def<Attribute, Char, Idtype> >
+ , qi::parser<token_def<Attribute, Char, Idtype> >
+ , lex::lexer_type<token_def<Attribute, Char, Idtype> >
+ {
+ private:
+ // initialize proto base class
+ typedef lex::reference<token_def const, Idtype> reference_;
+ typedef typename proto::terminal<reference_>::type terminal_type;
+ typedef proto::extends<terminal_type, token_def> proto_base_type;
+
+ static std::size_t const all_states_id = static_cast<std::size_t>(-2);
+
+ public:
+ // Qi interface: meta-function calculating parser return type
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // The return value of the token_def is either the specified
+ // attribute type, or the pair of iterators from the match of the
+ // corresponding token (if no attribute type has been specified),
+ // or unused_type (if omit has been specified).
+ typedef typename Iterator::base_iterator_type iterator_type;
+ typedef typename mpl::if_<
+ traits::not_is_unused<Attribute>
+ , typename mpl::if_<
+ is_same<Attribute, lex::omit>, unused_type, Attribute
+ >::type
+ , iterator_range<iterator_type>
+ >::type type;
+ };
+
+ public:
+ // Qi interface: parse functionality
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute_>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute_& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+
+ // If the following assertion fires you probably forgot to
+ // associate this token definition with a lexer instance.
+ BOOST_ASSERT(std::size_t(~0) != token_state_);
+
+ token_type const& t = *first;
+ if (token_id_ == t.id() &&
+ (all_states_id == token_state_ || token_state_ == t.state()))
+ {
+ spirit::traits::assign_to(t, attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ if (0 == def_.which())
+ return info("token_def", boost::get<string_type>(def_));
+
+ return info("token_def", boost::get<char_type>(def_));
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Lex interface: collect token definitions and put it into the
+ // provided lexer def
+ template <typename LexerDef, typename String>
+ void collect(LexerDef& lexdef, String const& state
+ , String const& targetstate) const
+ {
+ std::size_t state_id = lexdef.add_state(state.c_str());
+
+ // If the following assertion fires you are probably trying to use
+ // a single token_def instance in more than one lexer state. This
+ // is not possible. Please create a separate token_def instance
+ // from the same regular expression for each lexer state it needs
+ // to be associated with.
+ BOOST_ASSERT(
+ (std::size_t(~0) == token_state_ || state_id == token_state_) &&
+ "Can't use single token_def with more than one lexer state");
+
+ char_type const* target = targetstate.empty() ? 0 : targetstate.c_str();
+ if (target)
+ lexdef.add_state(target);
+
+ token_state_ = state_id;
+ if (0 == token_id_)
+ token_id_ = lexdef.get_next_id();
+
+ if (0 == def_.which()) {
+ unique_id_ = lexdef.add_token(state.c_str()
+ , boost::get<string_type>(def_), token_id_, target);
+ }
+ else {
+ unique_id_ = lexdef.add_token(state.c_str()
+ , boost::get<char_type>(def_), token_id_, target);
+ }
+ }
+
+ template <typename LexerDef>
+ void add_actions(LexerDef&) const {}
+
+ public:
+ typedef Char char_type;
+ typedef Idtype id_type;
+ typedef std::basic_string<char_type> string_type;
+
+ // Lex interface: constructing token definitions
+ token_def()
+ : proto_base_type(terminal_type::make(reference_(*this)))
+ , def_('\0'), token_id_()
+ , unique_id_(std::size_t(~0)), token_state_(std::size_t(~0)) {}
+
+ token_def(token_def const& rhs)
+ : proto_base_type(terminal_type::make(reference_(*this)))
+ , def_(rhs.def_), token_id_(rhs.token_id_)
+ , unique_id_(rhs.unique_id_), token_state_(rhs.token_state_) {}
+
+ explicit token_def(char_type def_, Idtype id_ = Idtype())
+ : proto_base_type(terminal_type::make(reference_(*this)))
+ , def_(def_)
+ , token_id_(Idtype() == id_ ? Idtype(def_) : id_)
+ , unique_id_(std::size_t(~0)), token_state_(std::size_t(~0)) {}
+
+ explicit token_def(string_type const& def_, Idtype id_ = Idtype())
+ : proto_base_type(terminal_type::make(reference_(*this)))
+ , def_(def_), token_id_(id_)
+ , unique_id_(std::size_t(~0)), token_state_(std::size_t(~0)) {}
+
+ template <typename String>
+ token_def& operator= (String const& definition)
+ {
+ def_ = definition;
+ token_id_ = Idtype();
+ unique_id_ = std::size_t(~0);
+ token_state_ = std::size_t(~0);
+ return *this;
+ }
+ token_def& operator= (token_def const& rhs)
+ {
+ def_ = rhs.def_;
+ token_id_ = rhs.token_id_;
+ unique_id_ = rhs.unique_id_;
+ token_state_ = rhs.token_state_;
+ return *this;
+ }
+
+ // general accessors
+ Idtype const& id() const { return token_id_; }
+ void id(Idtype const& id) { token_id_ = id; }
+ std::size_t unique_id() const { return unique_id_; }
+
+ string_type definition() const
+ {
+ return (0 == def_.which()) ?
+ boost::get<string_type>(def_) :
+ string_type(1, boost::get<char_type>(def_));
+ }
+ std::size_t state() const { return token_state_; }
+
+ private:
+ variant<string_type, char_type> def_;
+ mutable Idtype token_id_;
+ mutable std::size_t unique_id_;
+ mutable std::size_t token_state_;
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Attribute, typename Char, typename Idtype
+ , typename Attr, typename Context, typename Iterator>
+ struct handles_container<
+ lex::token_def<Attribute, Char, Idtype>, Attr, Context, Iterator>
+ : traits::is_container<
+ typename attribute_of<
+ lex::token_def<Attribute, Char, Idtype>, Context, Iterator
+ >::type>
+ {};
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/lex/lexer_lexertl.hpp b/boost/spirit/home/lex/lexer_lexertl.hpp
new file mode 100644
index 0000000000..0706bd99c2
--- /dev/null
+++ b/boost/spirit/home/lex/lexer_lexertl.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_LEXERTL_MAR_17_2007_1008PM)
+#define BOOST_SPIRIT_LEX_LEXERTL_MAR_17_2007_1008PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+// These includes make available everything needed to use lexertl either
+// standalone or as a lexer component for spirit::qi
+#include <boost/spirit/home/lex.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/lexer.hpp>
+
+#endif
diff --git a/boost/spirit/home/lex/lexer_static_lexertl.hpp b/boost/spirit/home/lex/lexer_static_lexertl.hpp
new file mode 100644
index 0000000000..e95976093b
--- /dev/null
+++ b/boost/spirit/home/lex/lexer_static_lexertl.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_STATIC_LEXERTL_FEB_11_2008_1045AM)
+#define BOOST_SPIRIT_LEX_STATIC_LEXERTL_FEB_11_2008_1045AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+// These includes make available everything needed to use lexertl either
+// standalone or as a lexer component for spirit::qi
+#include <boost/spirit/home/lex.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp>
+
+#endif
diff --git a/boost/spirit/home/lex/lexer_type.hpp b/boost/spirit/home/lex/lexer_type.hpp
new file mode 100644
index 0000000000..e58bce0de1
--- /dev/null
+++ b/boost/spirit/home/lex/lexer_type.hpp
@@ -0,0 +1,100 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_LEXER_TYPE_APR_20_2009_0759PM)
+#define BOOST_SPIRIT_LEXER_TYPE_APR_20_2009_0759PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/spirit/home/lex/domain.hpp>
+
+namespace boost { namespace spirit { namespace lex
+{
+ template <typename Derived>
+ struct lexer_type
+ {
+ struct lexer_id;
+ typedef Derived derived_type;
+ typedef lex::domain domain;
+
+ // Requirement: l.collect(def, state, targetstate) -> void
+ //
+ // l: a lexer component
+ // def: token definition container
+ // state: lexer state this token definition needs to be added to
+ // targetstate: an optional lexer state the lexer should be switched
+ // into after matching this token
+
+ Derived const& derived() const
+ {
+ return *static_cast<Derived const*>(this);
+ }
+ };
+
+ template <typename Derived>
+ struct primitive_lexer : lexer_type<Derived>
+ {
+ struct primitive_lexer_id;
+ };
+
+ template <typename Derived>
+ struct unary_lexer : lexer_type<Derived>
+ {
+ struct unary_lexer_id;
+
+ // Requirement: l.subject -> subject lexer component
+ //
+ // l: a unary lexer component
+
+ // Requirement: L::subject_type -> subject lexer component type
+ //
+ // L: a unary lexer component type
+ };
+
+ template <typename Derived>
+ struct nary_lexer : lexer_type<Derived>
+ {
+ struct nary_lexer_id;
+
+ // Requirement: l.elements -> fusion sequence
+ //
+ // l: a composite lexer component
+
+ // Requirement: L::elements_type -> fusion sequence
+ //
+ // L: a composite lexer component type
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits // classification
+{
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(lexer_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(primitive_lexer_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(unary_lexer_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(nary_lexer_id)
+ }
+
+ template <typename T>
+ struct is_lexer : detail::has_lexer_id<T> {};
+
+ template <typename T>
+ struct is_primitive_lexer : detail::has_primitive_lexer_id<T> {};
+
+ template <typename T>
+ struct is_unary_lexer : detail::has_unary_lexer_id<T> {};
+
+ template <typename T>
+ struct is_nary_lexer : detail::has_nary_lexer_id<T> {};
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/meta_compiler.hpp b/boost/spirit/home/lex/meta_compiler.hpp
new file mode 100644
index 0000000000..6e13d37854
--- /dev/null
+++ b/boost/spirit/home/lex/meta_compiler.hpp
@@ -0,0 +1,104 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_LEX_META_COMPILER_APR_20_2009_0756PM)
+#define BOOST_SPIRIT_LEX_META_COMPILER_APR_20_2009_0756PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/meta_compiler.hpp>
+#include <boost/spirit/home/lex/domain.hpp>
+#include <boost/spirit/home/lex/lexer_type.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit
+{
+ template <typename T>
+ struct use_terminal<lex::domain, T
+ , typename enable_if<traits::is_lexer<T> >::type> // enables lexers
+ : mpl::true_ {};
+
+ namespace lex
+ {
+ template <typename T, typename Modifiers, typename Enable = void>
+ struct make_primitive // by default, return it as-is
+ {
+ typedef T result_type;
+
+ template <typename T_>
+ T_& operator()(T_& val, unused_type) const
+ {
+ return val;
+ }
+
+ template <typename T_>
+ T_ const& operator()(T_ const& val, unused_type) const
+ {
+ return val;
+ }
+ };
+
+ template <typename Tag, typename Elements
+ , typename Modifiers, typename Enable = void>
+ struct make_composite;
+ }
+
+ // Lex primitive meta-compiler
+ template <>
+ struct make_component<lex::domain, proto::tag::terminal>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename lex::make_primitive<
+ typename remove_const<typename Elements::car_type>::type,
+ typename remove_reference<Modifiers>::type>::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ typedef typename remove_const<typename Elements::car_type>::type term;
+ return lex::make_primitive<term, Modifiers>()(elements.car, modifiers);
+ }
+ };
+
+ // Lex composite meta-compiler
+ template <typename Tag>
+ struct make_component<lex::domain, Tag>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ lex::make_composite<Tag, Elements
+ , typename remove_reference<Modifiers>::type>::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ return lex::make_composite<Tag, Elements, Modifiers>()(
+ elements, modifiers);
+ }
+ };
+
+}}
+
+#endif
diff --git a/boost/spirit/home/lex/primitives.hpp b/boost/spirit/home/lex/primitives.hpp
new file mode 100644
index 0000000000..226ce232c4
--- /dev/null
+++ b/boost/spirit/home/lex/primitives.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEXER_PRIMITIVES_SEP_12_2009_0234PM)
+#define BOOST_SPIRIT_LEXER_PRIMITIVES_SEP_12_2009_0234PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer/char_token_def.hpp>
+#include <boost/spirit/home/lex/lexer/string_token_def.hpp>
+
+#endif
diff --git a/boost/spirit/home/lex/qi.hpp b/boost/spirit/home/lex/qi.hpp
new file mode 100644
index 0000000000..3b4e704615
--- /dev/null
+++ b/boost/spirit/home/lex/qi.hpp
@@ -0,0 +1,20 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEXER_QI_APR_21_2009_0205PM)
+#define BOOST_SPIRIT_LEXER_QI_APR_21_2009_0205PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/qi/state_switcher.hpp>
+#include <boost/spirit/home/lex/qi/in_state.hpp>
+#include <boost/spirit/home/lex/qi/plain_token.hpp>
+#include <boost/spirit/home/lex/qi/plain_tokenid.hpp>
+#include <boost/spirit/home/lex/qi/plain_tokenid_mask.hpp>
+#include <boost/spirit/home/lex/qi/plain_raw_token.hpp>
+
+#endif
diff --git a/boost/spirit/home/lex/qi/in_state.hpp b/boost/spirit/home/lex/qi/in_state.hpp
new file mode 100644
index 0000000000..fe7580bb55
--- /dev/null
+++ b/boost/spirit/home/lex/qi/in_state.hpp
@@ -0,0 +1,32 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_IN_STATE_OCT_09_2007_0748PM)
+#define BOOST_SPIRIT_LEX_IN_STATE_OCT_09_2007_0748PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/proto/core.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The following is a helper template allowing to use the in_state()[] as
+ // a skip parser
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Skipper, typename String = char const*>
+ struct in_state_skipper
+ : proto::subscript<
+ typename proto::terminal<
+ terminal_ex<tag::in_state, fusion::vector1<String> >
+ >::type
+ , Skipper
+ >::type {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/qi/plain_raw_token.hpp b/boost/spirit/home/lex/qi/plain_raw_token.hpp
new file mode 100644
index 0000000000..ebe980de86
--- /dev/null
+++ b/boost/spirit/home/lex/qi/plain_raw_token.hpp
@@ -0,0 +1,149 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_PLAIN_RAW_TOKEN_JUN_03_2011_0853PM)
+#define BOOST_SPIRIT_LEX_PLAIN_RAW_TOKEN_JUN_03_2011_0853PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables raw_token
+ template <>
+ struct use_terminal<qi::domain, tag::raw_token>
+ : mpl::true_ {};
+
+ // enables raw_token(id)
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::raw_token, fusion::vector1<A0> >
+ > : mpl::or_<is_integral<A0>, is_enum<A0> > {};
+
+ // enables *lazy* raw_token(id)
+ template <>
+ struct use_lazy_terminal<
+ qi::domain, tag::raw_token, 1
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::raw_token;
+#endif
+ using spirit::raw_token_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename TokenId>
+ struct plain_raw_token
+ : primitive_parser<plain_raw_token<TokenId> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ plain_raw_token(TokenId const& id)
+ : id(id) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ // simply match the token id with the id this component has
+ // been initialized with
+
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+ typedef typename token_type::id_type id_type;
+
+ token_type const& t = *first;
+ if (id_type(~0) == id_type(id) || id_type(id) == t.id()) {
+ spirit::traits::assign_to(t, attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("raw_token",
+ "raw_token(" + boost::lexical_cast<utf8_string>(id) + ")");
+ }
+
+ TokenId id;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::raw_token, Modifiers>
+ {
+ typedef plain_raw_token<std::size_t> result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type(std::size_t(~0));
+ }
+ };
+
+ template <typename Modifiers, typename TokenId>
+ struct make_primitive<terminal_ex<tag::raw_token, fusion::vector1<TokenId> >
+ , Modifiers>
+ {
+ typedef plain_raw_token<TokenId> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Idtype, typename Attr, typename Context, typename Iterator>
+ struct handles_container<qi::plain_raw_token<Idtype>, Attr, Context, Iterator>
+ : mpl::true_
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/qi/plain_token.hpp b/boost/spirit/home/lex/qi/plain_token.hpp
new file mode 100644
index 0000000000..b77e2a9548
--- /dev/null
+++ b/boost/spirit/home/lex/qi/plain_token.hpp
@@ -0,0 +1,242 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_PLAIN_TOKEN_NOV_11_2007_0451PM)
+#define BOOST_SPIRIT_LEX_PLAIN_TOKEN_NOV_11_2007_0451PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables token
+ template <>
+ struct use_terminal<qi::domain, tag::token>
+ : mpl::true_ {};
+
+ // enables token(id)
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::token, fusion::vector1<A0> >
+ > : mpl::or_<is_integral<A0>, is_enum<A0> > {};
+
+ // enables token(idmin, idmax)
+ template <typename A0, typename A1>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::token, fusion::vector2<A0, A1> >
+ > : mpl::and_<
+ mpl::or_<is_integral<A0>, is_enum<A0> >
+ , mpl::or_<is_integral<A1>, is_enum<A1> >
+ > {};
+
+ // enables *lazy* token(id)
+ template <>
+ struct use_lazy_terminal<
+ qi::domain, tag::token, 1
+ > : mpl::true_ {};
+
+ // enables *lazy* token(idmin, idmax)
+ template <>
+ struct use_lazy_terminal<
+ qi::domain, tag::token, 2
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::token;
+#endif
+ using spirit::token_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename TokenId>
+ struct plain_token
+ : primitive_parser<plain_token<TokenId> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename Iterator::base_iterator_type iterator_type;
+ typedef iterator_range<iterator_type> type;
+ };
+
+ plain_token(TokenId const& id)
+ : id(id) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ // simply match the token id with the id this component has
+ // been initialized with
+
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+ typedef typename token_type::id_type id_type;
+
+ token_type const& t = *first;
+ if (id_type(~0) == id_type(id) || id_type(id) == t.id()) {
+ spirit::traits::assign_to(t, attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("token",
+ "token(" + boost::lexical_cast<utf8_string>(id) + ")");
+ }
+
+ TokenId id;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename TokenId>
+ struct plain_token_range
+ : primitive_parser<plain_token_range<TokenId> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename Iterator::base_iterator_type iterator_type;
+ typedef iterator_range<iterator_type> type;
+ };
+
+ plain_token_range(TokenId const& idmin, TokenId const& idmax)
+ : idmin(idmin), idmax(idmax) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ // simply match the token id with the id this component has
+ // been initialized with
+
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+ typedef typename token_type::id_type id_type;
+
+ token_type const& t = *first;
+ if (id_type(idmin) >= t.id() && id_type(idmin) <= t.id())
+ {
+ spirit::traits::assign_to(t, attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("token_range"
+ , "token(" +
+ boost::lexical_cast<utf8_string>(idmin) + ", " +
+ boost::lexical_cast<utf8_string>(idmax) + ")"
+ );
+ return info("token_range");
+ }
+
+ TokenId idmin, idmax;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::token, Modifiers>
+ {
+ typedef plain_token<std::size_t> result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type(std::size_t(~0));
+ }
+ };
+
+ template <typename Modifiers, typename TokenId>
+ struct make_primitive<terminal_ex<tag::token, fusion::vector1<TokenId> >
+ , Modifiers>
+ {
+ typedef plain_token<TokenId> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ template <typename Modifiers, typename TokenId>
+ struct make_primitive<terminal_ex<tag::token, fusion::vector2<TokenId, TokenId> >
+ , Modifiers>
+ {
+ typedef plain_token_range<TokenId> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args));
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Idtype, typename Attr, typename Context, typename Iterator>
+ struct handles_container<qi::plain_token<Idtype>, Attr, Context, Iterator>
+ : mpl::true_
+ {};
+
+ template<typename Idtype, typename Attr, typename Context, typename Iterator>
+ struct handles_container<qi::plain_token_range<Idtype>, Attr, Context, Iterator>
+ : mpl::true_
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/qi/plain_tokenid.hpp b/boost/spirit/home/lex/qi/plain_tokenid.hpp
new file mode 100644
index 0000000000..7a70c77581
--- /dev/null
+++ b/boost/spirit/home/lex/qi/plain_tokenid.hpp
@@ -0,0 +1,242 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_PLAIN_TOKENID_NOV_26_2010_0944AM)
+#define BOOST_SPIRIT_LEX_PLAIN_TOKENID_NOV_26_2010_0944AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables tokenid
+ template <>
+ struct use_terminal<qi::domain, tag::tokenid>
+ : mpl::true_ {};
+
+ // enables tokenid(id)
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::tokenid, fusion::vector1<A0> >
+ > : mpl::or_<is_integral<A0>, is_enum<A0> > {};
+
+ // enables tokenid(idmin, idmax)
+ template <typename A0, typename A1>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::tokenid, fusion::vector2<A0, A1> >
+ > : mpl::and_<
+ mpl::or_<is_integral<A0>, is_enum<A0> >
+ , mpl::or_<is_integral<A1>, is_enum<A1> >
+ > {};
+
+ // enables *lazy* tokenid(id)
+ template <>
+ struct use_lazy_terminal<
+ qi::domain, tag::tokenid, 1
+ > : mpl::true_ {};
+
+ // enables *lazy* tokenid(idmin, idmax)
+ template <>
+ struct use_lazy_terminal<
+ qi::domain, tag::tokenid, 2
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::tokenid;
+#endif
+ using spirit::tokenid_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The plain_tokenid represents a simple token defined by the lexer inside
+ // a Qi grammar. The difference to plain_token is that it exposes the
+ // matched token id instead of the iterator_range of the matched input.
+ template <typename TokenId>
+ struct plain_tokenid
+ : primitive_parser<plain_tokenid<TokenId> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef TokenId type;
+ };
+
+ plain_tokenid(TokenId const& id)
+ : id(id) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ // simply match the token id with the id this component has
+ // been initialized with
+
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+ typedef typename token_type::id_type id_type;
+
+ token_type const& t = *first;
+ if (id_type(~0) == id_type(id) || id_type(id) == t.id()) {
+ spirit::traits::assign_to(id, attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("tokenid",
+ "tokenid(" + boost::lexical_cast<utf8_string>(id) + ")");
+ }
+
+ TokenId id;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename TokenId>
+ struct plain_tokenid_range
+ : primitive_parser<plain_tokenid_range<TokenId> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef TokenId type;
+ };
+
+ plain_tokenid_range(TokenId const& idmin, TokenId const& idmax)
+ : idmin(idmin), idmax(idmax) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ // simply match the token id with the id this component has
+ // been initialized with
+
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+ typedef typename token_type::id_type id_type;
+
+ token_type const& t = *first;
+ if (id_type(idmin) >= t.id() && id_type(idmin) <= t.id())
+ {
+ spirit::traits::assign_to(t.id(), attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("tokenid_range"
+ , "token(" +
+ boost::lexical_cast<utf8_string>(idmin) + ", " +
+ boost::lexical_cast<utf8_string>(idmax) + ")"
+ );
+ }
+
+ TokenId idmin, idmax;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::tokenid, Modifiers>
+ {
+ typedef plain_tokenid<std::size_t> result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type(std::size_t(~0));
+ }
+ };
+
+ template <typename Modifiers, typename TokenId>
+ struct make_primitive<terminal_ex<tag::tokenid, fusion::vector1<TokenId> >
+ , Modifiers>
+ {
+ typedef plain_tokenid<TokenId> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ template <typename Modifiers, typename TokenId>
+ struct make_primitive<terminal_ex<tag::tokenid, fusion::vector2<TokenId, TokenId> >
+ , Modifiers>
+ {
+ typedef plain_tokenid_range<TokenId> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args));
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Idtype, typename Attr, typename Context, typename Iterator>
+ struct handles_container<qi::plain_tokenid<Idtype>, Attr, Context, Iterator>
+ : mpl::true_
+ {};
+
+ template<typename Idtype, typename Attr, typename Context, typename Iterator>
+ struct handles_container<qi::plain_tokenid_range<Idtype>, Attr, Context, Iterator>
+ : mpl::true_
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/qi/plain_tokenid_mask.hpp b/boost/spirit/home/lex/qi/plain_tokenid_mask.hpp
new file mode 100644
index 0000000000..92ac1268cc
--- /dev/null
+++ b/boost/spirit/home/lex/qi/plain_tokenid_mask.hpp
@@ -0,0 +1,138 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEX_PLAIN_TOKENID_MASK_JUN_03_2011_0929PM)
+#define BOOST_SPIRIT_LEX_PLAIN_TOKENID_MASK_JUN_03_2011_0929PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables tokenid_mask(id)
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::tokenid_mask, fusion::vector1<A0> >
+ > : mpl::or_<is_integral<A0>, is_enum<A0> > {};
+
+ // enables *lazy* tokenid_mask(id)
+ template <>
+ struct use_lazy_terminal<
+ qi::domain, tag::tokenid_mask, 1
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::tokenid_mask;
+#endif
+ using spirit::tokenid_mask_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The plain_tokenid represents a simple token defined by the lexer inside
+ // a Qi grammar. The difference to plain_token is that it exposes the
+ // matched token id instead of the iterator_range of the matched input.
+ // Additionally it applies the given mask to the matched token id.
+ template <typename Mask>
+ struct plain_tokenid_mask
+ : primitive_parser<plain_tokenid_mask<Mask> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef Mask type;
+ };
+
+ plain_tokenid_mask(Mask const& mask)
+ : mask(mask) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ // simply match the token id with the mask this component has
+ // been initialized with
+
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+ typedef typename token_type::id_type id_type;
+
+ token_type const& t = *first;
+ if ((t.id() & mask) == id_type(mask))
+ {
+ spirit::traits::assign_to(t.id(), attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("tokenid_mask",
+ "tokenid_mask(" + boost::lexical_cast<utf8_string>(mask) + ")");
+ }
+
+ Mask mask;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename Mask>
+ struct make_primitive<terminal_ex<tag::tokenid_mask, fusion::vector1<Mask> >
+ , Modifiers>
+ {
+ typedef plain_tokenid_mask<Mask> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Mask, typename Attr, typename Context, typename Iterator>
+ struct handles_container<qi::plain_tokenid_mask<Mask>, Attr, Context, Iterator>
+ : mpl::true_
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/qi/state_switcher.hpp b/boost/spirit/home/lex/qi/state_switcher.hpp
new file mode 100644
index 0000000000..a8fd55a352
--- /dev/null
+++ b/boost/spirit/home/lex/qi/state_switcher.hpp
@@ -0,0 +1,270 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// 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)
+
+#if !defined(BOOST_SPIRIT_LEX_STATE_SWITCHER_SEP_23_2007_0714PM)
+#define BOOST_SPIRIT_LEX_STATE_SWITCHER_SEP_23_2007_0714PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/mpl/print.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables set_state(s)
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::set_state, fusion::vector1<A0> >
+ > : traits::is_string<A0> {};
+
+ // enables *lazy* set_state(s)
+ template <>
+ struct use_lazy_terminal<
+ qi::domain, tag::set_state, 1
+ > : mpl::true_ {};
+
+ // enables in_state(s)[p]
+ template <typename A0>
+ struct use_directive<qi::domain
+ , terminal_ex<tag::in_state, fusion::vector1<A0> >
+ > : traits::is_string<A0> {};
+
+ // enables *lazy* in_state(s)[p]
+ template <>
+ struct use_lazy_directive<
+ qi::domain, tag::in_state, 1
+ > : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::set_state;
+ using spirit::in_state;
+#endif
+ using spirit::set_state_type;
+ using spirit::in_state_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Iterator>
+ inline std::size_t
+ set_lexer_state(Iterator& it, std::size_t state)
+ {
+ return it.set_state(state);
+ }
+
+ template <typename Iterator, typename Char>
+ inline std::size_t
+ set_lexer_state(Iterator& it, Char const* statename)
+ {
+ std::size_t state = it.map_state(statename);
+
+ // If the following assertion fires you probably used the
+ // set_state(...) or in_state(...)[...] lexer state switcher with
+ // a lexer state name unknown to the lexer (no token definitions
+ // have been associated with this lexer state).
+ BOOST_ASSERT(std::size_t(~0) != state);
+ return it.set_state(state);
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser switching the state of the underlying lexer component.
+ // This parser gets used for the set_state(...) construct.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename State>
+ struct state_switcher
+ : primitive_parser<state_switcher<State> >
+ {
+ typedef typename
+ remove_const<typename traits::char_type_of<State>::type>::type
+ char_type;
+ typedef std::basic_string<char_type> string_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ state_switcher(char_type const* state)
+ : state(state) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& /*attr*/) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ // just switch the state and return success
+ detail::set_lexer_state(first, state.c_str());
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("set_state");
+ }
+
+ string_type state;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Iterator>
+ struct reset_state_on_exit
+ {
+ template <typename State>
+ reset_state_on_exit(Iterator& it_, State state_)
+ : it(it_)
+ , state(set_lexer_state(it_, traits::get_c_string(state_)))
+ {}
+
+ ~reset_state_on_exit()
+ {
+ // reset the state of the underlying lexer instance
+ set_lexer_state(it, state);
+ }
+
+ Iterator& it;
+ std::size_t state;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ reset_state_on_exit& operator= (reset_state_on_exit const&);
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser, which switches the state of the underlying lexer component
+ // for the execution of the embedded sub-parser, switching the state back
+ // afterwards. This parser gets used for the in_state(...)[p] construct.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename State>
+ struct state_switcher_context
+ : unary_parser<state_switcher_context<Subject, State> >
+ {
+ typedef Subject subject_type;
+ typedef typename traits::char_type_of<State>::type char_type;
+ typedef typename remove_const<char_type>::type non_const_char_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::attribute_of<subject_type, Context, Iterator>::type
+ type;
+ };
+
+ state_switcher_context(Subject const& subject
+ , typename add_reference<State>::type state)
+ : subject(subject), state(state) {}
+
+ // The following conversion constructors are needed to make the
+ // in_state_switcher template usable
+ template <typename String>
+ state_switcher_context(
+ state_switcher_context<Subject, String> const& rhs)
+ : subject(rhs.subject), state(traits::get_c_string(rhs.state)) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ // the state has to be reset at exit in any case
+ detail::reset_state_on_exit<Iterator> guard(first, state);
+ return subject.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("in_state", subject.what(context));
+ }
+
+ Subject subject;
+ State state;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ state_switcher_context& operator= (state_switcher_context const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename State>
+ struct make_primitive<terminal_ex<tag::set_state, fusion::vector1<State> >
+ , Modifiers, typename enable_if<traits::is_string<State> >::type>
+ {
+ typedef typename add_const<State>::type const_string;
+ typedef state_switcher<const_string> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(traits::get_c_string(fusion::at_c<0>(term.args)));
+ }
+ };
+
+ template <typename State, typename Subject, typename Modifiers>
+ struct make_directive<terminal_ex<tag::in_state, fusion::vector1<State> >
+ , Subject, Modifiers>
+ {
+ typedef typename add_const<State>::type const_string;
+ typedef state_switcher_context<Subject, const_string> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename State>
+ struct has_semantic_action<qi::state_switcher_context<Subject, State> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename State, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::state_switcher_context<Subject, State>
+ , Attribute, Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/reference.hpp b/boost/spirit/home/lex/reference.hpp
new file mode 100644
index 0000000000..d1aaabf19f
--- /dev/null
+++ b/boost/spirit/home/lex/reference.hpp
@@ -0,0 +1,85 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_LEX_REFERENCE_APR_20_2009_0827AM)
+#define BOOST_SPIRIT_LEX_REFERENCE_APR_20_2009_0827AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/meta_compiler.hpp>
+#include <boost/spirit/home/lex/lexer_type.hpp>
+#include <boost/spirit/home/qi/reference.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/ref.hpp>
+
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // reference is a lexer that references another lexer (its Subject)
+ // all lexer components are at the same time
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename IdType = unused_type>
+ struct reference;
+
+ template <typename Subject>
+ struct reference<Subject, unused_type>
+ : qi::reference<Subject>
+ , lexer_type<reference<Subject> >
+ {
+ reference(Subject& subject)
+ : qi::reference<Subject>(subject) {}
+
+ template <typename LexerDef, typename String>
+ void collect(LexerDef& lexdef, String const& state
+ , String const& targetstate) const
+ {
+ this->ref.get().collect(lexdef, state, targetstate);
+ }
+
+ template <typename LexerDef>
+ void add_actions(LexerDef& lexdef) const
+ {
+ this->ref.get().add_actions(lexdef);
+ }
+ };
+
+ template <typename Subject, typename IdType>
+ struct reference : reference<Subject>
+ {
+ reference(Subject& subject)
+ : reference<Subject>(subject) {}
+
+ IdType id() const
+ {
+ return this->ref.get().id();
+ }
+ std::size_t unique_id() const
+ {
+ return this->ref.get().unique_id();
+ }
+ std::size_t state() const
+ {
+ return this->ref.get().state();
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename IdType
+ , typename Attribute, typename Context, typename Iterator>
+ struct handles_container<lex::reference<Subject, IdType>
+ , Attribute, Context, Iterator>
+ : handles_container<
+ typename remove_const<Subject>::type, Attribute, Context, Iterator>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/tokenize_and_parse.hpp b/boost/spirit/home/lex/tokenize_and_parse.hpp
new file mode 100644
index 0000000000..db12935a83
--- /dev/null
+++ b/boost/spirit/home/lex/tokenize_and_parse.hpp
@@ -0,0 +1,325 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_LEXER_PARSE_NOV_17_2007_0246PM)
+#define BOOST_SPIRIT_LEXER_PARSE_NOV_17_2007_0246PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parse.hpp>
+#include <boost/spirit/home/qi/nonterminal/grammar.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/lex/lexer.hpp>
+#include <boost/mpl/assert.hpp>
+
+namespace boost { namespace spirit { namespace lex
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Import skip_flag enumerator type from Qi namespace
+ using qi::skip_flag;
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The tokenize_and_parse() function is one of the main Spirit API
+ // functions. It simplifies using a lexer as the underlying token source
+ // while parsing a given input sequence.
+ //
+ // The function takes a pair of iterators spanning the underlying input
+ // stream to parse, the lexer object (built from the token definitions)
+ // and a parser object (built from the parser grammar definition).
+ //
+ // The second version of this function additionally takes an attribute to
+ // be used as the top level data structure instance the parser should use
+ // to store the recognized input to.
+ //
+ // The function returns true if the parsing succeeded (the given input
+ // sequence has been successfully matched by the given grammar).
+ //
+ // first, last: The pair of iterators spanning the underlying input
+ // sequence to parse. These iterators must at least
+ // conform to the requirements of the std::intput_iterator
+ // category.
+ // On exit the iterator 'first' will be updated to the
+ // position right after the last successfully matched
+ // token.
+ // lex: The lexer object (encoding the token definitions) to be
+ // used to convert the input sequence into a sequence of
+ // tokens. This token sequence is passed to the parsing
+ // process. The LexerExpr type must conform to the
+ // lexer interface described in the corresponding section
+ // of the documentation.
+ // xpr: The grammar object (encoding the parser grammar) to be
+ // used to match the token sequence generated by the lex
+ // object instance. The ParserExpr type must conform to
+ // the grammar interface described in the corresponding
+ // section of the documentation.
+ // attr: The top level attribute passed to the parser. It will
+ // be populated during the parsing of the input sequence.
+ // On exit it will hold the 'parser result' corresponding
+ // to the matched input sequence.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Lexer, typename ParserExpr>
+ inline bool
+ tokenize_and_parse(Iterator& first, Iterator last, Lexer const& lex,
+ ParserExpr const& xpr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, ParserExpr);
+
+ typename Lexer::iterator_type iter = lex.begin(first, last);
+ return compile<qi::domain>(xpr).parse(
+ iter, lex.end(), unused, unused, unused);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Lexer, typename ParserExpr
+ , typename Attribute>
+ inline bool
+ tokenize_and_parse(Iterator& first, Iterator last, Lexer const& lex
+ , ParserExpr const& xpr, Attribute& attr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, ParserExpr);
+
+ typename Lexer::iterator_type iter = lex.begin(first, last);
+ return compile<qi::domain>(xpr).parse(
+ iter, lex.end(), unused, unused, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The tokenize_and_phrase_parse() function is one of the main Spirit API
+ // functions. It simplifies using a lexer as the underlying token source
+ // while phrase parsing a given input sequence.
+ //
+ // The function takes a pair of iterators spanning the underlying input
+ // stream to parse, the lexer object (built from the token definitions)
+ // and a parser object (built from the parser grammar definition). The
+ // additional skipper parameter will be used as the skip parser during
+ // the parsing process.
+ //
+ // The second version of this function additionally takes an attribute to
+ // be used as the top level data structure instance the parser should use
+ // to store the recognized input to.
+ //
+ // The function returns true if the parsing succeeded (the given input
+ // sequence has been successfully matched by the given grammar).
+ //
+ // first, last: The pair of iterators spanning the underlying input
+ // sequence to parse. These iterators must at least
+ // conform to the requirements of the std::intput_iterator
+ // category.
+ // On exit the iterator 'first' will be updated to the
+ // position right after the last successfully matched
+ // token.
+ // lex: The lexer object (encoding the token definitions) to be
+ // used to convert the input sequence into a sequence of
+ // tokens. This token sequence is passed to the parsing
+ // process. The LexerExpr type must conform to the
+ // lexer interface described in the corresponding section
+ // of the documentation.
+ // xpr: The grammar object (encoding the parser grammar) to be
+ // used to match the token sequence generated by the lex
+ // object instance. The ParserExpr type must conform to
+ // the grammar interface described in the corresponding
+ // section of the documentation.
+ // skipper: The skip parser to be used while parsing the given
+ // input sequence. Note, the skip parser will have to
+ // act on the same token sequence as the main parser
+ // 'xpr'.
+ // post_skip: The post_skip flag controls whether the function will
+ // invoke an additional post skip after the main parser
+ // returned.
+ // attr: The top level attribute passed to the parser. It will
+ // be populated during the parsing of the input sequence.
+ // On exit it will hold the 'parser result' corresponding
+ // to the matched input sequence.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Lexer, typename ParserExpr
+ , typename Skipper>
+ inline bool
+ tokenize_and_phrase_parse(Iterator& first, Iterator last
+ , Lexer const& lex, ParserExpr const& xpr, Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, ParserExpr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+
+ typedef
+ typename spirit::result_of::compile<qi::domain, Skipper>::type
+ skipper_type;
+ skipper_type const skipper_ = compile<qi::domain>(skipper);
+
+ typename Lexer::iterator_type iter = lex.begin(first, last);
+ typename Lexer::iterator_type end = lex.end();
+ if (!compile<qi::domain>(xpr).parse(
+ iter, end, unused, skipper_, unused))
+ return false;
+
+ // do a final post-skip
+ if (post_skip == skip_flag::postskip)
+ qi::skip_over(iter, end, skipper_);
+ return true;
+ }
+
+ template <typename Iterator, typename Lexer, typename ParserExpr
+ , typename Skipper, typename Attribute>
+ inline bool
+ tokenize_and_phrase_parse(Iterator& first, Iterator last
+ , Lexer const& lex, ParserExpr const& xpr, Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip, Attribute& attr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, ParserExpr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+
+ typedef
+ typename spirit::result_of::compile<qi::domain, Skipper>::type
+ skipper_type;
+ skipper_type const skipper_ = compile<qi::domain>(skipper);
+
+ typename Lexer::iterator_type iter = lex.begin(first, last);
+ typename Lexer::iterator_type end = lex.end();
+ if (!compile<qi::domain>(xpr).parse(
+ iter, end, unused, skipper_, attr))
+ return false;
+
+ // do a final post-skip
+ if (post_skip == skip_flag::postskip)
+ qi::skip_over(iter, end, skipper_);
+ return true;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Lexer, typename ParserExpr
+ , typename Skipper, typename Attribute>
+ inline bool
+ tokenize_and_phrase_parse(Iterator& first, Iterator last
+ , Lexer const& lex, ParserExpr const& xpr, Skipper const& skipper
+ , Attribute& attr)
+ {
+ return tokenize_and_phrase_parse(first, last, lex, xpr, skipper
+ , skip_flag::postskip, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The tokenize() function is one of the main Spirit API functions. It
+ // simplifies using a lexer to tokenize a given input sequence. It's main
+ // purpose is to use the lexer to tokenize all the input.
+ //
+ // The second version below discards all generated tokens afterwards.
+ // This is useful whenever all the needed functionality has been
+ // implemented directly inside the lexer semantic actions, which are being
+ // executed while the tokens are matched.
+ //
+ // The function takes a pair of iterators spanning the underlying input
+ // stream to scan, the lexer object (built from the token definitions),
+ // and a (optional) functor being called for each of the generated tokens.
+ //
+ // The function returns true if the scanning of the input succeeded (the
+ // given input sequence has been successfully matched by the given token
+ // definitions).
+ //
+ // first, last: The pair of iterators spanning the underlying input
+ // sequence to parse. These iterators must at least
+ // conform to the requirements of the std::intput_iterator
+ // category.
+ // On exit the iterator 'first' will be updated to the
+ // position right after the last successfully matched
+ // token.
+ // lex: The lexer object (encoding the token definitions) to be
+ // used to convert the input sequence into a sequence of
+ // tokens. The LexerExpr type must conform to the
+ // lexer interface described in the corresponding section
+ // of the documentation.
+ // f: A functor (callable object) taking a single argument of
+ // the token type and returning a bool, indicating whether
+ // the tokenization should be canceled.
+ // initial_state: The name of the state the lexer should start matching.
+ // The default value is zero, causing the lexer to start
+ // in its 'INITIAL' state.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Token, typename F>
+ bool tokenize_callback(Token const& t, F f)
+ {
+ return f(t);
+ }
+
+ template <typename Token, typename Eval>
+ bool tokenize_callback(Token const& t, phoenix::actor<Eval> const& f)
+ {
+ f(t);
+ return true;
+ }
+
+ template <typename Token>
+ bool tokenize_callback(Token const& t, void (*f)(Token const&))
+ {
+ f(t);
+ return true;
+ }
+
+ template <typename Token>
+ bool tokenize_callback(Token const& t, bool (*f)(Token const&))
+ {
+ return f(t);
+ }
+ }
+
+ template <typename Iterator, typename Lexer, typename F>
+ inline bool
+ tokenize(Iterator& first, Iterator last, Lexer const& lex, F f
+ , typename Lexer::char_type const* initial_state = 0)
+ {
+ typedef typename Lexer::iterator_type iterator_type;
+
+ iterator_type iter = lex.begin(first, last, initial_state);
+ iterator_type end = lex.end();
+ for (/**/; iter != end && token_is_valid(*iter); ++iter)
+ {
+ if (!detail::tokenize_callback(*iter, f))
+ return false;
+ }
+ return (iter == end) ? true : false;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Lexer>
+ inline bool
+ tokenize(Iterator& first, Iterator last, Lexer const& lex
+ , typename Lexer::char_type const* initial_state = 0)
+ {
+ typedef typename Lexer::iterator_type iterator_type;
+
+ iterator_type iter = lex.begin(first, last, initial_state);
+ iterator_type end = lex.end();
+
+ while (iter != end && token_is_valid(*iter))
+ ++iter;
+
+ return (iter == end) ? true : false;
+ }
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/lex/tokenize_and_parse_attr.hpp b/boost/spirit/home/lex/tokenize_and_parse_attr.hpp
new file mode 100644
index 0000000000..98d191d32a
--- /dev/null
+++ b/boost/spirit/home/lex/tokenize_and_parse_attr.hpp
@@ -0,0 +1,114 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2009 Carl Barron
+//
+// Distributed under the 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_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_LEXER_PARSE_ATTR_MAY_27_2009_0926AM)
+#define BOOST_SPIRIT_LEXER_PARSE_ATTR_MAY_27_2009_0926AM
+
+#include <boost/spirit/home/lex/tokenize_and_parse.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 <boost/spirit/home/lex/tokenize_and_parse_attr.hpp>
+#define BOOST_PP_ITERATION_LIMITS (2, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+#define BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE(z, n, A) BOOST_PP_CAT(A, n)&
+
+namespace boost { namespace spirit { namespace lex
+{
+ template <typename Iterator, typename Lexer, typename ParserExpr
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ tokenize_and_parse(Iterator& first, Iterator last, Lexer const& lex
+ , ParserExpr const& expr, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, ParserExpr);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ typename Lexer::iterator_type iter = lex.begin(first, last);
+ return compile<qi::domain>(expr).parse(
+ iter, lex.end(), unused, unused, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Lexer, typename ParserExpr
+ , typename Skipper, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ tokenize_and_phrase_parse(Iterator& first, Iterator last, Lexer const& lex
+ , ParserExpr const& expr, Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, ParserExpr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+
+ typedef
+ typename spirit::result_of::compile<qi::domain, Skipper>::type
+ skipper_type;
+ skipper_type const skipper_ = compile<qi::domain>(skipper);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ typename Lexer::iterator_type iter = lex.begin(first, last);
+ if (!compile<qi::domain>(expr).parse(
+ iter, lex.end(), unused, skipper_, attr))
+ return false;
+
+ if (post_skip == skip_flag::postskip)
+ qi::skip_over(first, last, skipper_);
+ return true;
+ }
+
+ template <typename Iterator, typename Lexer, typename ParserExpr
+ , typename Skipper, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ tokenize_and_phrase_parse(Iterator& first, Iterator last, Lexer const& lex
+ , ParserExpr const& expr, Skipper const& skipper
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ return tokenize_and_phrase_parse(first, last, expr, skipper
+ , skip_flag::postskip, BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+}}}
+
+#undef BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE
+#undef N
+
+#endif
+
diff --git a/boost/spirit/home/phoenix.hpp b/boost/spirit/home/phoenix.hpp
new file mode 100644
index 0000000000..b14ea5dc89
--- /dev/null
+++ b/boost/spirit/home/phoenix.hpp
@@ -0,0 +1,23 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_PHOENIX_APRIL_11_2008_0850AM)
+#define BOOST_SPIRIT_PHOENIX_APRIL_11_2008_0850AM
+
+#include <boost/spirit/home/phoenix/algorithm.hpp>
+#include <boost/spirit/home/phoenix/bind.hpp>
+#include <boost/spirit/home/phoenix/container.hpp>
+#include <boost/spirit/home/phoenix/core.hpp>
+#include <boost/spirit/home/phoenix/function.hpp>
+#include <boost/spirit/home/phoenix/fusion.hpp>
+#include <boost/spirit/home/phoenix/object.hpp>
+#include <boost/spirit/home/phoenix/operator.hpp>
+#include <boost/spirit/home/phoenix/scope.hpp>
+#include <boost/spirit/home/phoenix/statement.hpp>
+#include <boost/spirit/home/phoenix/stl.hpp>
+#include <boost/spirit/home/phoenix/version.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/algorithm.hpp b/boost/spirit/home/phoenix/algorithm.hpp
new file mode 100644
index 0000000000..c3f7600830
--- /dev/null
+++ b/boost/spirit/home/phoenix/algorithm.hpp
@@ -0,0 +1,14 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_ALGORITHM_HPP
+#define PHOENIX_ALGORITHM_HPP
+
+#include <boost/spirit/home/phoenix/stl/algorithm/iteration.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/querying.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/bind.hpp b/boost/spirit/home/phoenix/bind.hpp
new file mode 100644
index 0000000000..5a90d44aab
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind.hpp
@@ -0,0 +1,16 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_BIND_HPP
+#define PHOENIX_BIND_HPP
+
+#include <boost/spirit/home/phoenix/version.hpp>
+#include <boost/spirit/home/phoenix/bind/bind_function.hpp>
+#include <boost/spirit/home/phoenix/bind/bind_function_object.hpp>
+#include <boost/spirit/home/phoenix/bind/bind_member_function.hpp>
+#include <boost/spirit/home/phoenix/bind/bind_member_variable.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/bind/bind_function.hpp b/boost/spirit/home/phoenix/bind/bind_function.hpp
new file mode 100644
index 0000000000..9121fdc8cf
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/bind_function.hpp
@@ -0,0 +1,58 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_BIND_BIND_FUNCTION_HPP
+#define PHOENIX_BIND_BIND_FUNCTION_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
+#include <boost/spirit/home/phoenix/bind/detail/function_ptr.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename RT>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<0>
+ , detail::function_ptr<0, RT, RT(*)()>
+ >::type>
+ bind(RT(*f)())
+ {
+ typedef detail::function_ptr<0, RT, RT(*)()> fp_type;
+ return compose<detail::function_eval<0> >(fp_type(f));
+ }
+
+ template <typename RT, typename T0, typename A0>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<1>
+ , detail::function_ptr<1, RT, RT(*)(T0)>
+ , A0
+ >::type>
+ bind(RT(*f)(T0), A0 const& _0)
+ {
+ typedef detail::function_ptr<1, RT, RT(*)(T0)> fp_type;
+ return compose<detail::function_eval<1> >(fp_type(f), _0);
+ }
+
+ template <typename RT, typename T0, typename T1, typename A0, typename A1>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<2>
+ , detail::function_ptr<2, RT, RT(*)(T0, T1)>
+ , A0, A1
+ >::type>
+ bind(RT(*f)(T0, T1), A0 const& _0, A1 const& _1)
+ {
+ typedef detail::function_ptr<2, RT, RT(*)(T0, T1)> fp_type;
+ return compose<detail::function_eval<2> >(fp_type(f), _0, _1);
+ }
+
+ // Bring in the rest of the function binders
+ #include <boost/spirit/home/phoenix/bind/detail/bind_function.hpp>
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/bind/bind_function_object.hpp b/boost/spirit/home/phoenix/bind/bind_function_object.hpp
new file mode 100644
index 0000000000..752ae3109f
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/bind_function_object.hpp
@@ -0,0 +1,40 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_BIND_BIND_FUNCTION_OBJECT_HPP
+#define PHOENIX_BIND_BIND_FUNCTION_OBJECT_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename F>
+ inline actor<typename as_composite<detail::function_eval<0>, F>::type>
+ bind(F const& f)
+ {
+ return compose<detail::function_eval<0> >(f);
+ }
+
+ template <typename F, typename A0>
+ inline actor<typename as_composite<detail::function_eval<1>, F, A0>::type>
+ bind(F const& f, A0 const& _0)
+ {
+ return compose<detail::function_eval<1> >(f, _0);
+ }
+
+ template <typename F, typename A0, typename A1>
+ inline actor<typename as_composite<detail::function_eval<2>, F, A0, A1>::type>
+ bind(F const& f, A0 const& _0, A1 const& _1)
+ {
+ return compose<detail::function_eval<2> >(f, _0, _1);
+ }
+
+ // Bring in the rest of the function object binders
+ #include <boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp>
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/bind/bind_member_function.hpp b/boost/spirit/home/phoenix/bind/bind_member_function.hpp
new file mode 100644
index 0000000000..9d31a38490
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/bind_member_function.hpp
@@ -0,0 +1,77 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_BIND_BIND_MEMBER_FUNCTION_HPP
+#define PHOENIX_BIND_BIND_MEMBER_FUNCTION_HPP
+
+#include <boost/spirit/home/phoenix/core/reference.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
+#include <boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename RT, typename ClassT, typename ClassA>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<1>
+ , detail::member_function_ptr<0, RT, RT(ClassT::*)()>
+ , ClassA
+ >::type>
+ bind(RT(ClassT::*f)(), ClassA const& obj)
+ {
+ typedef detail::member_function_ptr<0, RT, RT(ClassT::*)()> fp_type;
+ return compose<detail::function_eval<1> >(fp_type(f), obj);
+ }
+
+ template <typename RT, typename ClassT, typename ClassA>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<1>
+ , detail::member_function_ptr<0, RT, RT(ClassT::*)() const>
+ , ClassA
+ >::type>
+ bind(RT(ClassT::*f)() const, ClassA const& obj)
+ {
+ typedef detail::member_function_ptr<0, RT, RT(ClassT::*)() const> fp_type;
+ return compose<detail::function_eval<1> >(fp_type(f), obj);
+ }
+
+ template <typename RT, typename ClassT>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<1>
+ , detail::member_function_ptr<0, RT, RT(ClassT::*)()>
+ , actor<reference<ClassT> >
+ >::type>
+ bind(RT(ClassT::*f)(), ClassT& obj)
+ {
+ typedef detail::member_function_ptr<0, RT, RT(ClassT::*)()> fp_type;
+ return compose<detail::function_eval<1> >(
+ fp_type(f)
+ , actor<reference<ClassT> >(reference<ClassT>(obj)));
+ }
+
+ template <typename RT, typename ClassT>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<1>
+ , detail::member_function_ptr<0, RT, RT(ClassT::*)() const>
+ , actor<reference<ClassT> >
+ >::type>
+ bind(RT(ClassT::*f)() const, ClassT& obj)
+ {
+ typedef detail::member_function_ptr<0, RT, RT(ClassT::*)() const> fp_type;
+ return compose<detail::function_eval<1> >(
+ fp_type(f)
+ , actor<reference<ClassT> >(reference<ClassT>(obj)));
+ }
+
+ // Bring in the rest of the function binders
+ #include <boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp>
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/bind/bind_member_variable.hpp b/boost/spirit/home/phoenix/bind/bind_member_variable.hpp
new file mode 100644
index 0000000000..3d11351828
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/bind_member_variable.hpp
@@ -0,0 +1,105 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_BIND_BIND_MEMBER_VARIABLE_HPP
+#define PHOENIX_BIND_BIND_MEMBER_VARIABLE_HPP
+
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/core/reference.hpp>
+#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace detail
+ {
+ template <typename RT, typename MP>
+ struct member_variable
+ {
+ template <typename Class>
+ struct result
+ {
+ typedef typename boost::mpl::if_<
+ boost::is_const<
+ typename boost::remove_pointer<
+ typename boost::remove_reference<Class>::type
+ >::type
+ >
+ , const RT&
+ , RT&
+ >::type type;
+ };
+
+ member_variable(MP mp)
+ : mp(mp) {}
+
+ template <typename Class>
+ RT& operator()(Class& obj) const
+ {
+ return obj.*mp;
+ }
+
+ template <typename Class>
+ RT& operator()(Class* obj) const
+ {
+ return obj->*mp;
+ }
+
+ template <typename Class>
+ RT const& operator()(Class const& obj) const
+ {
+ return obj.*mp;
+ }
+
+ template <typename Class>
+ RT const& operator()(Class const* obj) const
+ {
+ return obj->*mp;
+ }
+
+ MP mp;
+ };
+ }
+
+ template <typename RT, typename ClassT, typename ClassA>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<1>
+ , detail::member_variable<RT, RT ClassT::*>
+ , ClassA
+ >::type>
+ bind(RT ClassT::*mp, ClassA const& obj)
+ {
+ typedef detail::member_variable<RT, RT ClassT::*> mp_type;
+ return compose<detail::function_eval<1> >(mp_type(mp), obj);
+ }
+
+ template <typename RT, typename ClassT>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<1>
+ , detail::member_variable<RT, RT ClassT::*>
+ , actor<reference<ClassT> >
+ >::type>
+ bind(RT ClassT::*mp, ClassT& obj)
+ {
+ typedef detail::member_variable<RT, RT ClassT::*> mp_type;
+ return compose<detail::function_eval<1> >(
+ mp_type(mp)
+ , actor<reference<ClassT> >(reference<ClassT>(obj)));
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/bind/detail/bind_function.hpp b/boost/spirit/home/phoenix/bind/detail/bind_function.hpp
new file mode 100644
index 0000000000..8d6340d0da
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/detail/bind_function.hpp
@@ -0,0 +1,53 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING)
+#if !defined(PHOENIX_BIND_DETAIL_BIND_FUNCTION_HPP)
+#define PHOENIX_BIND_DETAIL_BIND_FUNCTION_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT), \
+ "boost/spirit/home/phoenix/bind/detail/bind_function.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <typename RT
+ , BOOST_PP_ENUM_PARAMS(N, typename T)
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<N>
+ , detail::function_ptr<N, RT, RT(*)(BOOST_PP_ENUM_PARAMS(N, T))>
+ , BOOST_PP_ENUM_PARAMS(N, A)
+ >::type>
+ bind(RT(*f)(BOOST_PP_ENUM_PARAMS(N, T))
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
+ {
+ typedef detail::function_ptr<
+ N, RT, RT(*)(BOOST_PP_ENUM_PARAMS(N, T))> fp_type;
+ return compose<detail::function_eval<N> >(
+ fp_type(f), BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp b/boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp
new file mode 100644
index 0000000000..4e4984d61e
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp
@@ -0,0 +1,43 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING)
+#if !defined(PHOENIX_BIND_DETAIL_BIND_FUNCTION_OBJECT_HPP)
+#define PHOENIX_BIND_DETAIL_BIND_FUNCTION_OBJECT_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT), \
+ "boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <typename F, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline actor<typename as_composite<detail::function_eval<N>, F
+ , BOOST_PP_ENUM_PARAMS(N, A)>::type>
+ bind(F const& f, BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
+ {
+ return compose<detail::function_eval<N> >(f, BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp b/boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp
new file mode 100644
index 0000000000..315f56fc98
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp
@@ -0,0 +1,132 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING)
+#if !defined(PHOENIX_BIND_DETAIL_BIND_MEMBER_FUNCTION_HPP)
+#define PHOENIX_BIND_DETAIL_BIND_MEMBER_FUNCTION_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/inc.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT)), \
+ "boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <typename RT
+ , typename ClassT
+ , BOOST_PP_ENUM_PARAMS(N, typename T)
+ , typename ClassA
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<BOOST_PP_INC(N)>
+ , detail::member_function_ptr<N,
+ RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T))>
+ , ClassA, BOOST_PP_ENUM_PARAMS(N, A)
+ >::type>
+ bind(
+ RT(ClassT::*f)(BOOST_PP_ENUM_PARAMS(N, T))
+ , ClassA const& obj
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
+ {
+ typedef detail::member_function_ptr<
+ N, RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T))> fp_type;
+ return compose<detail::function_eval<BOOST_PP_INC(N)> >(
+ fp_type(f), obj, BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+ template <typename RT
+ , typename ClassT
+ , BOOST_PP_ENUM_PARAMS(N, typename T)
+ , typename ClassA
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<BOOST_PP_INC(N)>
+ , detail::member_function_ptr<N,
+ RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T)) const>
+ , ClassA, BOOST_PP_ENUM_PARAMS(N, A)
+ >::type>
+ bind(
+ RT(ClassT::*f)(BOOST_PP_ENUM_PARAMS(N, T)) const
+ , ClassA const& obj
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
+ {
+ typedef detail::member_function_ptr<
+ N, RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T)) const> fp_type;
+ return compose<detail::function_eval<BOOST_PP_INC(N)> >(
+ fp_type(f), obj, BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+ template <typename RT
+ , typename ClassT
+ , BOOST_PP_ENUM_PARAMS(N, typename T)
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<BOOST_PP_INC(N)>
+ , detail::member_function_ptr<N,
+ RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T))>
+ , actor<reference<ClassT> >
+ , BOOST_PP_ENUM_PARAMS(N, A)
+ >::type>
+ bind(
+ RT(ClassT::*f)(BOOST_PP_ENUM_PARAMS(N, T))
+ , ClassT& obj
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
+ {
+ typedef detail::member_function_ptr<
+ N, RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T))> fp_type;
+ return compose<detail::function_eval<BOOST_PP_INC(N)> >(
+ fp_type(f)
+ , actor<reference<ClassT> >(reference<ClassT>(obj))
+ , BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+ template <typename RT
+ , typename ClassT
+ , BOOST_PP_ENUM_PARAMS(N, typename T)
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline actor<
+ typename as_composite<
+ detail::function_eval<BOOST_PP_INC(N)>
+ , detail::member_function_ptr<N,
+ RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T)) const>
+ , actor<reference<ClassT> >
+ , BOOST_PP_ENUM_PARAMS(N, A)
+ >::type>
+ bind(
+ RT(ClassT::*f)(BOOST_PP_ENUM_PARAMS(N, T)) const
+ , ClassT& obj
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
+ {
+ typedef detail::member_function_ptr<
+ N, RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T)) const> fp_type;
+ return compose<detail::function_eval<BOOST_PP_INC(N)> >(
+ fp_type(f)
+ , actor<reference<ClassT> >(reference<ClassT>(obj))
+ , BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/bind/detail/function_ptr.hpp b/boost/spirit/home/phoenix/bind/detail/function_ptr.hpp
new file mode 100644
index 0000000000..a2352cd7e5
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/detail/function_ptr.hpp
@@ -0,0 +1,99 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING)
+#if !defined(PHOENIX_BIND_DETAIL_FUNCTION_PTR_HPP)
+#define PHOENIX_BIND_DETAIL_FUNCTION_PTR_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/dec.hpp>
+
+namespace boost { namespace phoenix { namespace detail
+{
+ template <int N>
+ struct function_ptr_impl
+ {
+ template <typename RT, typename FP>
+ struct impl;
+ };
+
+ template <int N, typename RT, typename FP>
+ struct function_ptr : function_ptr_impl<N>::template impl<RT, FP>
+ {
+ typedef typename function_ptr_impl<N>::template impl<RT, FP> base;
+ function_ptr(FP fp)
+ : base(fp) {}
+ };
+
+ template <>
+ struct function_ptr_impl<0>
+ {
+ template <typename RT, typename FP>
+ struct impl
+ {
+ typedef RT result_type;
+
+ impl(FP fp)
+ : fp(fp) {}
+
+ RT operator()() const
+ {
+ return fp();
+ }
+
+ FP fp;
+ };
+ };
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/bind/detail/function_ptr.hpp"))
+#include BOOST_PP_ITERATE()
+
+}}} // namespace boost::phoenix::detail
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <>
+ struct function_ptr_impl<N>
+ {
+ template <typename RT, typename FP>
+ struct impl
+ {
+ template <BOOST_PP_ENUM_PARAMS(N, typename T)>
+ struct result
+ {
+ typedef RT type;
+ };
+
+ impl(FP fp)
+ : fp(fp) {}
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename A)>
+ RT operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _)) const
+ {
+ return fp(BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+ FP fp;
+ };
+ };
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp b/boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp
new file mode 100644
index 0000000000..2c11510cee
--- /dev/null
+++ b/boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp
@@ -0,0 +1,119 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING)
+#if !defined(PHOENIX_BIND_DETAIL_MEMBER_FUNCTION_PTR_HPP)
+#define PHOENIX_BIND_DETAIL_MEMBER_FUNCTION_PTR_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/utility/addressof.hpp>
+
+namespace boost { namespace phoenix { namespace detail
+{
+ template <int N>
+ struct member_function_ptr_impl
+ {
+ template <typename RT, typename FP>
+ struct impl;
+ };
+
+ template <int N, typename RT, typename FP>
+ struct member_function_ptr
+ : member_function_ptr_impl<N>::template impl<RT, FP>
+ {
+ typedef typename member_function_ptr_impl<N>::
+ template impl<RT, FP> base;
+ member_function_ptr(FP fp)
+ : base(fp) {}
+ };
+
+ template <>
+ struct member_function_ptr_impl<0>
+ {
+ template <typename RT, typename FP>
+ struct impl
+ {
+ template <typename Class>
+ struct result
+ {
+ typedef RT type;
+ };
+
+ impl(FP fp)
+ : fp(fp) {}
+
+ template <typename Class>
+ RT operator()(Class& obj) const
+ {
+ return (obj.*fp)();
+ }
+
+ template <typename Class>
+ RT operator()(Class* obj) const
+ {
+ return (obj->*fp)();
+ }
+
+ FP fp;
+ };
+ };
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp"))
+#include BOOST_PP_ITERATE()
+
+}}} // namespace boost::phoenix::detail
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <>
+ struct member_function_ptr_impl<N>
+ {
+ template <typename RT, typename FP>
+ struct impl
+ {
+ template <typename Class, BOOST_PP_ENUM_PARAMS(N, typename T)>
+ struct result
+ {
+ typedef RT type;
+ };
+
+ impl(FP fp)
+ : fp(fp) {}
+
+ template <typename Class, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ RT operator()(Class& obj, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _)) const
+ {
+ return (obj.*fp)(BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+ template <typename Class, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ RT operator()(Class* obj, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _)) const
+ {
+ return (obj->*fp)(BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+ FP fp;
+ };
+ };
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/container.hpp b/boost/spirit/home/phoenix/container.hpp
new file mode 100644
index 0000000000..fb6ec3f9f9
--- /dev/null
+++ b/boost/spirit/home/phoenix/container.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CONTAINER_HPP
+#define PHOENIX_CONTAINER_HPP
+
+#include <boost/spirit/home/phoenix/stl/container/container.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/core.hpp b/boost/spirit/home/phoenix/core.hpp
new file mode 100644
index 0000000000..7dfefb3d1c
--- /dev/null
+++ b/boost/spirit/home/phoenix/core.hpp
@@ -0,0 +1,23 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_HPP
+#define PHOENIX_CORE_HPP
+
+#include <boost/spirit/home/phoenix/version.hpp>
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/spirit/home/phoenix/core/basic_environment.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/as_actor.hpp>
+#include <boost/spirit/home/phoenix/core/is_actor.hpp>
+#include <boost/spirit/home/phoenix/core/argument.hpp>
+#include <boost/spirit/home/phoenix/core/value.hpp>
+#include <boost/spirit/home/phoenix/core/reference.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/nothing.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/core/actor.hpp b/boost/spirit/home/phoenix/core/actor.hpp
new file mode 100644
index 0000000000..6ff48e9e7f
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/actor.hpp
@@ -0,0 +1,194 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_ACTOR_HPP
+#define PHOENIX_CORE_ACTOR_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+
+#if !defined(BOOST_RESULT_OF_NUM_ARGS)
+# define BOOST_RESULT_OF_NUM_ARGS PHOENIX_ACTOR_LIMIT
+#elif (BOOST_RESULT_OF_NUM_ARGS < PHOENIX_ACTOR_LIMIT)
+# error "BOOST_RESULT_OF_NUM_ARGS < PHOENIX_ACTOR_LIMIT"
+#endif
+
+#include <boost/spirit/home/phoenix/core/basic_environment.hpp>
+#include <boost/mpl/min.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/result_of.hpp>
+
+namespace boost { namespace phoenix
+{
+ // phoenix::void_ is the same as fusion::void_
+ typedef fusion::void_ void_;
+
+ namespace detail
+ {
+ // Forward declarations. These will come in when we get to the
+ // operator module, yet, the actor's assignment operator and index
+ // operator are required to be members.
+
+ template <typename T0, typename T1>
+ struct make_assign_composite;
+
+ template <typename T0, typename T1>
+ struct make_index_composite;
+
+ template <typename BaseT0, typename BaseT1>
+ struct comma_result;
+
+ // error no arguments supplied
+ struct error_expecting_arguments
+ {
+ template <typename T>
+ error_expecting_arguments(T const&) {}
+ };
+ }
+
+ template <typename Eval, typename Env>
+ struct eval_result
+ {
+ typedef typename Eval::template result<Env>::type type;
+ };
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4522) // multiple assignment operators specified warning
+#endif
+
+ template <typename Eval>
+ struct actor : Eval
+ {
+ typedef actor<Eval> self_type;
+ typedef Eval eval_type;
+
+ template <class Sig> struct result {};
+
+ actor()
+ : Eval() {}
+
+ actor(Eval const& base)
+ : Eval(base) {}
+
+ template <typename T0>
+ explicit actor(T0 const& _0)
+ : Eval(_0) {}
+
+ template <typename T0, typename T1>
+ actor(T0 const& _0, T1 const& _1)
+ : Eval(_0, _1) {}
+
+ typedef typename
+ mpl::eval_if<
+ typename Eval::no_nullary // avoid calling eval_result when this is true
+ , mpl::identity<detail::error_expecting_arguments>
+ , eval_result<eval_type, basic_environment<> >
+ >::type
+ nullary_result;
+
+ actor& operator=(actor const& rhs)
+ {
+ Eval::operator=(rhs);
+ return *this;
+ }
+
+ actor& operator=(actor& rhs)
+ {
+ Eval::operator=(rhs);
+ return *this;
+ }
+
+ nullary_result
+ operator()() const
+ {
+ return eval_type::eval(basic_environment<>());
+ }
+
+ template <class F, class A0>
+ struct result<F(A0)>
+ : eval_result<
+ eval_type
+ , basic_environment<
+ typename remove_reference<A0>::type
+ >
+ >
+ {};
+
+ template <typename T0>
+ typename result<actor(T0&)>::type
+ operator()(T0& _0) const
+ {
+ return eval_type::eval(basic_environment<T0>(_0));
+ }
+
+ template <class F, class A0, class A1>
+ struct result<F(A0,A1)>
+ : eval_result<
+ eval_type
+ , basic_environment<
+ typename remove_reference<A0>::type
+ , typename remove_reference<A1>::type
+ >
+ >
+ {};
+
+ template <typename T0, typename T1>
+ typename result<actor(T0&,T1&)>::type
+ operator()(T0& _0, T1& _1) const
+ {
+ return eval_type::eval(basic_environment<T0, T1>(_0, _1));
+ }
+
+ template <typename T1>
+ typename detail::make_assign_composite<self_type, T1>::type
+ operator=(T1 const& a1) const;
+
+ template <typename T1>
+ typename detail::make_index_composite<self_type, T1>::type
+ operator[](T1 const& a1) const;
+
+ // Bring in the rest of the constructors and function call operators
+ #include <boost/spirit/home/phoenix/core/detail/actor.hpp>
+ };
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+ // Forward declaration: The intent to overload the comma must be
+ // stated early on to avoid the subtle problem that arises when
+ // the header file where the comma operator overload is defined,
+ // is not included by the client and the client attempts to use
+ // the comma anyway.
+
+ namespace detail
+ {
+ template <typename BaseT0, typename BaseT1>
+ struct comma_result;
+ }
+
+ template <typename BaseT0, typename BaseT1>
+ typename detail::comma_result<BaseT0, BaseT1>::type
+ operator,(actor<BaseT0> const& a0, actor<BaseT1> const& a1);
+}}
+
+namespace boost
+{
+ template <typename Eval>
+ struct result_of<phoenix::actor<Eval>()>
+ {
+ typedef typename phoenix::actor<Eval>::nullary_result type;
+ };
+
+ template <typename Eval>
+ struct result_of<phoenix::actor<Eval> const()>
+ : result_of<phoenix::actor<Eval>()>
+ {};
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/core/argument.hpp b/boost/spirit/home/phoenix/core/argument.hpp
new file mode 100644
index 0000000000..1679cb2b38
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/argument.hpp
@@ -0,0 +1,99 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_ARGUMENT_HPP
+#define PHOENIX_CORE_ARGUMENT_HPP
+
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/preprocessor/inc.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/type_traits/add_reference.hpp>
+
+#define PHOENIX_DECLARE_ARG(z, n, data) \
+ typedef actor<argument<n> > \
+ BOOST_PP_CAT(BOOST_PP_CAT(arg, BOOST_PP_INC(n)), _type); \
+ actor<argument<n> > const \
+ BOOST_PP_CAT(arg, BOOST_PP_INC(n)) = argument<n>(); \
+ typedef actor<argument<n> > \
+ BOOST_PP_CAT(BOOST_PP_CAT(_, BOOST_PP_INC(n)), _type); \
+ actor<argument<n> > const \
+ BOOST_PP_CAT(_, BOOST_PP_INC(n)) = argument<n>();
+
+namespace boost { namespace phoenix
+{
+ namespace detail
+ {
+ template <typename Arg>
+ struct error_argument_not_found {};
+ inline void test_invalid_argument(int) {}
+ }
+
+ template <int N>
+ struct argument
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ fusion::result_of::at<typename Env::tie_type, mpl::int_<N> >::type
+ type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ typedef typename
+ mpl::if_<
+ mpl::less<mpl::int_<N>, mpl::size<typename Env::args_type> >
+ , int
+ , detail::error_argument_not_found<argument<N> >
+ >::type
+ check_out_of_bounds;
+
+ detail::test_invalid_argument(check_out_of_bounds());
+ return fusion::at_c<N>(env.args());
+ }
+ };
+
+ namespace arg_names
+ {
+ // Phoenix style names
+ typedef actor<argument<0> > arg1_type;
+ actor<argument<0> > const arg1 = argument<0>();
+ typedef actor<argument<1> > arg2_type;
+ actor<argument<1> > const arg2 = argument<1>();
+ typedef actor<argument<2> > arg3_type;
+ actor<argument<2> > const arg3 = argument<2>();
+
+ // BLL style names
+ typedef actor<argument<0> > _1_type;
+ actor<argument<0> > const _1 = argument<0>();
+ typedef actor<argument<1> > _2_type;
+ actor<argument<1> > const _2 = argument<1>();
+ typedef actor<argument<2> > _3_type;
+ actor<argument<2> > const _3 = argument<2>();
+
+ // Bring in the rest or the Phoenix style arguments (arg4 .. argN+1)
+ // and BLL style arguments (_4 .. _N+1), using PP
+ BOOST_PP_REPEAT_FROM_TO(
+ 3, PHOENIX_ARG_LIMIT, PHOENIX_DECLARE_ARG, _)
+ }
+}}
+
+#undef PHOENIX_DECLARE_ARG
+#endif
diff --git a/boost/spirit/home/phoenix/core/as_actor.hpp b/boost/spirit/home/phoenix/core/as_actor.hpp
new file mode 100644
index 0000000000..36f0aacb69
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/as_actor.hpp
@@ -0,0 +1,62 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_AS_ACTOR_HPP
+#define PHOENIX_CORE_AS_ACTOR_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename T>
+ struct as_actor_base; // defined in value.hpp
+
+ template <typename Base>
+ struct as_actor_base<actor<Base> >
+ {
+ typedef Base type;
+
+ static Base const&
+ convert(actor<Base> const& x)
+ {
+ return x;
+ }
+ };
+
+ template <>
+ struct as_actor_base<fusion::void_>
+ {
+ typedef fusion::void_ type;
+ struct error_attempting_to_convert_void_type_to_an_actor {};
+
+ static void
+ convert(error_attempting_to_convert_void_type_to_an_actor);
+ };
+
+ template <>
+ struct as_actor_base<void>
+ {
+ typedef void type;
+ struct error_attempting_to_convert_void_type_to_an_actor {};
+
+ static void
+ convert(error_attempting_to_convert_void_type_to_an_actor);
+ };
+
+ template <typename T>
+ struct as_actor
+ {
+ typedef actor<typename as_actor_base<T>::type> type;
+
+ static type
+ convert(T const& x)
+ {
+ return as_actor_base<T>::convert(x);
+ }
+ };
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/core/basic_environment.hpp b/boost/spirit/home/phoenix/core/basic_environment.hpp
new file mode 100644
index 0000000000..5ef82234cd
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/basic_environment.hpp
@@ -0,0 +1,81 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_BASIC_ENVIRONMENT_HPP
+#define PHOENIX_CORE_BASIC_ENVIRONMENT_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/mpl/remove.hpp>
+#include <boost/mpl/transform.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/fusion/include/mpl.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ PHOENIX_ARG_LIMIT, typename T, fusion::void_)>
+ class basic_environment
+ {
+ typedef
+ mpl::BOOST_PP_CAT(vector, PHOENIX_ARG_LIMIT)<
+ BOOST_PP_ENUM_PARAMS(PHOENIX_ARG_LIMIT, T)>
+ args_with_void_type;
+
+ public:
+
+ // args_type: the list of types in an mpl::sequence
+ typedef typename
+ mpl::remove<args_with_void_type, fusion::void_>::type
+ args_type;
+
+ // tie_type: a fusion::tuple of references
+ typedef typename
+ fusion::result_of::as_vector<
+ typename mpl::transform<
+ args_type, boost::add_reference<mpl::_1>
+ >::type
+ >::type
+ tie_type;
+
+ basic_environment()
+ : args_() {}
+
+ template <typename U0>
+ explicit basic_environment(U0& _0)
+ : args_(_0) {}
+
+ template <typename U0, typename U1>
+ basic_environment(U0& _0, U1& _1)
+ : args_(_0, _1) {}
+
+ // Bring in the rest of the constructors
+ #include <boost/spirit/home/phoenix/core/detail/basic_environment.hpp>
+
+ tie_type const&
+ args() const
+ {
+ return args_;
+ }
+
+ tie_type&
+ args()
+ {
+ return args_;
+ }
+
+ private:
+
+ tie_type args_;
+ };
+}}
+
+#endif
+
diff --git a/boost/spirit/home/phoenix/core/compose.hpp b/boost/spirit/home/phoenix/core/compose.hpp
new file mode 100644
index 0000000000..d536113764
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/compose.hpp
@@ -0,0 +1,118 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_COMPOSE_HPP
+#define PHOENIX_CORE_COMPOSE_HPP
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/value.hpp>
+#include <boost/spirit/home/phoenix/core/as_actor.hpp>
+
+#define PHOENIX_AS_ACTOR(z, n, data) \
+ typename mpl::eval_if< \
+ is_same<BOOST_PP_CAT(T, n), fusion::void_> \
+ , mpl::identity<fusion::void_> \
+ , as_actor_base<BOOST_PP_CAT(T, n)> \
+ >::type
+
+namespace boost { namespace phoenix
+{
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// as_composite<EvalPolicy, T0,... TN> metafunction
+//
+// Create a composite given an EvalPolicy and types T0..TN.
+// The types are converted to an actor through the as_actor
+// metafunction (see as_actor.hpp).
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <
+ typename EvalPolicy
+ , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)>
+ struct as_composite
+ {
+ typedef composite<
+ EvalPolicy
+ , fusion::vector<
+ BOOST_PP_ENUM(PHOENIX_COMPOSITE_LIMIT, PHOENIX_AS_ACTOR, _)>
+ >
+ type;
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// compose functions
+//
+// Usage:
+//
+// compose<EvalPolicy>(_0, _1,... _N)
+//
+// Returns a composite given an EvalPolicy and arguments _0.._N.
+// The arguments are converted to an actor through the as_actor
+// metafunction (see as_actor.hpp).
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <typename EvalPolicy>
+ inline actor<typename as_composite<EvalPolicy>::type>
+ compose()
+ {
+ return actor<typename as_composite<EvalPolicy>::type>();
+ }
+
+ template <typename EvalPolicy, typename T0>
+ inline actor<typename as_composite<EvalPolicy, T0>::type>
+ compose(T0 const& _0)
+ {
+ return actor<typename as_composite<EvalPolicy, T0>::type>(
+ as_actor<T0>::convert(_0)
+ );
+ }
+
+ template <typename EvalPolicy, typename T0, typename T1>
+ inline actor<typename as_composite<EvalPolicy, T0, T1>::type>
+ compose(T0 const& _0, T1 const& _1)
+ {
+ return actor<typename as_composite<EvalPolicy, T0, T1>::type>(
+ as_actor<T0>::convert(_0)
+ , as_actor<T1>::convert(_1)
+ );
+ }
+
+ // Bring in the the rest of the compose overloads
+ #include <boost/spirit/home/phoenix/core/detail/compose.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// re_curry<EvalPolicy, T0,...TN>
+//
+// returns the result of re currying T0..TN using EvalPolicy.
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <
+ typename EvalPolicy
+ , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)>
+ struct re_curry
+ {
+ typedef actor<
+ typename as_composite<
+ EvalPolicy
+ , BOOST_PP_ENUM_PARAMS(PHOENIX_COMPOSITE_LIMIT, T)>::type
+ >
+ type;
+ };
+}}
+
+#undef PHOENIX_AS_ACTOR
+#endif
diff --git a/boost/spirit/home/phoenix/core/composite.hpp b/boost/spirit/home/phoenix/core/composite.hpp
new file mode 100644
index 0000000000..283bdc24f3
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/composite.hpp
@@ -0,0 +1,96 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_COMPOSITE_HPP
+#define PHOENIX_CORE_COMPOSITE_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/is_actor.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/mpl.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/or.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace detail
+ {
+ template <int N>
+ struct composite_eval;
+
+ struct compute_no_nullary
+ {
+ template <typename State, typename T>
+ struct apply
+ {
+ typedef typename
+ mpl::or_<typename T::no_nullary, State>::type
+ type;
+ };
+ };
+ }
+
+ template <typename EvalPolicy, typename EvalTuple>
+ struct composite : EvalTuple
+ {
+ typedef EvalTuple base_type;
+ typedef composite<EvalPolicy, EvalTuple> self_type;
+ typedef EvalPolicy eval_policy_type;
+
+ typedef typename
+ mpl::fold<
+ EvalTuple
+ , mpl::false_
+ , detail::compute_no_nullary
+ >::type
+ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef
+ typename detail::composite_eval<
+ fusion::result_of::size<base_type>::value>::
+ template result<self_type, Env>::type
+ type;
+ };
+
+ composite()
+ : base_type() {}
+
+ composite(base_type const& base)
+ : base_type(base) {}
+
+ template <typename U0>
+ composite(U0& _0)
+ : base_type(_0) {}
+
+ template <typename U0, typename U1>
+ composite(U0& _0, U1& _1)
+ : base_type(_0, _1) {}
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ typedef typename result<Env>::type return_type;
+ return detail::
+ composite_eval<fusion::result_of::size<base_type>::value>::template
+ call<return_type>(*this, env);
+ }
+
+ // Bring in the rest of the constructors
+ #include <boost/spirit/home/phoenix/core/detail/composite.hpp>
+ };
+
+ // Bring in the detail::composite_eval<0..N> definitions
+ #include <boost/spirit/home/phoenix/core/detail/composite_eval.hpp>
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/core/detail/actor.hpp b/boost/spirit/home/phoenix/core/detail/actor.hpp
new file mode 100644
index 0000000000..66666c5474
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/detail/actor.hpp
@@ -0,0 +1,65 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_CORE_DETAIL_ACTOR_HPP
+#define PHOENIX_CORE_DETAIL_ACTOR_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_ACTOR_LIMIT, \
+ "boost/spirit/home/phoenix/core/detail/actor.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename T)>
+ actor(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _))
+ : Eval(BOOST_PP_ENUM_PARAMS(N, _)) {}
+
+ template <typename F, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ struct result<F(BOOST_PP_ENUM_PARAMS(N, A))>
+ : eval_result<
+ eval_type
+ , basic_environment<
+ BOOST_PP_ENUM_BINARY_PARAMS(
+ N
+ , typename remove_reference<A
+ , >::type BOOST_PP_INTERCEPT
+ )
+ >
+ >
+ {};
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename T)>
+ typename result<
+ actor(BOOST_PP_ENUM_BINARY_PARAMS(N, T, & BOOST_PP_INTERCEPT))
+ >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, T, & _)) const
+ {
+ return eval_type::eval(
+ basic_environment<BOOST_PP_ENUM_PARAMS(N, T)>(
+ BOOST_PP_ENUM_PARAMS(N, _))
+ );
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/core/detail/basic_environment.hpp b/boost/spirit/home/phoenix/core/detail/basic_environment.hpp
new file mode 100644
index 0000000000..986ecf2b33
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/detail/basic_environment.hpp
@@ -0,0 +1,38 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_CORE_DETAIL_BASIC_ENVIRONMENT_HPP
+#define PHOENIX_CORE_DETAIL_BASIC_ENVIRONMENT_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_ARG_LIMIT, \
+ "boost/spirit/home/phoenix/core/detail/basic_environment.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename U)>
+ basic_environment(BOOST_PP_ENUM_BINARY_PARAMS(N, U, & _))
+ : args_(BOOST_PP_ENUM_PARAMS(N, _)) {}
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/core/detail/compose.hpp b/boost/spirit/home/phoenix/core/detail/compose.hpp
new file mode 100644
index 0000000000..945a3d3f19
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/detail/compose.hpp
@@ -0,0 +1,47 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_CORE_DETAIL_COMPOSE_DETAIL_HPP
+#define PHOENIX_CORE_DETAIL_COMPOSE_DETAIL_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+
+#define PHOENIX_AS_ACTOR_CONVERT(z, n, data) \
+ as_actor<BOOST_PP_CAT(T, n)>::convert(BOOST_PP_CAT(_, n))
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/core/detail/compose.hpp"))
+#include BOOST_PP_ITERATE()
+
+#undef PHOENIX_AS_ACTOR_CONVERT
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <typename EvalPolicy, BOOST_PP_ENUM_PARAMS(N, typename T)>
+ inline actor<
+ typename as_composite<EvalPolicy, BOOST_PP_ENUM_PARAMS(N, T)>::type>
+ compose(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _))
+ {
+ return actor<
+ typename as_composite<EvalPolicy, BOOST_PP_ENUM_PARAMS(N, T)>::type>(
+ BOOST_PP_ENUM(N, PHOENIX_AS_ACTOR_CONVERT, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/core/detail/composite.hpp b/boost/spirit/home/phoenix/core/detail/composite.hpp
new file mode 100644
index 0000000000..6970f7c96e
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/detail/composite.hpp
@@ -0,0 +1,36 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_CORE_DETAIL_COMPOSITE_HPP
+#define PHOENIX_CORE_DETAIL_COMPOSITE_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/core/detail/composite.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename U)>
+ composite(BOOST_PP_ENUM_BINARY_PARAMS(N, U, & _))
+ : base_type(BOOST_PP_ENUM_PARAMS(N, _)) {}
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/core/detail/composite_eval.hpp b/boost/spirit/home/phoenix/core/detail/composite_eval.hpp
new file mode 100644
index 0000000000..14f12afbc1
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/detail/composite_eval.hpp
@@ -0,0 +1,106 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_CORE_DETAIL_COMPOSITE_EVAL_HPP
+#define PHOENIX_CORE_DETAIL_COMPOSITE_EVAL_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+
+ namespace detail
+ {
+ template <int N>
+ struct composite_eval;
+
+ template <>
+ struct composite_eval<0>
+ {
+ template <typename Composite, typename Env>
+ struct result
+ {
+ typedef typename Composite::eval_policy_type::
+ template result<Env>::type
+ type;
+ };
+
+ template <typename RT, typename Composite, typename Env>
+ static RT
+ call(Composite const& /*composite*/, Env const& env)
+ {
+ typedef typename Composite::eval_policy_type eval_policy_type;
+ return eval_policy_type::template eval<RT>(env);
+ }
+ };
+
+ template <typename Actor, typename Env>
+ struct eval_is_actor
+ : is_actor<typename Actor::template result<Env>::type> {};
+
+ template <typename Actor, typename Env>
+ struct eval_is_void
+ : is_same<typename Actor::template result<Env>::type, fusion::void_> {};
+ }
+
+#define PHOENIX_GET_ACTOR_TYPE(z, n, data) \
+ typedef \
+ typename fusion::result_of::value_at_c<Composite, n>::type \
+ BOOST_PP_CAT(actor, n);
+
+#define PHOENIX_GET_ACTOR(z, n, data) \
+ fusion::at_c<n>(composite)
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/core/detail/composite_eval.hpp"))
+#include BOOST_PP_ITERATE()
+
+#undef PHOENIX_GET_ACTOR
+#undef PHOENIX_GET_ACTOR_TYPE
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ namespace detail
+ {
+ template <>
+ struct composite_eval<N>
+ {
+ template <typename Composite, typename Env>
+ struct result
+ {
+ BOOST_PP_REPEAT(N, PHOENIX_GET_ACTOR_TYPE, _)
+
+ typedef typename
+ Composite::eval_policy_type::template result<
+ Env, BOOST_PP_ENUM_PARAMS(N, actor)
+ >::type
+ type;
+ };
+
+ template <typename RT, typename Composite, typename Env>
+ static RT
+ call(Composite const& composite, Env const& env)
+ {
+ typedef typename Composite::eval_policy_type eval_policy_type;
+ return eval_policy_type::template eval<RT>(
+ env, BOOST_PP_ENUM(N, PHOENIX_GET_ACTOR, _));
+ }
+ };
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/core/detail/composite_info.hpp b/boost/spirit/home/phoenix/core/detail/composite_info.hpp
new file mode 100644
index 0000000000..48cebea88a
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/detail/composite_info.hpp
@@ -0,0 +1,40 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_DETAIL_COMPOSITE_INFO_HPP
+#define PHOENIX_CORE_DETAIL_COMPOSITE_INFO_HPP
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/greater.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/spirit/home/fusion/algorithm/fold.hpp>
+
+namespace boost { namespace phoenix { namespace detail
+{
+ struct max_nesting
+ {
+ template <typename T, typename State>
+ struct result :
+ mpl::if_<
+ mpl::greater<typename T::nesting, State>
+ , typename T::nesting
+ , State
+ >
+ {};
+ };
+
+ template <typename ActorTuple>
+ struct compute_nesting
+ {
+ typedef typename
+ fusion::meta::fold<ActorTuple, mpl::int_<0>, max_nesting>::type
+ type;
+ };
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/phoenix/core/detail/function_eval.hpp b/boost/spirit/home/phoenix/core/detail/function_eval.hpp
new file mode 100644
index 0000000000..711b32c4b1
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/detail/function_eval.hpp
@@ -0,0 +1,142 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING)
+#if !defined(PHOENIX_CORE_DETAIL_FUNCTION_EVAL_HPP)
+#define PHOENIX_CORE_DETAIL_FUNCTION_EVAL_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/enum.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/find.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+// we assume that mpl::vectorN, where N = PHOENIX_COMPOSITE_LIMIT
+// is included already.
+
+namespace boost { namespace phoenix { namespace detail
+{
+ template <int N>
+ struct function_eval;
+
+ template <>
+ struct function_eval<0>
+ {
+ template <typename Env, typename F>
+ struct result
+ {
+ typedef typename
+ remove_reference<
+ typename F::template result<Env>::type
+ >::type
+ fn;
+ typedef typename fn::result_type type;
+ };
+
+ template <typename RT, typename Env, typename F>
+ static RT
+ eval(Env const& env, F const& f)
+ {
+ return f.eval(env)();
+ }
+ };
+
+ template <typename T>
+ T& help_rvalue_deduction(T& x)
+ {
+ return x;
+ }
+
+ template <typename T>
+ T const& help_rvalue_deduction(T const& x)
+ {
+ return x;
+ }
+
+// When we call f(_0, _1...) we remove the reference when deducing f's
+// return type. $$$ Explain why $$$
+
+#define PHOENIX_GET_ARG(z, n, data) \
+ typedef typename \
+ remove_reference< \
+ typename BOOST_PP_CAT(A, n)::template result<Env>::type \
+ >::type \
+ BOOST_PP_CAT(a, n);
+
+#define PHOENIX_EVAL_ARG(z, n, data) \
+ help_rvalue_deduction(BOOST_PP_CAT(_, n).eval(env))
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT), \
+ "boost/spirit/home/phoenix/core/detail/function_eval.hpp"))
+#include BOOST_PP_ITERATE()
+
+}}} // namespace boost::phoenix::detail
+
+#undef PHOENIX_GET_ARG
+#undef PHOENIX_EVAL_ARG
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <>
+ struct function_eval<N>
+ {
+ template <typename Env, typename F
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ struct result
+ {
+ typedef typename
+ remove_reference<
+ typename F::template result<Env>::type
+ >::type
+ fn;
+ BOOST_PP_REPEAT(N, PHOENIX_GET_ARG, _)
+
+ typedef BOOST_PP_CAT(mpl::vector, N)
+ <BOOST_PP_ENUM_PARAMS(N, a)>
+ args;
+
+ typedef typename
+ fn::template result<BOOST_PP_ENUM_PARAMS(N, a)>
+ function_apply;
+
+ typedef typename
+ mpl::eval_if<
+ is_same<
+ typename mpl::find<args, fusion::void_>::type
+ , typename mpl::end<args>::type>
+ , function_apply
+ , mpl::identity<fusion::void_>
+ >::type
+ type;
+ };
+
+ template <typename RT, typename Env, typename F
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ static RT
+ eval(Env const& env, F const& f
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _))
+ {
+ return f.eval(env)(BOOST_PP_ENUM(N, PHOENIX_EVAL_ARG, _));
+ }
+ };
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/core/is_actor.hpp b/boost/spirit/home/phoenix/core/is_actor.hpp
new file mode 100644
index 0000000000..ba0e77cbfc
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/is_actor.hpp
@@ -0,0 +1,29 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_IS_ACTOR_HPP
+#define PHOENIX_CORE_IS_ACTOR_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace phoenix
+{
+///////////////////////////////////////////////////////////////////////////////
+//
+// is_actor<T>
+//
+// Tests if T is an actor. Evaluates to mpl::true_ or mpl::false_
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct is_actor : mpl::false_ {};
+
+ template <typename Base>
+ struct is_actor<actor<Base> > : mpl::true_ {};
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/core/limits.hpp b/boost/spirit/home/phoenix/core/limits.hpp
new file mode 100644
index 0000000000..50c7573246
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/limits.hpp
@@ -0,0 +1,79 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_LIMITS_HPP
+#define PHOENIX_CORE_LIMITS_HPP
+
+#include <boost/preprocessor/dec.hpp>
+
+#if !defined(PHOENIX_LIMIT)
+# define PHOENIX_LIMIT 10
+#elif (PHOENIX_LIMIT < 5)
+# error "PHOENIX_LIMIT is set too low"
+#endif
+
+#if !defined(PHOENIX_ARG_LIMIT)
+# define PHOENIX_ARG_LIMIT PHOENIX_LIMIT
+#elif (PHOENIX_ARG_LIMIT < 5)
+# error "PHOENIX_ARG_LIMIT is set too low"
+#endif
+
+#if !defined(PHOENIX_ACTOR_LIMIT)
+# define PHOENIX_ACTOR_LIMIT PHOENIX_LIMIT
+#elif (PHOENIX_ACTOR_LIMIT > PHOENIX_ARG_LIMIT)
+# error "PHOENIX_ACTOR_LIMIT > PHOENIX_ARG_LIMIT"
+#elif (PHOENIX_ACTOR_LIMIT < 3)
+# error "PHOENIX_ACTOR_LIMIT is set too low"
+#endif
+
+#if !defined(PHOENIX_COMPOSITE_LIMIT)
+# define PHOENIX_COMPOSITE_LIMIT PHOENIX_LIMIT
+#elif (PHOENIX_COMPOSITE_LIMIT < 5)
+# error "PHOENIX_COMPOSITE_LIMIT is set too low"
+#endif
+
+#if !defined(PHOENIX_MEMBER_LIMIT)
+# define PHOENIX_MEMBER_LIMIT BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT))
+#elif (PHOENIX_MEMBER_LIMIT > PHOENIX_COMPOSITE_LIMIT)
+# error "PHOENIX_MEMBER_LIMIT > PHOENIX_COMPOSITE_LIMIT"
+#elif (PHOENIX_MEMBER_LIMIT < 3)
+# error "PHOENIX_MEMBER_LIMIT is set too low"
+#endif
+
+#if !defined(PHOENIX_CATCH_LIMIT)
+# define PHOENIX_CATCH_LIMIT BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT)
+#elif (PHOENIX_CATCH_LIMIT < 1)
+# error "PHOENIX_CATCH_LIMIT is set too low"
+#endif
+
+#if !defined(PHOENIX_DYNAMIC_LIMIT)
+# define PHOENIX_DYNAMIC_LIMIT PHOENIX_LIMIT
+#elif (PHOENIX_DYNAMIC_LIMIT < 1)
+# error "PHOENIX_DYNAMIC_LIMIT is set too low"
+#endif
+
+#if !defined(PHOENIX_LOCAL_LIMIT)
+# define PHOENIX_LOCAL_LIMIT PHOENIX_LIMIT
+#elif (PHOENIX_LOCAL_LIMIT < 3)
+# error "PHOENIX_LOCAL_LIMIT is set too low"
+#endif
+
+
+#if !defined(FUSION_MAX_VECTOR_SIZE)
+# define FUSION_MAX_VECTOR_SIZE PHOENIX_LIMIT
+#elif (FUSION_MAX_VECTOR_SIZE < PHOENIX_LIMIT)
+# error "FUSION_MAX_VECTOR_SIZE < PHOENIX_LIMIT"
+#endif
+
+// this include will bring in mpl::vectorN and
+// fusion::vectorN where N is PHOENIX_LIMIT
+#include <boost/fusion/include/vector.hpp>
+
+// for some reason, this must be included now to make
+// detail/type_deduction.hpp compile. $$$ TODO: Investigate further $$$
+#include <boost/mpl/vector/vector20.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/core/nothing.hpp b/boost/spirit/home/phoenix/core/nothing.hpp
new file mode 100644
index 0000000000..029fbbfdf9
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/nothing.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_NOTHING_HPP
+#define PHOENIX_CORE_NOTHING_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace phoenix
+{
+///////////////////////////////////////////////////////////////////////////////
+//
+// null_actor
+//
+// A actor that does nothing (a "bum", if you will :-).
+//
+///////////////////////////////////////////////////////////////////////////////
+ struct null_actor
+ {
+ typedef mpl::false_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename Env>
+ void
+ eval(Env const&) const
+ {
+ }
+ };
+
+ actor<null_actor> const nothing = null_actor();
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/core/reference.hpp b/boost/spirit/home/phoenix/core/reference.hpp
new file mode 100644
index 0000000000..2e1f588cbc
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/reference.hpp
@@ -0,0 +1,80 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_REFERENCE_HPP
+#define PHOENIX_CORE_REFERENCE_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename T>
+ struct reference
+ {
+ // $$$ TODO: a better (user friendly) static assert
+ BOOST_STATIC_ASSERT(
+ mpl::not_<is_reference<T> >::value != 0);
+
+ typedef mpl::false_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef T& type;
+ };
+
+ reference(T& arg)
+ : ref(arg) {}
+
+ template <typename Env>
+ T& eval(Env const&) const
+ {
+ return ref;
+ }
+
+ T& ref;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ reference& operator= (reference const&);
+ };
+
+ template <typename T>
+ inline actor<reference<T> > const
+ ref(T& v)
+ {
+ return reference<T>(v);
+ }
+
+ template <typename T>
+ inline actor<reference<T const> > const
+ cref(T const& v)
+ {
+ return reference<T const>(v);
+ }
+
+ namespace detail
+ {
+ struct error_attempting_to_convert_an_actor_to_a_reference {};
+ }
+
+ template <typename Base>
+ void
+ ref(actor<Base> const& v
+ , detail::error_attempting_to_convert_an_actor_to_a_reference
+ = detail::error_attempting_to_convert_an_actor_to_a_reference());
+
+ template <typename Base>
+ void
+ cref(actor<Base> const& v
+ , detail::error_attempting_to_convert_an_actor_to_a_reference
+ = detail::error_attempting_to_convert_an_actor_to_a_reference());
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/core/value.hpp b/boost/spirit/home/phoenix/core/value.hpp
new file mode 100644
index 0000000000..a275a7d221
--- /dev/null
+++ b/boost/spirit/home/phoenix/core/value.hpp
@@ -0,0 +1,158 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CORE_VALUE_HPP
+#define PHOENIX_CORE_VALUE_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/as_actor.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/is_function.hpp>
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace meta
+ {
+ template<typename T>
+ struct const_ref
+ : add_reference<typename add_const<T>::type>
+ {};
+
+ template<typename T>
+ struct argument_type
+ : mpl::eval_if<
+ is_function<typename remove_pointer<T>::type>,
+ mpl::identity<T>,
+ const_ref<T> >
+ {
+ typedef T type;
+ };
+ }
+
+ template <typename T>
+ struct value
+ {
+ BOOST_STATIC_ASSERT(
+ mpl::not_<is_reference<T> >::value != 0);
+
+ typedef mpl::false_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef T type;
+ };
+
+ value()
+ : val() {}
+
+ value(T const& arg)
+ : val(arg) {}
+
+ template <typename Env>
+ T const&
+ eval(Env const&) const
+ {
+ return val;
+ }
+
+ T val;
+ };
+
+ template <typename Actor>
+ struct actor_value
+ {
+ typedef typename Actor::no_nullary no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ remove_reference<
+ typename eval_result<Actor, Env>::type
+ >::type
+ type;
+ };
+
+ actor_value(Actor const& actor)
+ : actor(actor) {}
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return actor.eval(env);
+ }
+
+ Actor actor;
+ };
+
+ template <typename T>
+ inline typename as_actor<T>::type
+ val(T const& v)
+ {
+ return as_actor<T>::convert(v);
+ }
+
+ template <typename Derived>
+ inline actor<actor_value<Derived> >
+ val(actor<Derived> const& actor)
+ {
+ return actor_value<Derived>(actor);
+ }
+
+ template <typename T>
+ struct as_actor_base
+ {
+ typedef value<T> type;
+
+ static value<T>
+ convert(typename meta::argument_type<T>::type x)
+ {
+ return value<T>(x);
+ }
+ };
+
+ // Sometimes it is necessary to auto-convert references to
+ // a value<T>. This happens when we are re-currying. This
+ // cannot happen through the standard public actor interfaces.
+ template <typename T>
+ struct as_actor_base<T&>
+ {
+ typedef value<T> type;
+
+ static value<T>
+ convert(T& x)
+ {
+ return value<T>(x);
+ }
+ };
+
+ template <typename T, int N>
+ struct as_actor_base<T[N]>
+ {
+ typedef value<T const*> type;
+
+ static value<T const*>
+ convert(T const x[N])
+ {
+ return value<T const*>(x);
+ }
+ };
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/detail/local_reference.hpp b/boost/spirit/home/phoenix/detail/local_reference.hpp
new file mode 100644
index 0000000000..ad1fdb4ab8
--- /dev/null
+++ b/boost/spirit/home/phoenix/detail/local_reference.hpp
@@ -0,0 +1,44 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_DETAIL_LOCAL_REFERENCE_HPP
+#define PHOENIX_DETAIL_LOCAL_REFERENCE_HPP
+
+#include <boost/utility/addressof.hpp>
+
+namespace boost { namespace phoenix { namespace detail
+{
+ template <typename T>
+ struct local_reference
+ {
+ typedef T type;
+
+ explicit local_reference(T& t): t_(boost::addressof(t)) {}
+ operator T& () const { return *t_; }
+ local_reference& operator=(T const& x) { *t_ = x; return *this; }
+ local_reference const& operator=(T const& x) const { *t_ = x; return *this; }
+ T& get() const { return *t_; }
+ T* get_pointer() const { return t_; }
+
+ private:
+
+ T* t_;
+ };
+
+ template <typename T>
+ struct unwrap_local_reference
+ {
+ typedef T type; // T should be a reference
+ };
+
+ template <typename T>
+ struct unwrap_local_reference<local_reference<T> >
+ {
+ typedef T type; // unwrap the reference; T is a value
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/detail/type_deduction.hpp b/boost/spirit/home/phoenix/detail/type_deduction.hpp
new file mode 100644
index 0000000000..b99ea1e86c
--- /dev/null
+++ b/boost/spirit/home/phoenix/detail/type_deduction.hpp
@@ -0,0 +1,497 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_DETAIL_TYPE_DEDUCTION_HPP
+#define PHOENIX_DETAIL_TYPE_DEDUCTION_HPP
+
+/*=============================================================================
+
+ Return Type Deduction
+ [JDG Sept. 15, 2003]
+
+ Before C++ adopts the typeof, there is currently no way to deduce the
+ result type of an expression such as x + y. This deficiency is a major
+ problem with template metaprogramming; for example, when writing
+ forwarding functions that attempt to capture the essence of an
+ expression inside a function. Consider the std::plus<T>:
+
+ template <typename T>
+ struct plus : public binary_function<T, T, T>
+ {
+ T operator()(T const& x, T const& y) const
+ {
+ return x + y;
+ }
+ };
+
+ What's wrong with this? Well, this functor does not accurately capture
+ the behavior of the plus operator. 1) It does not handle the case where
+ x and y are of different types (e.g. x is short and y is int). 2) It
+ assumes that the arguments and return type are the same (i.e. when
+ adding a short and an int, the return type ought to be an int). Due to
+ these shortcomings, std::plus<T>(x, y) is a poor substitute for x + y.
+
+ The case where x is short and y is int does not really expose the
+ problem. We can simply use std::plus<int> and be happy that the
+ operands x and y will simply be converted to an int. The problem
+ becomes evident when an operand is a user defined type such as bigint.
+ Here, the conversion to bigint is simply not acceptable. Even if the
+ unnecessary conversion is tolerable, in generic code, it is not always
+ possible to choose the right T type that can accomodate both x and y
+ operands.
+
+ To truly model the plus operator, what we need is a polymorphic functor
+ that can take arbitrary x and y operands. Here's a rough schematic:
+
+ struct plus
+ {
+ template <typename X, typename Y>
+ unspecified-type
+ operator()(X const& x, Y const& y) const
+ {
+ return x + y;
+ }
+ };
+
+ Now, we can handle the case where X and Y are arbitrary types. We've
+ solved the first problem. To solve the second problem, we need some
+ form of return type deduction mechanism. If we had the typeof, it would
+ be something like:
+
+ template <typename X, typename Y>
+ typeof(X() + Y())
+ operator()(X const& x, Y const& y) const
+ {
+ return x + y;
+ }
+
+ Without the typeof facility, it is only possible to wrap an expression
+ such as x + y in a function or functor if we are given a hint that
+ tells us what the actual result type of such an expression is. Such a
+ hint can be in the form of a metaprogram, that, given the types of the
+ arguments, will return the result type. Example:
+
+ template <typename X, typename Y>
+ struct result_of_plus
+ {
+ typedef unspecified-type type;
+ };
+
+ Given a result_of_plus metaprogram, we can complete our polymorphic
+ plus functor:
+
+ struct plus
+ {
+ template <typename X, typename Y>
+ typename result_of_plus<X, Y>::type
+ operator()(X const& x, Y const& y) const
+ {
+ return x + y;
+ }
+ };
+
+ The process is not automatic. We have to specialize the metaprogram for
+ specific argument types. Examples:
+
+ template <>
+ struct result_of_plus<short, int>
+ {
+ typedef int type;
+ };
+
+ template <typename T>
+ struct result_of_plus<std::complex<T>, std::complex<T> >
+ {
+ typedef std::complex<T> type;
+ };
+
+ To make it easier for the user, specializations are provided for common
+ types such as primitive c++ types (e.g. int, char, double, etc.), and
+ standard types (e.g. std::complex, iostream, std containers and
+ iterators).
+
+ To further improve the ease of use, for user defined classes, we can
+ supply a few more basic specializations through metaprogramming using
+ heuristics based on canonical operator rules (Such heuristics can be
+ found in the LL and Phoenix, for example). For example, it is rather
+ common that the result of x += y is X& or the result of x || y is a
+ bool. The client is out of luck if her classes do not follow the
+ canonical rules. She'll then have to supply her own specialization.
+
+ The type deduction mechanism demostrated below approaches the problem
+ not through specialization and heuristics, but through a limited form
+ of typeof mechanism. The code does not use heuristics, hence, no
+ guessing games. The code takes advantage of the fact that, in general,
+ the result type of an expression is related to one its arguments' type.
+ For example, x + y, where x has type int and y has type double, has the
+ result type double (the second operand type). Another example, x[y]
+ where x is a vector<T> and y is a std::size_t, has the result type
+ vector<T>::reference (the vector<T>'s reference type type).
+
+ The limited form of type deduction presented can detect common
+ relations if the result of a binary or unary operation, given arguments
+ x and y with types X and Y (respectively), is X, Y, X&, Y&, X*, Y*, X
+ const*, Y const*, bool, int, unsigned, double, container and iterator
+ elements (e.g the T, where X is: T[N], T*, vector<T>, map<T>,
+ vector<T>::iterator). More arguments/return type relationships can be
+ established if needed.
+
+ A set of overloaded test(T) functions capture these argument related
+ types. Each test(T) function returns a distinct type that can be used
+ to determine the exact type of an expression.
+
+ Consider:
+
+ template <typename X, typename Y>
+ x_value_type
+ test(X const&);
+
+ template <typename X, typename Y>
+ y_value_type
+ test(Y const&);
+
+ Given an expression x + y, where x is int and y is double, the call to:
+
+ test<int, double>(x + y)
+
+ will return a y_value_type.
+
+ Now, if we rig x_value_type and y_value_type such that both have unique
+ sizes, we can use sizeof(test<X, Y>(x + y)) to determine if the result
+ type is either X or Y.
+
+ For example, if:
+
+ sizeof(test<X, Y>(x + y)) == sizeof(y_value_type)
+
+ then, we know for sure that the result of x + y has type Y.
+
+ The same basic scheme can be used to detect more argument-dependent
+ return types where the sizeof the test(T) return type is used to index
+ through a boost::mpl vector which holds each of the corresponding
+ result types.
+
+==============================================================================*/
+#include <boost/mpl/vector/vector20.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/spirit/home/phoenix/detail/local_reference.hpp>
+
+namespace boost
+{
+ struct error_cant_deduce_type {};
+}
+
+namespace boost { namespace type_deduction_detail
+{
+ typedef char(&bool_value_type)[1];
+ typedef char(&int_value_type)[2];
+ typedef char(&uint_value_type)[3];
+ typedef char(&double_value_type)[4];
+
+ typedef char(&bool_reference_type)[5];
+ typedef char(&int_reference_type)[6];
+ typedef char(&uint_reference_type)[7];
+ typedef char(&double_reference_type)[8];
+
+ typedef char(&x_value_type)[9];
+ typedef char(&x_reference_type)[10];
+ typedef char(&x_const_pointer_type)[11];
+ typedef char(&x_pointer_type)[12];
+
+ typedef char(&y_value_type)[13];
+ typedef char(&y_reference_type)[14];
+ typedef char(&y_const_pointer_type)[15];
+ typedef char(&y_pointer_type)[16];
+
+ typedef char(&container_reference_type)[17];
+ typedef char(&container_const_reference_type)[18];
+ typedef char(&container_mapped_type)[19];
+
+ typedef char(&cant_deduce_type)[20];
+
+ template <typename T, typename Plain = typename remove_cv<T>::type>
+ struct is_basic
+ : mpl::or_<
+ is_same<Plain, bool>
+ , is_same<Plain, int>
+ , is_same<Plain, unsigned>
+ , is_same<Plain, double>
+ > {};
+
+ template <typename C>
+ struct reference_type
+ {
+ typedef typename C::reference type;
+ };
+
+ template <typename T>
+ struct reference_type<T const>
+ : reference_type<T> {};
+
+ template <typename T, std::size_t N>
+ struct reference_type<T[N]>
+ {
+ typedef T& type;
+ };
+
+ template <typename T>
+ struct reference_type<T*>
+ {
+ typedef T& type;
+ };
+
+ template <typename T>
+ struct reference_type<T* const>
+ {
+ typedef T const& type;
+ };
+
+ template <typename C>
+ struct const_reference_type
+ {
+ typedef typename C::const_reference type;
+ };
+
+ template <typename C>
+ struct mapped_type
+ {
+ typedef typename C::mapped_type type;
+ };
+
+ struct asymmetric;
+
+ template <typename X, typename Y>
+ cant_deduce_type
+ test(...); // The black hole !!!
+
+ template <typename X, typename Y>
+ bool_value_type
+ test(bool const&);
+
+ template <typename X, typename Y>
+ int_value_type
+ test(int const&);
+
+ template <typename X, typename Y>
+ uint_value_type
+ test(unsigned const&);
+
+ template <typename X, typename Y>
+ double_value_type
+ test(double const&);
+
+ template <typename X, typename Y>
+ bool_reference_type
+ test(bool&);
+
+ template <typename X, typename Y>
+ int_reference_type
+ test(int&);
+
+ template <typename X, typename Y>
+ uint_reference_type
+ test(unsigned&);
+
+ template <typename X, typename Y>
+ double_reference_type
+ test(double&);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ mpl::or_<is_basic<X>, is_const<X> >
+ , x_value_type
+ >::type
+ test(X const&);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ is_basic<X>
+ , x_reference_type
+ >::type
+ test(X&);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ mpl::or_<
+ is_basic<X>
+ , is_const<X>
+ >
+ , x_const_pointer_type
+ >::type
+ test(X const*);
+
+ template <typename X, typename Y>
+ x_pointer_type
+ test(X*);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ mpl::or_<
+ is_basic<Y>
+ , is_same<Y, asymmetric>
+ , is_const<Y>
+ , is_same<X, Y>
+ >
+ , y_value_type
+ >::type
+ test(Y const&);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ mpl::or_<
+ is_basic<Y>
+ , is_same<Y, asymmetric>
+ , is_same<X, Y>
+ >
+ , y_reference_type
+ >::type
+ test(Y&);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ mpl::or_<
+ is_same<Y, asymmetric>
+ , is_const<Y>
+ , is_same<X, Y>
+ >
+ , y_const_pointer_type
+ >::type
+ test(Y const*);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ mpl::or_<
+ is_same<Y, asymmetric>
+ , is_same<X, Y>
+ >
+ , y_pointer_type
+ >::type
+ test(Y*);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ mpl::or_<
+ is_basic<typename X::value_type>
+ , is_same<typename add_reference<X>::type, typename X::reference>
+ >
+ , container_reference_type
+ >::type
+ test(typename X::reference);
+
+ template <typename X, typename Y, typename Z>
+ typename enable_if<
+ mpl::and_<
+ mpl::or_<is_array<X>, is_pointer<X> >
+ , mpl::not_<is_basic<Z> >
+ , mpl::not_<is_same<X, Z> >
+ >
+ , container_reference_type
+ >::type
+ test(Z&);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ mpl::or_<
+ is_basic<typename X::value_type>
+ , is_same<typename add_reference<X>::type, typename X::const_reference>
+ >
+ , container_const_reference_type
+ >::type
+ test(typename X::const_reference);
+
+ template <typename X, typename Y>
+ typename disable_if<
+ is_basic<typename X::mapped_type>
+ , container_mapped_type
+ >::type
+ test(typename X::mapped_type);
+
+ template <typename X, typename Y>
+ struct base_result_of
+ {
+ typedef typename phoenix::detail::unwrap_local_reference<X>::type x_type_;
+ typedef typename phoenix::detail::unwrap_local_reference<Y>::type y_type_;
+ typedef typename remove_reference<x_type_>::type x_type;
+ typedef typename remove_reference<y_type_>::type y_type;
+
+ typedef mpl::vector20<
+ mpl::identity<bool>
+ , mpl::identity<int>
+ , mpl::identity<unsigned>
+ , mpl::identity<double>
+ , mpl::identity<bool&>
+ , mpl::identity<int&>
+ , mpl::identity<unsigned&>
+ , mpl::identity<double&>
+ , mpl::identity<x_type>
+ , mpl::identity<x_type&>
+ , mpl::identity<x_type const*>
+ , mpl::identity<x_type*>
+ , mpl::identity<y_type>
+ , mpl::identity<y_type&>
+ , mpl::identity<y_type const*>
+ , mpl::identity<y_type*>
+ , reference_type<x_type>
+ , const_reference_type<x_type>
+ , mapped_type<x_type>
+ , mpl::identity<error_cant_deduce_type>
+ >
+ types;
+ };
+
+}} // namespace boost::type_deduction_detail
+
+#define BOOST_RESULT_OF_COMMON(expr, name, Y, SYMMETRY) \
+ struct name \
+ { \
+ typedef type_deduction_detail::base_result_of<X, Y> base_type; \
+ static typename base_type::x_type x; \
+ static typename base_type::y_type y; \
+ \
+ BOOST_STATIC_CONSTANT(int, \
+ size = sizeof( \
+ type_deduction_detail::test< \
+ typename base_type::x_type \
+ , SYMMETRY \
+ >(expr) \
+ )); \
+ \
+ BOOST_STATIC_CONSTANT(int, index = (size / sizeof(char)) - 1); \
+ \
+ typedef typename mpl::at_c< \
+ typename base_type::types, index>::type id; \
+ typedef typename id::type type; \
+ };
+
+#define BOOST_UNARY_RESULT_OF(expr, name) \
+ template <typename X> \
+ BOOST_RESULT_OF_COMMON(expr, name, \
+ type_deduction_detail::asymmetric, type_deduction_detail::asymmetric)
+
+#define BOOST_BINARY_RESULT_OF(expr, name) \
+ template <typename X, typename Y> \
+ BOOST_RESULT_OF_COMMON(expr, name, Y, typename base_type::y_type)
+
+#define BOOST_ASYMMETRIC_BINARY_RESULT_OF(expr, name) \
+ template <typename X, typename Y> \
+ BOOST_RESULT_OF_COMMON(expr, name, Y, type_deduction_detail::asymmetric)
+
+#endif
diff --git a/boost/spirit/home/phoenix/function.hpp b/boost/spirit/home/phoenix/function.hpp
new file mode 100644
index 0000000000..5309d9af3f
--- /dev/null
+++ b/boost/spirit/home/phoenix/function.hpp
@@ -0,0 +1,13 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_FUNCTION_HPP
+#define PHOENIX_FUNCTION_HPP
+
+#include <boost/spirit/home/phoenix/version.hpp>
+#include <boost/spirit/home/phoenix/function/function.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/function/detail/function_call.hpp b/boost/spirit/home/phoenix/function/detail/function_call.hpp
new file mode 100644
index 0000000000..622f118a19
--- /dev/null
+++ b/boost/spirit/home/phoenix/function/detail/function_call.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_FUNCTION_DETAIL_FUNCTION_CALL_HPP
+#define PHOENIX_FUNCTION_DETAIL_FUNCTION_CALL_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT), \
+ "boost/spirit/home/phoenix/function/detail/function_call.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename A)>
+ actor<typename as_composite<detail::function_eval<N>, F
+ , BOOST_PP_ENUM_PARAMS(N, A)>::type>
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _)) const
+ {
+ return compose<detail::function_eval<N> >(f, BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/function/function.hpp b/boost/spirit/home/phoenix/function/function.hpp
new file mode 100644
index 0000000000..1cf470111b
--- /dev/null
+++ b/boost/spirit/home/phoenix/function/function.hpp
@@ -0,0 +1,48 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_FUNCTION_FUNCTION_HPP
+#define PHOENIX_FUNCTION_FUNCTION_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename F>
+ struct function
+ {
+ function() : f() {}
+ function(F const& f) : f(f) {}
+
+ actor<typename as_composite<detail::function_eval<0>, F>::type>
+ operator()() const
+ {
+ return compose<detail::function_eval<0> >(f);
+ }
+
+ template <typename A0>
+ actor<typename as_composite<detail::function_eval<1>, F, A0>::type>
+ operator()(A0 const& _0) const
+ {
+ return compose<detail::function_eval<1> >(f, _0);
+ }
+
+ template <typename A0, typename A1>
+ actor<typename as_composite<detail::function_eval<2>, F, A0, A1>::type>
+ operator()(A0 const& _0, A1 const& _1) const
+ {
+ return compose<detail::function_eval<2> >(f, _0, _1);
+ }
+
+ // Bring in the rest of the function call operators
+ #include <boost/spirit/home/phoenix/function/detail/function_call.hpp>
+
+ F f;
+ };
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/fusion.hpp b/boost/spirit/home/phoenix/fusion.hpp
new file mode 100644
index 0000000000..2d0d699672
--- /dev/null
+++ b/boost/spirit/home/phoenix/fusion.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_FUSION_HPP
+#define PHOENIX_FUSION_HPP
+
+#include <boost/spirit/home/phoenix/fusion/at.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/fusion/at.hpp b/boost/spirit/home/phoenix/fusion/at.hpp
new file mode 100644
index 0000000000..579658d195
--- /dev/null
+++ b/boost/spirit/home/phoenix/fusion/at.hpp
@@ -0,0 +1,49 @@
+/*=============================================================================
+ Copyright (c) 2005-2008 Hartmut Kaiser
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_SEQUENCE_AT_HPP
+#define PHOENIX_SEQUENCE_AT_HPP
+
+#include <boost/fusion/include/at.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <int N>
+ struct at_eval
+ {
+ template <typename Env, typename Tuple>
+ struct result
+ {
+ typedef typename Tuple::template result<Env>::type tuple;
+ typedef typename
+ fusion::result_of::at_c<
+ typename remove_reference<tuple>::type, N
+ >::type
+ type;
+ };
+
+ template <typename RT, typename Env, typename Tuple>
+ static RT
+ eval(Env const& env, Tuple const& t)
+ {
+ return fusion::at_c<N>(t.eval(env));
+ }
+ };
+
+ template <int N, typename Tuple>
+ inline actor<typename as_composite<at_eval<N>, Tuple>::type>
+ at_c(Tuple const& tup)
+ {
+ return compose<at_eval<N> >(tup);
+ }
+
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/object.hpp b/boost/spirit/home/phoenix/object.hpp
new file mode 100644
index 0000000000..5eecb96f9f
--- /dev/null
+++ b/boost/spirit/home/phoenix/object.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OBJECT_HPP
+#define PHOENIX_OBJECT_HPP
+
+#include <boost/spirit/home/phoenix/version.hpp>
+#include <boost/spirit/home/phoenix/object/new.hpp>
+#include <boost/spirit/home/phoenix/object/construct.hpp>
+#include <boost/spirit/home/phoenix/object/delete.hpp>
+#include <boost/spirit/home/phoenix/object/static_cast.hpp>
+#include <boost/spirit/home/phoenix/object/const_cast.hpp>
+#include <boost/spirit/home/phoenix/object/dynamic_cast.hpp>
+#include <boost/spirit/home/phoenix/object/reinterpret_cast.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/object/const_cast.hpp b/boost/spirit/home/phoenix/object/const_cast.hpp
new file mode 100644
index 0000000000..77f24999c0
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/const_cast.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OBJECT_CONST_CAST_HPP
+#define PHOENIX_OBJECT_CONST_CAST_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace impl
+ {
+ template <typename T>
+ struct const_cast_eval
+ {
+ template <typename Env, typename U>
+ struct result
+ {
+ typedef T type;
+ };
+
+ template <typename RT, typename Env, typename U>
+ static RT
+ eval(Env const& env, U& obj)
+ {
+ return const_cast<RT>(obj.eval(env));
+ }
+ };
+ }
+
+ template <typename T, typename U>
+ inline actor<typename as_composite<impl::const_cast_eval<T>, U>::type>
+ const_cast_(U const& obj)
+ {
+ return compose<impl::const_cast_eval<T> >(obj);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/object/construct.hpp b/boost/spirit/home/phoenix/object/construct.hpp
new file mode 100644
index 0000000000..d26d6a4fce
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/construct.hpp
@@ -0,0 +1,80 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OBJECT_CONSTRUCT_HPP
+#define PHOENIX_OBJECT_CONSTRUCT_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace detail
+ {
+ template <typename T>
+ struct construct_eval
+ {
+ template <typename Env,
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)>
+ struct result
+ {
+ typedef T type;
+ };
+
+ template <typename RT, typename Env>
+ static RT
+ eval(Env const& env)
+ {
+ return RT();
+ }
+
+ template <typename RT, typename Env, typename A0>
+ static RT
+ eval(Env const& env, A0& _0)
+ {
+ return RT(_0.eval(env));
+ }
+
+ template <typename RT
+ , typename Env, typename A0, typename A1>
+ static RT
+ eval(Env const& env, A0& _0, A1& _1)
+ {
+ return RT(_0.eval(env), _1.eval(env));
+ }
+
+ // Bring in the rest of the evals
+ #include <boost/spirit/home/phoenix/object/detail/construct_eval.hpp>
+ };
+ }
+
+ template <typename T>
+ inline actor<typename as_composite<detail::construct_eval<T> >::type>
+ construct()
+ {
+ return compose<detail::construct_eval<T> >();
+ }
+
+ template <typename T, typename A0>
+ inline actor<typename as_composite<detail::construct_eval<T>, A0>::type>
+ construct(A0 const& _0)
+ {
+ return compose<detail::construct_eval<T> >(_0);
+ }
+
+ template <typename T, typename A0, typename A1>
+ inline actor<typename as_composite<detail::construct_eval<T>, A0, A1>::type>
+ construct(A0 const& _0, A1 const& _1)
+ {
+ return compose<detail::construct_eval<T> >(_0, _1);
+ }
+
+ // Bring in the rest of the new_ functions
+ #include <boost/spirit/home/phoenix/object/detail/construct.hpp>
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/object/delete.hpp b/boost/spirit/home/phoenix/object/delete.hpp
new file mode 100644
index 0000000000..1b2328ca6e
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/delete.hpp
@@ -0,0 +1,41 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OBJECT_DELETE_HPP
+#define PHOENIX_OBJECT_DELETE_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace impl
+ {
+ struct delete_eval
+ {
+ template <typename Env, typename P>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename Args, typename Env, typename P>
+ static void
+ eval(Env const& env, P& p)
+ {
+ delete p.eval(env);
+ }
+ };
+ }
+
+ template <typename P>
+ inline actor<typename as_composite<impl::delete_eval, P>::type>
+ delete_(P const& p)
+ {
+ return compose<impl::delete_eval>(p);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/object/detail/construct.hpp b/boost/spirit/home/phoenix/object/detail/construct.hpp
new file mode 100644
index 0000000000..d474f960f3
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/detail/construct.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_OBJECT_DETAIL_CONSTRUCT_HPP
+#define PHOENIX_OBJECT_DETAIL_CONSTRUCT_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/object/detail/construct.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <typename T, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline actor<typename as_composite<detail::construct_eval<T>
+ , BOOST_PP_ENUM_PARAMS(N, A)>::type>
+ construct(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
+ {
+ return compose<detail::construct_eval<T> >(BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/object/detail/construct_eval.hpp b/boost/spirit/home/phoenix/object/detail/construct_eval.hpp
new file mode 100644
index 0000000000..aad710f230
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/detail/construct_eval.hpp
@@ -0,0 +1,46 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_OBJECT_DETAIL_CONSTRUCT_EVAL_HPP
+#define PHOENIX_OBJECT_DETAIL_CONSTRUCT_EVAL_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define PHOENIX_EVAL_ARG(z, n, data) \
+ BOOST_PP_CAT(_, n).eval(env)
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/object/detail/construct_eval.hpp"))
+#include BOOST_PP_ITERATE()
+
+#undef PHOENIX_EVAL_ARG
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <typename RT, typename Env, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ static RT
+ eval(Env const& env, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _))
+ {
+ return RT(BOOST_PP_ENUM(N, PHOENIX_EVAL_ARG, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/object/detail/new.hpp b/boost/spirit/home/phoenix/object/detail/new.hpp
new file mode 100644
index 0000000000..7767c718db
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/detail/new.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_OBJECT_DETAIL_NEW_HPP
+#define PHOENIX_OBJECT_DETAIL_NEW_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/object/detail/new.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <typename T, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline actor<typename as_composite<detail::new_eval<T>
+ , BOOST_PP_ENUM_PARAMS(N, A)>::type>
+ new_(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
+ {
+ return compose<detail::new_eval<T> >(BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/object/detail/new_eval.hpp b/boost/spirit/home/phoenix/object/detail/new_eval.hpp
new file mode 100644
index 0000000000..dbaa79191d
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/detail/new_eval.hpp
@@ -0,0 +1,47 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_OBJECT_DETAIL_NEW_EVAL_HPP
+#define PHOENIX_OBJECT_DETAIL_NEW_EVAL_HPP
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define PHOENIX_EVAL_ARG(z, n, data) \
+ BOOST_PP_CAT(_, n).eval(env)
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_COMPOSITE_LIMIT, \
+ "boost/spirit/home/phoenix/object/detail/new_eval.hpp"))
+#include BOOST_PP_ITERATE()
+
+#undef PHOENIX_EVAL_ARG
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <typename RT, typename Env, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ static RT
+ eval(Env const& env, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _))
+ {
+ return new T(BOOST_PP_ENUM(N, PHOENIX_EVAL_ARG, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/object/dynamic_cast.hpp b/boost/spirit/home/phoenix/object/dynamic_cast.hpp
new file mode 100644
index 0000000000..02b7c22934
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/dynamic_cast.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OBJECT_DYNAMIC_CAST_HPP
+#define PHOENIX_OBJECT_DYNAMIC_CAST_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace impl
+ {
+ template <typename T>
+ struct dynamic_cast_eval
+ {
+ template <typename Env, typename U>
+ struct result
+ {
+ typedef T type;
+ };
+
+ template <typename RT, typename Env, typename U>
+ static RT
+ eval(Env const& env, U& obj)
+ {
+ return dynamic_cast<RT>(obj.eval(env));
+ }
+ };
+ }
+
+ template <typename T, typename U>
+ inline actor<typename as_composite<impl::dynamic_cast_eval<T>, U>::type>
+ dynamic_cast_(U const& obj)
+ {
+ return compose<impl::dynamic_cast_eval<T> >(obj);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/object/new.hpp b/boost/spirit/home/phoenix/object/new.hpp
new file mode 100644
index 0000000000..58bb64dfc4
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/new.hpp
@@ -0,0 +1,80 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OBJECT_NEW_HPP
+#define PHOENIX_OBJECT_NEW_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace detail
+ {
+ template <typename T>
+ struct new_eval
+ {
+ template <typename Env,
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)>
+ struct result
+ {
+ typedef T* type;
+ };
+
+ template <typename RT, typename Env>
+ static RT
+ eval(Env const& /*env*/)
+ {
+ return new T;
+ }
+
+ template <typename RT, typename Env, typename A0>
+ static RT
+ eval(Env const& env, A0& _0)
+ {
+ return new T(_0.eval(env));
+ }
+
+ template <typename RT, typename Env
+ , typename A0, typename A1>
+ static RT
+ eval(Env const& env, A0& _0, A1& _1)
+ {
+ return new T(_0.eval(env), _1.eval(env));
+ }
+
+ // Bring in the rest of the evals
+ #include <boost/spirit/home/phoenix/object/detail/new_eval.hpp>
+ };
+ }
+
+ template <typename T>
+ inline actor<typename as_composite<detail::new_eval<T> >::type>
+ new_()
+ {
+ return compose<detail::new_eval<T> >();
+ }
+
+ template <typename T, typename A0>
+ inline actor<typename as_composite<detail::new_eval<T>, A0>::type>
+ new_(A0 const& _0)
+ {
+ return compose<detail::new_eval<T> >(_0);
+ }
+
+ template <typename T, typename A0, typename A1>
+ inline actor<typename as_composite<detail::new_eval<T>, A0, A1>::type>
+ new_(A0 const& _0, A1 const& _1)
+ {
+ return compose<detail::new_eval<T> >(_0, _1);
+ }
+
+ // Bring in the rest of the new_ functions
+ #include <boost/spirit/home/phoenix/object/detail/new.hpp>
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/object/reinterpret_cast.hpp b/boost/spirit/home/phoenix/object/reinterpret_cast.hpp
new file mode 100644
index 0000000000..9e255d820d
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/reinterpret_cast.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OBJECT_REINTERPRET_CAST_HPP
+#define PHOENIX_OBJECT_REINTERPRET_CAST_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace impl
+ {
+ template <typename T>
+ struct reinterpret_cast_eval
+ {
+ template <typename Env, typename U>
+ struct result
+ {
+ typedef T type;
+ };
+
+ template <typename RT, typename Env, typename U>
+ static RT
+ eval(Env const& env, U& obj)
+ {
+ return reinterpret_cast<RT>(obj.eval(env));
+ }
+ };
+ }
+
+ template <typename T, typename U>
+ inline actor<typename as_composite<impl::reinterpret_cast_eval<T>, U>::type>
+ reinterpret_cast_(U const& obj)
+ {
+ return compose<impl::reinterpret_cast_eval<T> >(obj);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/object/static_cast.hpp b/boost/spirit/home/phoenix/object/static_cast.hpp
new file mode 100644
index 0000000000..508d1b077d
--- /dev/null
+++ b/boost/spirit/home/phoenix/object/static_cast.hpp
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OBJECT_STATIC_CAST_HPP
+#define PHOENIX_OBJECT_STATIC_CAST_HPP
+
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ namespace impl
+ {
+ template <typename T>
+ struct static_cast_eval
+ {
+ template <typename Env, typename U>
+ struct result
+ {
+ typedef T type;
+ };
+
+ template <typename RT, typename Env, typename U>
+ static RT
+ eval(Env const& env, U& obj)
+ {
+ return static_cast<RT>(obj.eval(env));
+ }
+ };
+ }
+
+ template <typename T, typename U>
+ inline actor<typename as_composite<impl::static_cast_eval<T>, U>::type>
+ static_cast_(U const& obj)
+ {
+ return compose<impl::static_cast_eval<T> >(obj);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator.hpp b/boost/spirit/home/phoenix/operator.hpp
new file mode 100644
index 0000000000..2d8ee6c5cf
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator.hpp
@@ -0,0 +1,20 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_HPP
+#define PHOENIX_OPERATOR_HPP
+
+#include <boost/spirit/home/phoenix/version.hpp>
+#include <boost/spirit/home/phoenix/operator/arithmetic.hpp>
+#include <boost/spirit/home/phoenix/operator/bitwise.hpp>
+#include <boost/spirit/home/phoenix/operator/comparison.hpp>
+#include <boost/spirit/home/phoenix/operator/if_else.hpp>
+#include <boost/spirit/home/phoenix/operator/logical.hpp>
+#include <boost/spirit/home/phoenix/operator/self.hpp>
+#include <boost/spirit/home/phoenix/operator/io.hpp>
+#include <boost/spirit/home/phoenix/operator/member.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/arithmetic.hpp b/boost/spirit/home/phoenix/operator/arithmetic.hpp
new file mode 100644
index 0000000000..e51b23e14a
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/arithmetic.hpp
@@ -0,0 +1,115 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_ARITHMETIC_HPP
+#define PHOENIX_OPERATOR_ARITHMETIC_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ struct negate_eval;
+ struct posit_eval;
+ struct pre_increment_eval;
+ struct pre_decrement_eval;
+ struct post_increment_eval;
+ struct post_decrement_eval;
+
+ struct plus_assign_eval;
+ struct minus_assign_eval;
+ struct multiplies_assign_eval;
+ struct divides_assign_eval;
+ struct modulus_assign_eval;
+
+ struct plus_eval;
+ struct minus_eval;
+ struct multiplies_eval;
+ struct divides_eval;
+ struct modulus_eval;
+
+ BOOST_UNARY_RESULT_OF(-x, result_of_negate)
+ BOOST_UNARY_RESULT_OF(+x, result_of_posit)
+ BOOST_UNARY_RESULT_OF(++x, result_of_pre_increment)
+ BOOST_UNARY_RESULT_OF(--x, result_of_pre_decrement)
+ BOOST_UNARY_RESULT_OF(x++, result_of_post_increment)
+ BOOST_UNARY_RESULT_OF(x--, result_of_post_decrement)
+
+ BOOST_BINARY_RESULT_OF(x += y, result_of_plus_assign)
+ BOOST_BINARY_RESULT_OF(x -= y, result_of_minus_assign)
+ BOOST_BINARY_RESULT_OF(x *= y, result_of_multiplies_assign)
+ BOOST_BINARY_RESULT_OF(x /= y, result_of_divides_assign)
+ BOOST_BINARY_RESULT_OF(x %= y, result_of_modulus_assign)
+
+ BOOST_BINARY_RESULT_OF(x + y, result_of_plus)
+ BOOST_BINARY_RESULT_OF(x - y, result_of_minus)
+ BOOST_BINARY_RESULT_OF(x * y, result_of_multiplies)
+ BOOST_BINARY_RESULT_OF(x / y, result_of_divides)
+ BOOST_BINARY_RESULT_OF(x % y, result_of_modulus)
+
+#define x a0.eval(env)
+#define y a1.eval(env)
+
+ PHOENIX_UNARY_EVAL(negate_eval, result_of_negate, -x)
+ PHOENIX_UNARY_EVAL(posit_eval, result_of_posit, +x)
+ PHOENIX_UNARY_EVAL(pre_increment_eval, result_of_pre_increment, ++x)
+ PHOENIX_UNARY_EVAL(pre_decrement_eval, result_of_pre_decrement, --x)
+ PHOENIX_UNARY_EVAL(post_increment_eval, result_of_post_increment, x++)
+ PHOENIX_UNARY_EVAL(post_decrement_eval, result_of_post_decrement, x--)
+
+ PHOENIX_BINARY_EVAL(plus_assign_eval, result_of_plus_assign, x += y)
+ PHOENIX_BINARY_EVAL(minus_assign_eval, result_of_minus_assign, x -= y)
+ PHOENIX_BINARY_EVAL(multiplies_assign_eval, result_of_multiplies_assign, x *= y)
+ PHOENIX_BINARY_EVAL(divides_assign_eval, result_of_divides_assign, x /= y)
+ PHOENIX_BINARY_EVAL(modulus_assign_eval, result_of_modulus_assign, x %= y)
+
+ PHOENIX_BINARY_EVAL(plus_eval, result_of_plus, x + y)
+ PHOENIX_BINARY_EVAL(minus_eval, result_of_minus, x - y)
+ PHOENIX_BINARY_EVAL(multiplies_eval, result_of_multiplies, x * y)
+ PHOENIX_BINARY_EVAL(divides_eval, result_of_divides, x / y)
+ PHOENIX_BINARY_EVAL(modulus_eval, result_of_modulus, x % y)
+
+ PHOENIX_UNARY_COMPOSE(negate_eval, -)
+ PHOENIX_UNARY_COMPOSE(posit_eval, +)
+ PHOENIX_UNARY_COMPOSE(pre_increment_eval, ++)
+ PHOENIX_UNARY_COMPOSE(pre_decrement_eval, --)
+
+ template <typename T0>
+ inline actor<typename as_composite<post_increment_eval, actor<T0> >::type>
+ operator++(actor<T0> const& a0, int) // special case
+ {
+ return compose<post_increment_eval>(a0);
+ }
+
+ template <typename T0>
+ inline actor<typename as_composite<post_decrement_eval, actor<T0> >::type>
+ operator--(actor<T0> const& a0, int) // special case
+ {
+ return compose<post_decrement_eval>(a0);
+ }
+
+ PHOENIX_BINARY_COMPOSE(plus_assign_eval, +=)
+ PHOENIX_BINARY_COMPOSE(minus_assign_eval, -=)
+ PHOENIX_BINARY_COMPOSE(multiplies_assign_eval, *=)
+ PHOENIX_BINARY_COMPOSE(divides_assign_eval, /=)
+ PHOENIX_BINARY_COMPOSE(modulus_assign_eval, %=)
+
+ PHOENIX_BINARY_COMPOSE(plus_eval, +)
+ PHOENIX_BINARY_COMPOSE(minus_eval, -)
+ PHOENIX_BINARY_COMPOSE(multiplies_eval, *)
+ PHOENIX_BINARY_COMPOSE(divides_eval, /)
+ PHOENIX_BINARY_COMPOSE(modulus_eval, %)
+
+#undef x
+#undef y
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/bitwise.hpp b/boost/spirit/home/phoenix/operator/bitwise.hpp
new file mode 100644
index 0000000000..0450db46e9
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/bitwise.hpp
@@ -0,0 +1,91 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_BITWISE_HPP
+#define PHOENIX_OPERATOR_BITWISE_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
+
+#ifdef BOOST_MSVC
+# pragma warning(push)
+# pragma warning(disable : 4800)
+#endif
+
+namespace boost { namespace phoenix
+{
+ struct invert_eval;
+
+ struct and_assign_eval;
+ struct or_assign_eval;
+ struct xor_assign_eval;
+ struct shift_left_assign_eval;
+ struct shift_right_assign_eval;
+
+ struct and_eval;
+ struct or_eval;
+ struct xor_eval;
+ struct shift_left_eval;
+ struct shift_right_eval;
+
+ BOOST_UNARY_RESULT_OF(~x, result_of_invert)
+
+ BOOST_BINARY_RESULT_OF(x &= y, result_of_and_assign)
+ BOOST_BINARY_RESULT_OF(x |= y, result_of_or_assign)
+ BOOST_BINARY_RESULT_OF(x ^= y, result_of_xor_assign)
+ BOOST_BINARY_RESULT_OF(x <<= y, result_of_shift_left_assign)
+ BOOST_BINARY_RESULT_OF(x >>= y, result_of_shift_right_assign)
+
+ BOOST_BINARY_RESULT_OF(x & y, result_of_and)
+ BOOST_BINARY_RESULT_OF(x | y, result_of_or)
+ BOOST_BINARY_RESULT_OF(x ^ y, result_of_xor)
+ BOOST_BINARY_RESULT_OF(x << y, result_of_shift_left)
+ BOOST_BINARY_RESULT_OF(x >> y, result_of_shift_right)
+
+#define x a0.eval(env)
+#define y a1.eval(env)
+
+ PHOENIX_UNARY_EVAL(invert_eval, result_of_invert, ~x)
+ PHOENIX_UNARY_COMPOSE(invert_eval, ~)
+
+ PHOENIX_BINARY_EVAL(and_assign_eval, result_of_and_assign, x &= y)
+ PHOENIX_BINARY_EVAL(or_assign_eval, result_of_or_assign, x |= y)
+ PHOENIX_BINARY_EVAL(xor_assign_eval, result_of_xor_assign, x ^= y)
+ PHOENIX_BINARY_EVAL(shift_left_assign_eval, result_of_shift_left_assign, x <<= y)
+ PHOENIX_BINARY_EVAL(shift_right_assign_eval, result_of_shift_right_assign, x >>= y)
+
+ PHOENIX_BINARY_EVAL(and_eval, result_of_and, x & y)
+ PHOENIX_BINARY_EVAL(or_eval, result_of_or, x | y)
+ PHOENIX_BINARY_EVAL(xor_eval, result_of_xor, x ^ y)
+ PHOENIX_BINARY_EVAL(shift_left_eval, result_of_shift_left, x << y)
+ PHOENIX_BINARY_EVAL(shift_right_eval, result_of_shift_right, x >> y)
+
+ PHOENIX_BINARY_COMPOSE(and_assign_eval, &=)
+ PHOENIX_BINARY_COMPOSE(or_assign_eval, |=)
+ PHOENIX_BINARY_COMPOSE(xor_assign_eval, ^=)
+ PHOENIX_BINARY_COMPOSE(shift_left_assign_eval, <<=)
+ PHOENIX_BINARY_COMPOSE(shift_right_assign_eval, >>=)
+
+ PHOENIX_BINARY_COMPOSE(and_eval, &)
+ PHOENIX_BINARY_COMPOSE(or_eval, |)
+ PHOENIX_BINARY_COMPOSE(xor_eval, ^)
+ PHOENIX_BINARY_COMPOSE(shift_left_eval, <<)
+ PHOENIX_BINARY_COMPOSE(shift_right_eval, >>)
+
+#undef x
+#undef y
+}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/comparison.hpp b/boost/spirit/home/phoenix/operator/comparison.hpp
new file mode 100644
index 0000000000..fe9298c834
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/comparison.hpp
@@ -0,0 +1,55 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_COMPARISON_HPP
+#define PHOENIX_OPERATOR_COMPARISON_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ struct equal_to_eval;
+ struct not_equal_to_eval;
+ struct less_eval;
+ struct less_equal_eval;
+ struct greater_eval;
+ struct greater_equal_eval;
+
+ BOOST_BINARY_RESULT_OF(x == y, result_of_equal_to)
+ BOOST_BINARY_RESULT_OF(x != y, result_of_not_equal_to)
+ BOOST_BINARY_RESULT_OF(x < y, result_of_less)
+ BOOST_BINARY_RESULT_OF(x <= y, result_of_less_equal)
+ BOOST_BINARY_RESULT_OF(x > y, result_of_greater)
+ BOOST_BINARY_RESULT_OF(x >= y, result_of_greater_equal)
+
+#define x a0.eval(env)
+#define y a1.eval(env)
+
+ PHOENIX_BINARY_EVAL(equal_to_eval, result_of_equal_to, x == y)
+ PHOENIX_BINARY_EVAL(not_equal_to_eval, result_of_not_equal_to, x != y)
+ PHOENIX_BINARY_EVAL(less_eval, result_of_less, x < y)
+ PHOENIX_BINARY_EVAL(less_equal_eval, result_of_less_equal, x <= y)
+ PHOENIX_BINARY_EVAL(greater_eval, result_of_greater, x > y)
+ PHOENIX_BINARY_EVAL(greater_equal_eval, result_of_greater_equal, x >= y)
+
+ PHOENIX_BINARY_COMPOSE(equal_to_eval, ==)
+ PHOENIX_BINARY_COMPOSE(not_equal_to_eval, !=)
+ PHOENIX_BINARY_COMPOSE(less_eval, <)
+ PHOENIX_BINARY_COMPOSE(less_equal_eval, <=)
+ PHOENIX_BINARY_COMPOSE(greater_eval, >)
+ PHOENIX_BINARY_COMPOSE(greater_equal_eval, >=)
+
+#undef x
+#undef y
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/detail/binary_compose.hpp b/boost/spirit/home/phoenix/operator/detail/binary_compose.hpp
new file mode 100644
index 0000000000..49335fda78
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/detail/binary_compose.hpp
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_DETAIL_BINARY_COMPOSE_HPP
+#define PHOENIX_OPERATOR_DETAIL_BINARY_COMPOSE_HPP
+
+#define PHOENIX_BINARY_COMPOSE(eval_name, op) \
+ template <typename T0, typename T1> \
+ inline actor<typename as_composite<eval_name, actor<T0>, actor<T1> >::type> \
+ operator op (actor<T0> const& a0, actor<T1> const& a1) \
+ { \
+ return compose<eval_name>(a0, a1); \
+ } \
+ \
+ template <typename T0, typename T1> \
+ inline actor<typename as_composite<eval_name, actor<T0>, T1>::type> \
+ operator op (actor<T0> const& a0, T1 const& a1) \
+ { \
+ return compose<eval_name>(a0, a1); \
+ } \
+ \
+ template <typename T0, typename T1> \
+ inline actor<typename as_composite<eval_name, T0, actor<T1> >::type> \
+ operator op (T0 const& a0, actor<T1> const& a1) \
+ { \
+ return compose<eval_name>(a0, a1); \
+ }
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/detail/binary_eval.hpp b/boost/spirit/home/phoenix/operator/detail/binary_eval.hpp
new file mode 100644
index 0000000000..1789882485
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/detail/binary_eval.hpp
@@ -0,0 +1,44 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_DETAIL_BINARY_EVAL_HPP
+#define PHOENIX_OPERATOR_DETAIL_BINARY_EVAL_HPP
+
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+#define PHOENIX_BINARY_EVAL(eval_name, op_result, expr) \
+ struct eval_name \
+ { \
+ template <typename Env, typename A0, typename A1> \
+ struct result \
+ { \
+ typedef typename A0::template result<Env>::type x_type; \
+ typedef typename A1::template result<Env>::type y_type; \
+ \
+ typedef typename \
+ mpl::eval_if< \
+ mpl::or_<is_actor<x_type>, is_actor<y_type> > \
+ , re_curry<eval_name, x_type, y_type> \
+ , op_result<x_type, y_type> \
+ >::type \
+ type; \
+ }; \
+ \
+ template <typename RT, typename Env, typename A0, typename A1> \
+ static RT \
+ eval(Env const& env, A0& a0, A1& a1) \
+ { \
+ return expr; \
+ } \
+ };
+
+#undef x
+#undef y
+#endif
diff --git a/boost/spirit/home/phoenix/operator/detail/io.hpp b/boost/spirit/home/phoenix/operator/detail/io.hpp
new file mode 100644
index 0000000000..d82a153c32
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/detail/io.hpp
@@ -0,0 +1,78 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_DETAIL_IO_HPP
+#define PHOENIX_OPERATOR_DETAIL_IO_HPP
+
+#include <boost/spirit/home/phoenix/operator/bitwise.hpp>
+#include <boost/spirit/home/phoenix/core/reference.hpp>
+#include <boost/utility/addressof.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <iostream>
+
+namespace boost { namespace phoenix { namespace detail
+{
+ typedef char(&no)[1];
+ typedef char(&yes)[2];
+
+ template <typename CharType, typename CharTrait>
+ yes ostream_test(std::basic_ostream<CharType, CharTrait>*);
+ no ostream_test(...);
+
+ template <typename CharType, typename CharTrait>
+ yes istream_test(std::basic_istream<CharType, CharTrait>*);
+ no istream_test(...);
+
+ template <typename T>
+ struct is_ostream
+ {
+ static T x;
+ BOOST_STATIC_CONSTANT(bool,
+ value = sizeof(detail::ostream_test(boost::addressof(x))) == sizeof(yes));
+ };
+
+ template <typename T>
+ struct is_istream
+ {
+ static T x;
+ BOOST_STATIC_CONSTANT(bool,
+ value = sizeof(detail::istream_test(boost::addressof(x))) == sizeof(yes));
+ };
+
+ template <typename T0, typename T1>
+ struct enable_if_ostream :
+ enable_if<
+ detail::is_ostream<T0>
+ , actor<
+ typename as_composite<
+ shift_left_eval
+ , actor<reference<T0> >
+ , actor<T1>
+ >::type
+ >
+ >
+ {};
+
+ template <typename T0, typename T1>
+ struct enable_if_istream :
+ enable_if<
+ detail::is_istream<T0>
+ , actor<
+ typename as_composite<
+ shift_right_eval
+ , actor<reference<T0> >
+ , actor<T1>
+ >::type
+ >
+ >
+ {};
+
+ typedef std::ios_base& (*iomanip_type)(std::ios_base&);
+ typedef std::istream& (*imanip_type)(std::istream&);
+ typedef std::ostream& (*omanip_type)(std::ostream&);
+}}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp b/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp
new file mode 100644
index 0000000000..cb77613aea
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp
@@ -0,0 +1,76 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_EVAL_HPP
+#define PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_EVAL_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+
+#include <boost/mpl/void.hpp>
+
+#include <boost/type_traits/function_traits.hpp>
+
+#include <boost/get_pointer.hpp>
+
+#include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp>
+
+namespace boost { namespace phoenix {
+
+ struct mem_fun_ptr_eval
+ {
+ template<typename Env, typename PtrActor, typename MemFunPtrActor,
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PP_SUB(PHOENIX_MEMBER_LIMIT, 2), typename Arg, mpl::void_)>
+
+ struct result
+ : detail::mem_fun_ptr_return<typename eval_result<MemFunPtrActor, Env>::type> { };
+
+ template<typename Rt, typename Env, typename PtrActor, typename MemFunPtrActor>
+ static typename result<Env,PtrActor,MemFunPtrActor>::type
+ eval(const Env& env, PtrActor& ptrActor, MemFunPtrActor& memFunPtrActor)
+ {
+ return (get_pointer(ptrActor.eval(env))->*memFunPtrActor.eval(env))();
+ }
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_MEMBER_LIMIT)), "boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp"))
+
+#include BOOST_PP_ITERATE()
+
+ };
+}}
+
+#endif
+
+#else
+
+#define PHOENIX_ITERATION BOOST_PP_ITERATION()
+
+#define PHOENIX_EVAL_ARG(z,n,_) arg ## n.eval(env)
+
+ template<typename Rt, typename Env, typename PtrActor, typename MemFunPtrActor,
+ BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename Arg)>
+ static typename result<Env,PtrActor,MemFunPtrActor, BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION,Arg)>::type
+ eval(const Env& env, PtrActor& ptrActor, MemFunPtrActor& memFunPtrActor,
+ BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, Arg, & arg))
+ {
+ return (get_pointer(ptrActor.eval(env))->*memFunPtrActor.eval(env))(
+ BOOST_PP_ENUM(PHOENIX_ITERATION,PHOENIX_EVAL_ARG,_));
+ }
+
+#undef PHOENIX_EVAL_ARG
+#undef PHOENIX_ITERATION
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp b/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp
new file mode 100644
index 0000000000..31d5413035
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp
@@ -0,0 +1,69 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_GEN_HPP
+#define PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_GEN_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/core/as_actor.hpp>
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+
+#include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp>
+
+namespace boost { namespace phoenix {
+ template<typename Actor, typename MemFunPtr>
+ struct mem_fun_ptr_gen
+ {
+ mem_fun_ptr_gen(
+ const Actor& actor, MemFunPtr memFunPtr)
+ : mActor(actor), mMemFunPtr(memFunPtr) { }
+
+ actor<typename as_composite<mem_fun_ptr_eval, Actor, typename as_actor<MemFunPtr>::type>::type>
+ operator()() const
+ {
+ return compose<mem_fun_ptr_eval>(
+ mActor, as_actor<MemFunPtr>::convert(mMemFunPtr));
+ }
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_MEMBER_LIMIT)), "boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp"))
+
+#include BOOST_PP_ITERATE()
+
+ Actor mActor;
+ MemFunPtr mMemFunPtr;
+ };
+}}
+
+#endif
+#else
+
+#define PHOENIX_ITERATION BOOST_PP_ITERATION()
+
+ template<BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename Arg)>
+ actor<typename as_composite<
+ mem_fun_ptr_eval, Actor, typename as_actor<MemFunPtr>::type,
+ BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, Arg)>::type>
+ operator()(
+ BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, const Arg, &arg)) const
+ {
+ return compose<mem_fun_ptr_eval>(
+ mActor, as_actor<MemFunPtr>::convert(mMemFunPtr),
+ BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, arg));
+ }
+
+#undef PHOENIX_ITERATION
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp b/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp
new file mode 100644
index 0000000000..102f17f021
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp
@@ -0,0 +1,65 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_RETURN_HPP
+#define PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_RETURN_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+
+namespace boost { namespace phoenix {
+namespace detail
+{
+ template<typename MemFunPtr>
+ struct mem_fun_ptr_return;
+
+ template<typename Ret, typename Class>
+ struct mem_fun_ptr_return<Ret (Class::*)()>
+ {
+ typedef Ret type;
+ };
+
+ template<typename Ret, typename Class>
+ struct mem_fun_ptr_return<Ret (Class::*)() const>
+ {
+ typedef Ret type;
+ };
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, PHOENIX_MEMBER_LIMIT, "boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp"))
+
+#include BOOST_PP_ITERATE()
+
+}
+}}
+
+#endif
+
+#else
+
+#define PHOENIX_ITERATION BOOST_PP_ITERATION()
+
+ template<typename Ret, typename Class,
+ BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename T)>
+ struct mem_fun_ptr_return<Ret (Class::*)(BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, T))>
+ {
+ typedef Ret type;
+ };
+
+ template<typename Ret, typename Class,
+ BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename T)>
+ struct mem_fun_ptr_return<Ret (Class::*)(BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, T)) const>
+ {
+ typedef Ret type;
+ };
+
+#undef PHOENIX_ITERATION
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/detail/unary_compose.hpp b/boost/spirit/home/phoenix/operator/detail/unary_compose.hpp
new file mode 100644
index 0000000000..fd9a8c70fb
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/detail/unary_compose.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_DETAIL_UNARY_COMPOSE_HPP
+#define PHOENIX_OPERATOR_DETAIL_UNARY_COMPOSE_HPP
+
+#define PHOENIX_UNARY_COMPOSE(eval_name, op) \
+ template <typename T0> \
+ inline actor<typename as_composite<eval_name, actor<T0> >::type> \
+ operator op (actor<T0> const& a0) \
+ { \
+ return compose<eval_name>(a0); \
+ }
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/detail/unary_eval.hpp b/boost/spirit/home/phoenix/operator/detail/unary_eval.hpp
new file mode 100644
index 0000000000..501f6df717
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/detail/unary_eval.hpp
@@ -0,0 +1,40 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_DETAIL_UNARY_EVAL_HPP
+#define PHOENIX_OPERATOR_DETAIL_UNARY_EVAL_HPP
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+#define PHOENIX_UNARY_EVAL(eval_name, op_result, expr) \
+ struct eval_name \
+ { \
+ template <typename Env, typename A0> \
+ struct result \
+ { \
+ typedef typename A0::template result<Env>::type x_type; \
+ \
+ typedef typename \
+ mpl::eval_if< \
+ is_actor<x_type> \
+ , re_curry<eval_name, x_type> \
+ , op_result<x_type> \
+ >::type \
+ type; \
+ }; \
+ \
+ template <typename RT, typename Env, typename A0> \
+ static RT \
+ eval(Env const& env, A0& a0) \
+ { \
+ return expr; \
+ } \
+ };
+
+#endif
+
+
diff --git a/boost/spirit/home/phoenix/operator/if_else.hpp b/boost/spirit/home/phoenix/operator/if_else.hpp
new file mode 100644
index 0000000000..8492e90861
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/if_else.hpp
@@ -0,0 +1,78 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_IF_ELSE_HPP
+#define PHOENIX_OPERATOR_IF_ELSE_HPP
+
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
+
+namespace boost { namespace phoenix
+{
+ BOOST_BINARY_RESULT_OF(true ? x : y, result_of_if_else)
+
+ struct if_else_op_eval
+ {
+ template <
+ typename Env
+ , typename Cond
+ , typename Then
+ , typename Else
+ >
+ struct result
+ {
+ typedef typename Then::template result<Env>::type then_type;
+ typedef typename Else::template result<Env>::type else_type;
+
+ typedef typename
+ result_of_if_else<then_type, else_type>::type
+ ite_result;
+
+ // Note: c ? x : y can return an lvalue! Allow if_else_op_eval
+ // to return an lvalue IFF then_type and else_type are both lvalues
+ // with the same type.
+
+ typedef typename
+ mpl::if_<
+ mpl::and_<
+ is_same<then_type, else_type>
+ , is_reference<then_type>
+ >
+ , ite_result
+ , typename remove_reference<ite_result>::type
+ >::type
+ type;
+ };
+
+ template <
+ typename RT
+ , typename Env
+ , typename Cond
+ , typename Then
+ , typename Else
+ >
+ static RT
+ eval(Env const& env, Cond& cond, Then& then, Else& else_)
+ {
+ return cond.eval(env) ? then.eval(env) : else_.eval(env);
+ }
+ };
+
+ template <typename Cond, typename Then, typename Else>
+ inline actor<typename as_composite<if_else_op_eval, Cond, Then, Else>::type>
+ if_else(Cond const& cond, Then const& then, Else const& else_)
+ {
+ return compose<if_else_op_eval>(cond, then, else_);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/io.hpp b/boost/spirit/home/phoenix/operator/io.hpp
new file mode 100644
index 0000000000..360a46fbcc
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/io.hpp
@@ -0,0 +1,86 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_IO_HPP
+#define PHOENIX_OPERATOR_IO_HPP
+
+#include <boost/spirit/home/phoenix/operator/detail/io.hpp>
+
+namespace boost { namespace phoenix
+{
+///////////////////////////////////////////////////////////////////////////////
+//
+// overloads for std::basic_ostream and std::basic_istream
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <typename T0, typename T1>
+ inline typename detail::enable_if_ostream<T0, T1>::type
+ operator<<(T0& a0, actor<T1> const& a1)
+ {
+ return compose<shift_left_eval>(phoenix::ref(a0), a1);
+ }
+
+ template <typename T0, typename T1>
+ inline typename detail::enable_if_istream<T0, T1>::type
+ operator>>(T0& a0, actor<T1> const& a1)
+ {
+ return compose<shift_right_eval>(phoenix::ref(a0), a1);
+ }
+
+ // resolve ambiguities with fusion.
+ template <typename T1>
+ inline typename detail::enable_if_ostream<std::ostream, T1>::type
+ operator<<(std::ostream& a0, actor<T1> const& a1)
+ {
+ return compose<shift_left_eval>(phoenix::ref(a0), a1);
+ }
+
+ template <typename T1>
+ inline typename detail::enable_if_istream<std::istream, T1>::type
+ operator>>(std::istream& a0, actor<T1> const& a1)
+ {
+ return compose<shift_right_eval>(phoenix::ref(a0), a1);
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// overloads for I/O manipulators.
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <typename T0>
+ inline actor<typename as_composite<
+ shift_left_eval, actor<T0>, detail::omanip_type>::type>
+ operator<<(actor<T0> const& a0, detail::omanip_type a1)
+ {
+ return compose<shift_left_eval>(a0, a1);
+ }
+
+ template <typename T0>
+ inline actor<typename as_composite<
+ shift_left_eval, actor<T0>, detail::iomanip_type>::type>
+ operator<<(actor<T0> const& a0, detail::iomanip_type a1)
+ {
+ return compose<shift_left_eval>(a0, a1);
+ }
+
+ template <typename T0>
+ inline actor<typename as_composite<
+ shift_right_eval, actor<T0>, detail::imanip_type>::type>
+ operator>>(actor<T0> const& a0, detail::imanip_type a1)
+ {
+ return compose<shift_right_eval>(a0, a1);
+ }
+
+ template <typename T0>
+ inline actor<typename as_composite<
+ shift_right_eval, actor<T0>, detail::iomanip_type>::type>
+ operator>>(actor<T0> const& a0, detail::iomanip_type a1)
+ {
+ return compose<shift_right_eval>(a0, a1);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/logical.hpp b/boost/spirit/home/phoenix/operator/logical.hpp
new file mode 100644
index 0000000000..84619aa460
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/logical.hpp
@@ -0,0 +1,43 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_LOGICAL_HPP
+#define PHOENIX_OPERATOR_LOGICAL_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ struct logical_not_eval;
+ struct logical_and_eval;
+ struct logical_or_eval;
+
+ BOOST_UNARY_RESULT_OF(!x, result_of_logical_not)
+ BOOST_BINARY_RESULT_OF(x && y, result_of_logical_and)
+ BOOST_BINARY_RESULT_OF(x || y, result_of_logical_or)
+
+#define x a0.eval(env)
+#define y a1.eval(env)
+
+ PHOENIX_UNARY_EVAL(logical_not_eval, result_of_logical_not, !x)
+ PHOENIX_BINARY_EVAL(logical_and_eval, result_of_logical_and, x && y)
+ PHOENIX_BINARY_EVAL(logical_or_eval, result_of_logical_or, x || y)
+
+ PHOENIX_UNARY_COMPOSE(logical_not_eval, !)
+ PHOENIX_BINARY_COMPOSE(logical_and_eval, &&)
+ PHOENIX_BINARY_COMPOSE(logical_or_eval, ||)
+
+#undef x
+#undef y
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/member.hpp b/boost/spirit/home/phoenix/operator/member.hpp
new file mode 100644
index 0000000000..27f3e8d1a8
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/member.hpp
@@ -0,0 +1,145 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_MEMBER_HPP
+#define PHOENIX_OPERATOR_MEMBER_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/is_member_pointer.hpp>
+#include <boost/type_traits/is_member_function_pointer.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/get_pointer.hpp>
+
+#include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp>
+
+#include <memory>
+
+namespace boost {
+ template<typename T> class shared_ptr;
+ template<typename T> class scoped_ptr;
+
+namespace phoenix {
+ namespace detail
+ {
+ template<typename T>
+ struct member_type;
+
+ template<typename Class, typename MemberType>
+ struct member_type<MemberType (Class::*)>
+ {
+ typedef MemberType type;
+ };
+ }
+
+ namespace meta
+ {
+ template<typename T>
+ struct pointed_type;
+
+ template<typename T>
+ struct pointed_type<T*>
+ {
+ typedef T type;
+ };
+
+ template<typename T>
+ struct pointed_type<shared_ptr<T> >
+ {
+ typedef T type;
+ };
+
+ template<typename T>
+ struct pointed_type<scoped_ptr<T> >
+ {
+ typedef T type;
+ };
+
+ template<typename T>
+ struct pointed_type<std::auto_ptr<T> >
+ {
+ typedef T type;
+ };
+ }
+
+ struct member_object_eval
+ {
+ template<typename Env, typename PtrActor, typename MemPtrActor>
+ struct result
+ {
+ typedef typename detail::member_type<
+ typename eval_result<MemPtrActor, Env>::type>::type member_type;
+
+ typedef typename meta::pointed_type<
+ typename remove_reference<
+ typename eval_result<PtrActor, Env>::type>::type>::type object_type;
+
+ typedef typename add_reference<
+ typename mpl::eval_if<
+ is_const<object_type>,
+ add_const<member_type>,
+ mpl::identity<member_type> >::type>::type type;
+ };
+
+ template<typename Rt, typename Env, typename PtrActor, typename MemPtrActor>
+ static typename result<Env,PtrActor,MemPtrActor>::type
+ eval(const Env& env, PtrActor& ptrActor, MemPtrActor& memPtrActor)
+ {
+ return get_pointer(ptrActor.eval(env))->*memPtrActor.eval(env);
+ }
+ };
+
+ namespace member_object
+ {
+ template<typename T0, typename MemObjPtr>
+ typename enable_if<
+ mpl::and_<is_member_pointer<MemObjPtr>, mpl::not_<is_member_function_pointer<MemObjPtr> > >,
+ actor<typename as_composite<
+ member_object_eval, actor<T0>,
+ typename as_actor<MemObjPtr>::type>::type> >::type
+ operator->*(
+ const actor<T0>& ptrActor,
+ MemObjPtr memObjPtr)
+ {
+ return compose<member_object_eval>(
+ ptrActor,
+ as_actor<MemObjPtr>::convert(memObjPtr));
+ }
+ }
+
+ namespace member_function
+ {
+ template<typename T0, typename MemFunPtr>
+ typename enable_if<
+ is_member_function_pointer<MemFunPtr>,
+ mem_fun_ptr_gen<actor<T0>, MemFunPtr> >::type
+ operator->*(const actor<T0>& ptrActor, MemFunPtr memFunPtr)
+ {
+ return mem_fun_ptr_gen<actor<T0>, MemFunPtr>(
+ ptrActor, memFunPtr);
+ }
+ }
+
+ using member_object::operator->*;
+ using member_function::operator->*;
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/operator/self.hpp b/boost/spirit/home/phoenix/operator/self.hpp
new file mode 100644
index 0000000000..294adf6b81
--- /dev/null
+++ b/boost/spirit/home/phoenix/operator/self.hpp
@@ -0,0 +1,75 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_OPERATOR_SELF_HPP
+#define PHOENIX_OPERATOR_SELF_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
+#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ struct reference_eval;
+ struct dereference_eval;
+ struct assign_eval;
+ struct index_eval;
+
+ BOOST_UNARY_RESULT_OF(&x, result_of_reference)
+ BOOST_UNARY_RESULT_OF(*x, result_of_dereference)
+ BOOST_BINARY_RESULT_OF(x = y, result_of_assign)
+ BOOST_ASYMMETRIC_BINARY_RESULT_OF(x[y], result_of_index)
+
+ namespace detail
+ {
+ template <typename T0, typename T1>
+ struct make_assign_composite
+ {
+ typedef actor<typename as_composite<assign_eval, T0, T1>::type> type;
+ };
+
+ template <typename T0, typename T1>
+ struct make_index_composite
+ {
+ typedef actor<typename as_composite<index_eval, T0, T1>::type> type;
+ };
+ }
+
+ template <typename Base>
+ template <typename T1>
+ typename detail::make_assign_composite<actor<Base>, T1>::type
+ actor<Base>::operator=(T1 const& a1) const
+ {
+ return compose<assign_eval>(*this, a1);
+ }
+
+ template <typename Base>
+ template <typename T1>
+ typename detail::make_index_composite<actor<Base>, T1>::type
+ actor<Base>::operator[](T1 const& a1) const
+ {
+ return compose<index_eval>(*this, a1);
+ }
+
+#define x a0.eval(env)
+#define y a1.eval(env)
+
+ PHOENIX_UNARY_EVAL(reference_eval, result_of_reference, &x)
+ PHOENIX_UNARY_EVAL(dereference_eval, result_of_dereference, *x)
+ PHOENIX_UNARY_COMPOSE(reference_eval, &)
+ PHOENIX_UNARY_COMPOSE(dereference_eval, *)
+
+ PHOENIX_BINARY_EVAL(assign_eval, result_of_assign, x = y)
+ PHOENIX_BINARY_EVAL(index_eval, result_of_index, x[y])
+}}
+
+#undef x
+#undef y
+#endif
diff --git a/boost/spirit/home/phoenix/scope.hpp b/boost/spirit/home/phoenix/scope.hpp
new file mode 100644
index 0000000000..c1b9ae3192
--- /dev/null
+++ b/boost/spirit/home/phoenix/scope.hpp
@@ -0,0 +1,16 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_SCOPE_HPP
+#define PHOENIX_SCOPE_HPP
+
+#include <boost/spirit/home/phoenix/version.hpp>
+#include <boost/spirit/home/phoenix/scope/scoped_environment.hpp>
+#include <boost/spirit/home/phoenix/scope/lambda.hpp>
+#include <boost/spirit/home/phoenix/scope/let.hpp>
+#include <boost/spirit/home/phoenix/scope/local_variable.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/scope/detail/local_gen.hpp b/boost/spirit/home/phoenix/scope/detail/local_gen.hpp
new file mode 100644
index 0000000000..6a74df6b14
--- /dev/null
+++ b/boost/spirit/home/phoenix/scope/detail/local_gen.hpp
@@ -0,0 +1,57 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+// Allow multiple inclusion. let.hpp and lambda.hpp will have the guards
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+
+#define PHOENIX_LOCAL_GEN_PARAM(z, n, data) \
+ actor<composite<assign_eval \
+ , fusion::vector<local_variable<K##n>, V##n> > > const& a##n
+
+#define PHOENIX_LOCAL_GEN_ACTOR(z, n, data) \
+ fusion::at_c<1>(a##n)
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, PHOENIX_LOCAL_LIMIT, \
+ "boost/spirit/home/phoenix/scope/detail/local_gen.hpp"))
+#include BOOST_PP_ITERATE()
+
+#undef PHOENIX_LOCAL_GEN_PARAM
+#undef PHOENIX_LOCAL_GEN_ACTOR
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <
+ BOOST_PP_ENUM_PARAMS(N, typename K)
+ , BOOST_PP_ENUM_PARAMS(N, typename V)
+ >
+ PHOENIX_LOCAL_GEN_NAME<
+ fusion::vector<BOOST_PP_ENUM_PARAMS(N, V)>
+ , detail::map_local_index_to_tuple<BOOST_PP_ENUM_PARAMS(N, K)>
+ >
+ operator()(
+ BOOST_PP_ENUM(N, PHOENIX_LOCAL_GEN_PARAM, _)
+ ) const
+ {
+ return fusion::vector<BOOST_PP_ENUM_PARAMS(N, V)>(
+ BOOST_PP_ENUM(N, PHOENIX_LOCAL_GEN_ACTOR, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/scope/detail/local_variable.hpp b/boost/spirit/home/phoenix/scope/detail/local_variable.hpp
new file mode 100644
index 0000000000..1ad7932d86
--- /dev/null
+++ b/boost/spirit/home/phoenix/scope/detail/local_variable.hpp
@@ -0,0 +1,198 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2004 Daniel Wallin
+
+ Distributed under the 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 PHOENIX_SCOPE_DETAIL_LOCAL_VARIABLE_HPP
+#define PHOENIX_SCOPE_DETAIL_LOCAL_VARIABLE_HPP
+
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/value_at.hpp>
+#include <boost/preprocessor/enum.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/is_reference.hpp>
+
+#define PHOENIX_MAP_LOCAL_TEMPLATE_PARAM(z, n, data) \
+ typename T##n = unused<n>
+
+#define PHOENIX_MAP_LOCAL_DISPATCH(z, n, data) \
+ typedef char(&result##n)[n+2]; \
+ static result##n get(T##n*);
+
+namespace boost { namespace phoenix
+{
+ template <typename Env, typename OuterEnv, typename Locals, typename Map>
+ struct scoped_environment;
+
+ namespace detail
+ {
+ template <typename Env>
+ struct initialize_local
+ {
+ template <class F>
+ struct result;
+
+ template <class F, class Actor>
+ struct result<F(Actor)>
+ {
+ typedef typename remove_reference<Actor>::type actor_type;
+ typedef typename actor_type::template result<Env>::type type;
+ };
+
+ initialize_local(Env const& env)
+ : env(env) {}
+
+ template <typename Actor>
+ typename result<initialize_local(Actor)>::type
+ operator()(Actor const& actor) const
+ {
+ return actor.eval(env);
+ }
+
+ Env const& env;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ initialize_local& operator= (initialize_local const&);
+ };
+
+ template <typename T>
+ struct is_scoped_environment : mpl::false_ {};
+
+ template <typename Env, typename OuterEnv, typename Locals, typename Map>
+ struct is_scoped_environment<scoped_environment<Env, OuterEnv, Locals, Map> >
+ : mpl::true_ {};
+
+ template <int N>
+ struct unused;
+
+ template <BOOST_PP_ENUM(
+ PHOENIX_LOCAL_LIMIT, PHOENIX_MAP_LOCAL_TEMPLATE_PARAM, _)>
+ struct map_local_index_to_tuple
+ {
+ typedef char(&not_found)[1];
+ static not_found get(...);
+
+ BOOST_PP_REPEAT(PHOENIX_LOCAL_LIMIT, PHOENIX_MAP_LOCAL_DISPATCH, _)
+ };
+
+ template<typename T>
+ T* generate_pointer();
+
+ template <typename Map, typename Tag>
+ struct get_index
+ {
+ BOOST_STATIC_CONSTANT(int,
+ value = (
+ static_cast<int>((sizeof(Map::get(generate_pointer<Tag>()))) / sizeof(char)) - 2
+ ));
+
+ // if value == -1, Tag is not found
+ typedef mpl::int_<value> type;
+ };
+
+ template <typename Local, typename Env>
+ struct apply_local;
+
+ template <typename Local, typename Env>
+ struct outer_local
+ {
+ typedef typename
+ apply_local<Local, typename Env::outer_env_type>::type
+ type;
+ };
+
+ template <typename Locals, typename Index>
+ struct get_local_or_void
+ {
+ typedef typename
+ mpl::eval_if<
+ mpl::less<Index, mpl::size<Locals> >
+ , fusion::result_of::at<Locals, Index>
+ , mpl::identity<fusion::void_>
+ >::type
+ type;
+ };
+
+ template <typename Local, typename Env, typename Index>
+ struct get_local_from_index
+ {
+ typedef typename
+ mpl::eval_if<
+ mpl::equal_to<Index, mpl::int_<-1> >
+ , outer_local<Local, Env>
+ , get_local_or_void<typename Env::locals_type, Index>
+ >::type
+ type;
+ };
+
+ template <typename Local, typename Env>
+ struct get_local
+ {
+ typedef typename
+ get_index<
+ typename Env::map_type, typename Local::key_type>::type
+ index_type;
+
+ typedef typename
+ get_local_from_index<Local, Env, index_type>::type
+ type;
+ };
+
+ template <typename Local, typename Env>
+ struct apply_local
+ {
+ // $$$ TODO: static assert that Env is a scoped_environment $$$
+ typedef typename get_local<Local, Env>::type type;
+ };
+
+ template <typename Key>
+ struct eval_local
+ {
+ template <typename RT, typename Env, typename Index>
+ static RT
+ get(Env const& env, Index, mpl::false_)
+ {
+ return RT(fusion::at<Index>(env.locals));
+ }
+
+ template <typename RT, typename Env, typename Index>
+ static RT
+ get(Env const& env, Index index, mpl::true_)
+ {
+ typedef typename
+ get_index<typename Env::outer_env_type::map_type, Key>::type
+ index_type;
+
+ return get<RT>(
+ env.outer_env
+ , index_type()
+ , mpl::equal_to<index_type, mpl::int_<-1> >());
+ }
+
+ template <typename RT, typename Env, typename Index>
+ static RT
+ get(Env const& env, Index index)
+ {
+ return get<RT>(
+ env
+ , index
+ , mpl::equal_to<Index, mpl::int_<-1> >());
+ }
+ };
+ }
+}}
+
+#undef PHOENIX_MAP_LOCAL_TEMPLATE_PARAM
+#undef PHOENIX_MAP_LOCAL_DISPATCH
+#endif
diff --git a/boost/spirit/home/phoenix/scope/dynamic.hpp b/boost/spirit/home/phoenix/scope/dynamic.hpp
new file mode 100644
index 0000000000..c822bf7d07
--- /dev/null
+++ b/boost/spirit/home/phoenix/scope/dynamic.hpp
@@ -0,0 +1,193 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2004 Daniel Wallin
+
+ Distributed under the 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 PHOENIX_SCOPE_DYNAMIC_HPP
+#define PHOENIX_SCOPE_DYNAMIC_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/seq/for_each_i.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/inc.hpp>
+
+#include <boost/noncopyable.hpp>
+#include <boost/assert.hpp>
+
+#define PHOENIX_DYNAMIC_MEMBER(z, n, data) \
+ typedef actor<dynamic_member<n, self_type> > \
+ BOOST_PP_CAT(member, BOOST_PP_INC(n));
+
+namespace boost { namespace phoenix
+{
+ template <typename DynamicScope>
+ struct dynamic_frame : noncopyable
+ {
+ typedef typename DynamicScope::tuple_type tuple_type;
+
+ dynamic_frame(DynamicScope const& scope)
+ : tuple()
+ , save(scope.frame)
+ , scope(scope)
+ {
+ scope.frame = this;
+ }
+
+ template <typename Tuple>
+ dynamic_frame(DynamicScope const& scope, Tuple const& init)
+ : tuple(init)
+ , save(scope.frame)
+ , scope(scope)
+ {
+ scope.frame = this;
+ }
+
+ ~dynamic_frame()
+ {
+ scope.frame = save;
+ }
+
+ tuple_type& data() { return tuple; }
+ tuple_type const& data() const { return tuple; }
+
+ private:
+
+ tuple_type tuple;
+ dynamic_frame* save;
+ DynamicScope const& scope;
+ };
+
+ template <int N, typename DynamicScope>
+ struct dynamic_member
+ {
+ typedef mpl::false_ no_nullary;
+ typedef typename DynamicScope::tuple_type tuple_type;
+
+ dynamic_member(DynamicScope const& scope)
+ : scope(scope) {}
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ fusion::result_of::at_c<tuple_type, N>::type
+ type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& /*env*/) const
+ {
+ BOOST_ASSERT(scope.frame != 0);
+ return fusion::at_c<N>(scope.frame->data());
+ }
+
+ private:
+
+ DynamicScope const& scope;
+ };
+
+ template <BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(PHOENIX_DYNAMIC_LIMIT, typename T, void_)>
+ struct dynamic : noncopyable
+ {
+ typedef fusion::vector<BOOST_PP_ENUM_PARAMS(PHOENIX_DYNAMIC_LIMIT, T)> tuple_type;
+ typedef dynamic<BOOST_PP_ENUM_PARAMS(PHOENIX_DYNAMIC_LIMIT, T)> self_type;
+ typedef dynamic_frame<self_type> dynamic_frame_type;
+
+ dynamic()
+ : frame(0) {}
+
+ BOOST_PP_REPEAT(PHOENIX_DYNAMIC_LIMIT, PHOENIX_DYNAMIC_MEMBER, _)
+
+ private:
+
+ template <int N, typename DynamicScope>
+ friend struct dynamic_member;
+
+ template <typename DynamicScope>
+ friend struct dynamic_frame;
+
+ mutable dynamic_frame_type* frame;
+ };
+}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4355)
+#endif
+
+/*
+ PHOENIX_DYNAMIC macro(name, type-name sequence)
+ Example:
+
+ PHOENIX_DYNAMIC(
+ my_dynamic,
+ (int, num)
+ (std::string, message)
+ (double, real)
+ );
+
+ which expands to:
+
+ struct my_dynamic : ::boost::phoenix::dynamic<int, std::string, double>
+ {
+ my_dynamic() : num(*this), message(*this), real(*this) {}
+
+ member1 num;
+ member2 message;
+ member3 real;
+ };
+
+ PHOENIX_DYNAMIC takes the input (containing a binary sequence)
+ and converts that sequence to a unary sequence of
+ binary tuples and passes it on to PHOENIX_DYNAMIC_I.
+
+ Thanks to Paul Mensonides for the PP macro help
+*/
+
+#define PHOENIX_DYNAMIC(name, bseq) \
+ PHOENIX_DYNAMIC_I(name, BOOST_PP_CAT(PHOENIX_DYNAMIC_X bseq, 0)) \
+
+#define PHOENIX_DYNAMIC_X(x, y) ((x, y)) PHOENIX_DYNAMIC_Y
+#define PHOENIX_DYNAMIC_Y(x, y) ((x, y)) PHOENIX_DYNAMIC_X
+#define PHOENIX_DYNAMIC_X0
+#define PHOENIX_DYNAMIC_Y0
+
+// PHOENIX_DYNAMIC_I generates the overarching structure and uses
+// SEQ_FOR_EACH_I to generate the "linear" substructures.
+
+#define PHOENIX_DYNAMIC_I(name, seq) \
+ struct name : \
+ ::boost::phoenix::dynamic< \
+ BOOST_PP_SEQ_FOR_EACH_I(PHOENIX_DYNAMIC_A, ~, seq)> { \
+ name() : BOOST_PP_SEQ_FOR_EACH_I(PHOENIX_DYNAMIC_B, ~, seq) {} \
+ BOOST_PP_SEQ_FOR_EACH_I(PHOENIX_DYNAMIC_C, ~, seq) \
+ } \
+
+#define PHOENIX_DYNAMIC_A(r, _, i, xy) \
+ BOOST_PP_COMMA_IF(i) BOOST_PP_TUPLE_ELEM(2, 0, xy) \
+
+#define PHOENIX_DYNAMIC_B(r, _, i, xy) \
+ BOOST_PP_COMMA_IF(i) BOOST_PP_TUPLE_ELEM(2, 1, xy)(*this) \
+
+#define PHOENIX_DYNAMIC_C(r, _, i, xy) \
+ BOOST_PP_CAT(member, BOOST_PP_INC(i)) BOOST_PP_TUPLE_ELEM(2, 1, xy); \
+
+#undef PHOENIX_DYNAMIC_MEMBER
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/phoenix/scope/lambda.hpp b/boost/spirit/home/phoenix/scope/lambda.hpp
new file mode 100644
index 0000000000..c4a7ce8314
--- /dev/null
+++ b/boost/spirit/home/phoenix/scope/lambda.hpp
@@ -0,0 +1,176 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2004 Daniel Wallin
+
+ Distributed under the 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 PHOENIX_SCOPE_LAMBDA_HPP
+#define PHOENIX_SCOPE_LAMBDA_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/scope/scoped_environment.hpp>
+#include <boost/spirit/home/phoenix/scope/detail/local_variable.hpp>
+#include <boost/spirit/home/phoenix/detail/local_reference.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/fusion/include/transform.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename Base, typename OuterEnv, typename Locals, typename Map>
+ struct lambda_eval : Base
+ {
+ template <typename Env>
+ struct result
+ {
+ typedef typename Base::template
+ result<scoped_environment<Env, OuterEnv, Locals, Map> >::type
+ result_type;
+
+ typedef typename
+ detail::unwrap_local_reference<result_type>::type
+ type;
+ };
+
+ lambda_eval(
+ Base const& base
+ , OuterEnv const& outer_env
+ , Locals const& locals)
+ : Base(base)
+ , outer_env(outer_env)
+ , locals(locals) {}
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ typedef typename result<Env>::type RT;
+ return RT(Base::eval(
+ scoped_environment<Env, OuterEnv, Locals, Map>(
+ env, outer_env, locals)));
+ }
+
+ OuterEnv outer_env;
+ mutable Locals locals;
+ };
+
+ template <typename Base, typename Vars, typename Map>
+ struct lambda_actor
+ {
+ typedef typename
+ mpl::fold<
+ Vars
+ , mpl::false_
+ , detail::compute_no_nullary
+ >::type
+ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ fusion::result_of::as_vector<
+ typename fusion::result_of::transform<
+ Vars
+ , detail::initialize_local<Env>
+ >::type
+ >::type
+ locals_type;
+
+ typedef actor<lambda_eval<Base, Env, locals_type, Map> > type;
+ };
+
+ lambda_actor(Base const& f, Vars const& vars)
+ : f(f), vars(vars) {}
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ typedef typename result<Env>::type result_type;
+
+ return result_type(
+ f, env, fusion::as_vector(
+ fusion::transform(
+ vars
+ , detail::initialize_local<Env>(env)
+ )));
+ }
+
+ Base f;
+ Vars vars;
+ };
+
+ template <typename Vars, typename Map>
+ struct lambda_actor_gen
+ {
+ template <typename Base>
+ actor<lambda_actor<Base, Vars, Map> > const
+ operator[](actor<Base> const& f) const
+ {
+ return lambda_actor<Base, Vars, Map>(f, vars);
+ }
+
+ lambda_actor_gen(Vars const& vars)
+ : vars(vars) {}
+
+ Vars vars;
+ };
+
+ template <typename Key>
+ struct local_variable; // forward
+ struct assign_eval; // forward
+
+ struct lambda_gen
+ : lambda_actor_gen<
+ fusion::vector<>
+ , detail::map_local_index_to_tuple<> >
+ {
+ typedef
+ lambda_actor_gen<
+ fusion::vector<>
+ , detail::map_local_index_to_tuple<> >
+ base_type;
+
+ lambda_gen()
+ : base_type(fusion::vector<>())
+ {
+ }
+
+ template <typename K0, typename V0>
+ lambda_actor_gen<
+ fusion::vector<V0>
+ , detail::map_local_index_to_tuple<K0>
+ >
+ operator()(
+ actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
+ ) const
+ {
+ return fusion::vector<V0>(fusion::at_c<1>(a0));
+ }
+
+ template <typename K0, typename K1, typename V0, typename V1>
+ lambda_actor_gen<
+ fusion::vector<V0, V1>
+ , detail::map_local_index_to_tuple<K0, K1>
+ >
+ operator()(
+ actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
+ , actor<composite<assign_eval, fusion::vector<local_variable<K1>, V1> > > const& a1
+ ) const
+ {
+ return fusion::vector<V0, V1>(fusion::at_c<1>(a0), fusion::at_c<1>(a1));
+ }
+
+ // Bring in the rest...
+ #define PHOENIX_LOCAL_GEN_NAME lambda_actor_gen
+ #include <boost/spirit/home/phoenix/scope/detail/local_gen.hpp>
+ #undef PHOENIX_LOCAL_GEN_NAME
+ };
+
+ lambda_gen const lambda = lambda_gen();
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/scope/let.hpp b/boost/spirit/home/phoenix/scope/let.hpp
new file mode 100644
index 0000000000..40e951a49f
--- /dev/null
+++ b/boost/spirit/home/phoenix/scope/let.hpp
@@ -0,0 +1,145 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2004 Daniel Wallin
+
+ Distributed under the 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 PHOENIX_SCOPE_LET_HPP
+#define PHOENIX_SCOPE_LET_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/scope/scoped_environment.hpp>
+#include <boost/spirit/home/phoenix/scope/detail/local_variable.hpp>
+#include <boost/spirit/home/phoenix/detail/local_reference.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/fusion/include/transform.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename Base, typename Vars, typename Map>
+ struct let_actor : Base
+ {
+ typedef typename
+ mpl::fold<
+ Vars
+ , mpl::false_
+ , detail::compute_no_nullary
+ >::type
+ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ fusion::result_of::as_vector<
+ typename fusion::result_of::transform<
+ Vars
+ , detail::initialize_local<Env>
+ >::type
+ >::type
+ locals_type;
+
+ typedef typename Base::template
+ result<scoped_environment<Env, Env, locals_type, Map> >::type
+ result_type;
+
+ typedef typename
+ detail::unwrap_local_reference<result_type>::type
+ type;
+ };
+
+ let_actor(Base const& base, Vars const& vars)
+ : Base(base), vars(vars) {}
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ typedef typename
+ fusion::result_of::as_vector<
+ typename fusion::result_of::transform<
+ Vars
+ , detail::initialize_local<Env>
+ >::type
+ >::type
+ locals_type;
+
+ locals_type locals =
+ fusion::as_vector(
+ fusion::transform(
+ vars
+ , detail::initialize_local<Env>(env)));
+
+ typedef typename result<Env>::type RT;
+ return RT(Base::eval(
+ scoped_environment<Env, Env, locals_type, Map>(
+ env
+ , env
+ , locals)));
+ }
+
+ Vars vars;
+ };
+
+ template <typename Vars, typename Map>
+ struct let_actor_gen
+ {
+ template <typename Base>
+ actor<let_actor<Base, Vars, Map> > const
+ operator[](actor<Base> const& base) const
+ {
+ return let_actor<Base, Vars, Map>(base, vars);
+ }
+
+ let_actor_gen(Vars const& vars)
+ : vars(vars) {}
+
+ Vars vars;
+ };
+
+ template <typename Key>
+ struct local_variable; // forward
+ struct assign_eval; // forward
+
+ struct let_gen
+ {
+ template <typename K0, typename V0>
+ let_actor_gen<
+ fusion::vector<V0>
+ , detail::map_local_index_to_tuple<K0>
+ >
+ operator()(
+ actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
+ ) const
+ {
+ return fusion::vector<V0>(fusion::at_c<1>(a0));
+ }
+
+ template <typename K0, typename K1, typename V0, typename V1>
+ let_actor_gen<
+ fusion::vector<V0, V1>
+ , detail::map_local_index_to_tuple<K0, K1>
+ >
+ operator()(
+ actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
+ , actor<composite<assign_eval, fusion::vector<local_variable<K1>, V1> > > const& a1
+ ) const
+ {
+ return fusion::vector<V0, V1>(fusion::at_c<1>(a0), fusion::at_c<1>(a1));
+ }
+
+ // Bring in the rest...
+ #define PHOENIX_LOCAL_GEN_NAME let_actor_gen
+ #include <boost/spirit/home/phoenix/scope/detail/local_gen.hpp>
+ #undef PHOENIX_LOCAL_GEN_NAME
+ };
+
+ let_gen const let = let_gen();
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/scope/local_variable.hpp b/boost/spirit/home/phoenix/scope/local_variable.hpp
new file mode 100644
index 0000000000..5987ed441d
--- /dev/null
+++ b/boost/spirit/home/phoenix/scope/local_variable.hpp
@@ -0,0 +1,111 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2004 Daniel Wallin
+
+ Distributed under the 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 PHOENIX_SCOPE_LOCAL_VARIABLE_HPP
+#define PHOENIX_SCOPE_LOCAL_VARIABLE_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/spirit/home/phoenix/detail/local_reference.hpp>
+#include <boost/spirit/home/phoenix/scope/detail/local_variable.hpp>
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename Key>
+ struct local_variable
+ {
+ typedef Key key_type;
+
+ // This will prevent actor::operator()() from kicking in.
+ // Actually, we do not need all actor::operator()s for
+ // all arities, but this will suffice. The nullary
+ // actor::operator() is particularly troublesome because
+ // it is always eagerly evaluated by the compiler.
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result : detail::apply_local<local_variable<Key>, Env> {};
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ typedef typename result<Env>::type return_type;
+ typedef typename
+ detail::get_index<typename Env::map_type, Key>::type
+ index_type;
+ typedef detail::eval_local<Key> eval_local;
+
+ return eval_local::template get<return_type>(
+ env
+ , index_type());
+ }
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ local_variable& operator= (local_variable const&);
+ };
+
+ namespace local_names
+ {
+ actor<local_variable<struct _a_key> > const _a
+ = local_variable<struct _a_key>();
+ actor<local_variable<struct _b_key> > const _b
+ = local_variable<struct _b_key>();
+ actor<local_variable<struct _c_key> > const _c
+ = local_variable<struct _c_key>();
+ actor<local_variable<struct _d_key> > const _d
+ = local_variable<struct _d_key>();
+ actor<local_variable<struct _e_key> > const _e
+ = local_variable<struct _e_key>();
+ actor<local_variable<struct _f_key> > const _f
+ = local_variable<struct _f_key>();
+ actor<local_variable<struct _g_key> > const _g
+ = local_variable<struct _g_key>();
+ actor<local_variable<struct _h_key> > const _h
+ = local_variable<struct _h_key>();
+ actor<local_variable<struct _i_key> > const _i
+ = local_variable<struct _i_key>();
+ actor<local_variable<struct _j_key> > const _j
+ = local_variable<struct _j_key>();
+ actor<local_variable<struct _k_key> > const _k
+ = local_variable<struct _k_key>();
+ actor<local_variable<struct _l_key> > const _l
+ = local_variable<struct _l_key>();
+ actor<local_variable<struct _m_key> > const _m
+ = local_variable<struct _m_key>();
+ actor<local_variable<struct _n_key> > const _n
+ = local_variable<struct _n_key>();
+ actor<local_variable<struct _o_key> > const _o
+ = local_variable<struct _o_key>();
+ actor<local_variable<struct _p_key> > const _p
+ = local_variable<struct _p_key>();
+ actor<local_variable<struct _q_key> > const _q
+ = local_variable<struct _q_key>();
+ actor<local_variable<struct _r_key> > const _r
+ = local_variable<struct _r_key>();
+ actor<local_variable<struct _s_key> > const _s
+ = local_variable<struct _s_key>();
+ actor<local_variable<struct _t_key> > const _t
+ = local_variable<struct _t_key>();
+ actor<local_variable<struct _u_key> > const _u
+ = local_variable<struct _u_key>();
+ actor<local_variable<struct _v_key> > const _v
+ = local_variable<struct _v_key>();
+ actor<local_variable<struct _w_key> > const _w
+ = local_variable<struct _w_key>();
+ actor<local_variable<struct _x_key> > const _x
+ = local_variable<struct _x_key>();
+ actor<local_variable<struct _y_key> > const _y
+ = local_variable<struct _y_key>();
+ actor<local_variable<struct _z_key> > const _z
+ = local_variable<struct _z_key>();
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/scope/scoped_environment.hpp b/boost/spirit/home/phoenix/scope/scoped_environment.hpp
new file mode 100644
index 0000000000..b23f9eebc4
--- /dev/null
+++ b/boost/spirit/home/phoenix/scope/scoped_environment.hpp
@@ -0,0 +1,47 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2004 Daniel Wallin
+
+ Distributed under the 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 PHOENIX_SCOPE_SCOPED_ENVIRONMENT_HPP
+#define PHOENIX_SCOPE_SCOPED_ENVIRONMENT_HPP
+
+namespace boost { namespace phoenix
+{
+ template <typename Env, typename OuterEnv, typename Locals, typename Map>
+ struct scoped_environment
+ {
+ typedef Env env_type;
+ typedef OuterEnv outer_env_type;
+ typedef Locals locals_type;
+ typedef Map map_type;
+ typedef typename Env::args_type args_type;
+ typedef typename Env::tie_type tie_type;
+
+ scoped_environment(
+ Env const& env
+ , OuterEnv const& outer_env
+ , Locals& locals)
+ : env(env)
+ , outer_env(outer_env)
+ , locals(locals) {}
+
+ tie_type const&
+ args() const
+ {
+ return env.args();
+ }
+
+ Env const& env;
+ OuterEnv const& outer_env;
+ Locals& locals;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ scoped_environment& operator= (scoped_environment const&);
+ };
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement.hpp b/boost/spirit/home/phoenix/statement.hpp
new file mode 100644
index 0000000000..19e169ac71
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement.hpp
@@ -0,0 +1,20 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_HPP
+#define PHOENIX_STATEMENT_HPP
+
+#include <boost/spirit/home/phoenix/version.hpp>
+#include <boost/spirit/home/phoenix/statement/do_while.hpp>
+#include <boost/spirit/home/phoenix/statement/for.hpp>
+#include <boost/spirit/home/phoenix/statement/if.hpp>
+#include <boost/spirit/home/phoenix/statement/sequence.hpp>
+#include <boost/spirit/home/phoenix/statement/switch.hpp>
+#include <boost/spirit/home/phoenix/statement/while.hpp>
+#include <boost/spirit/home/phoenix/statement/throw.hpp>
+#include <boost/spirit/home/phoenix/statement/try_catch.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp b/boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp
new file mode 100644
index 0000000000..0609ad85a2
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp
@@ -0,0 +1,101 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_STATEMENT_DETAIL_CATCH_ALL_EVAL_HPP
+#define PHOENIX_STATEMENT_DETAIL_CATCH_ALL_EVAL_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/preprocessor/iteration/iterate.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_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/mpl/void.hpp>
+
+namespace boost { namespace phoenix {
+ class catch_all_eval
+ {
+ public:
+ template<typename Env, typename TryBody,
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(PHOENIX_CATCH_LIMIT, typename CatchBody, mpl::void_),
+ typename CatchAllBody = mpl::void_>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<typename Rt, typename Env, typename TryBody,
+ typename CatchAllBody>
+ static void eval(
+ const Env& env, TryBody& tryBody, CatchAllBody& catchAllBody)
+ {
+ try
+ {
+ tryBody.eval(env);
+ }
+ catch(...)
+ {
+ catchAllBody.eval(env);
+ }
+ }
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, PHOENIX_CATCH_LIMIT, "boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp"))
+
+#include BOOST_PP_ITERATE()
+
+ };
+}}
+
+#endif
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+
+#define PHOENIX_ITERATION BOOST_PP_ITERATION()
+
+ template<typename Rt, typename Env, typename TryBody,
+ BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename CatchBody),
+ typename CatchAllBody>
+ static void eval(
+ const Env& env, TryBody& tryBody,
+ BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, CatchBody, catchBody),
+ CatchAllBody& catchAllBody)
+ {
+ try
+ {
+ tryBody.eval(env);
+ }
+
+#define BOOST_PP_ITERATION_PARAMS_2 \
+ (3, (0, BOOST_PP_DEC(PHOENIX_ITERATION), "boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp"))
+
+#include BOOST_PP_ITERATE()
+
+ catch(...)
+ {
+ catchAllBody.eval(env);
+ }
+ }
+
+#undef PHOENIX_ITERATION
+
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+
+#define PHOENIX_ITERATION BOOST_PP_ITERATION()
+
+ catch(typename BOOST_PP_CAT(CatchBody, PHOENIX_ITERATION)::exception_type&)
+ {
+ BOOST_PP_CAT(catchBody, PHOENIX_ITERATION).eval(env);
+ }
+
+#undef PHOENIX_ITERATION
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/detail/catch_composite.hpp b/boost/spirit/home/phoenix/statement/detail/catch_composite.hpp
new file mode 100644
index 0000000000..1877310540
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/detail/catch_composite.hpp
@@ -0,0 +1,62 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_DETAIL_CATCH_COMPOSITE_HPP
+#define PHOENIX_STATEMENT_DETAIL_CATCH_COMPOSITE_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix {
+namespace detail
+{
+ struct catch_composite_eval
+ {
+ template<typename Env, typename Actor>
+ struct result :
+ eval_result<typename Actor::eval_type, Env> {};
+
+ template<typename Rt, typename Env, typename Actor>
+ static typename result<Env,Actor>::type
+ eval(const Env& env, Actor& actor)
+ {
+ return actor.eval(env);
+ }
+ };
+
+ template<typename Exception, typename Actor>
+ struct catch_composite :
+ composite<catch_composite_eval, fusion::vector<Actor> >
+ {
+ catch_composite(const Actor& actor)
+ : composite<catch_composite_eval, fusion::vector<Actor> >(actor) { }
+
+ typedef Exception exception_type;
+ };
+
+ template<typename Exception, typename Actor>
+ struct as_catch_actor
+ {
+ typedef catch_composite<
+ Exception,
+ Actor> comp;
+
+ typedef actor<comp> type;
+ };
+
+ template<typename Exception, typename Actor>
+ inline typename as_catch_actor<Exception, Actor>::type
+ catch_actor(const Actor& actor)
+ {
+ return catch_composite<Exception,Actor>(actor);
+ }
+}
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/detail/catch_eval.hpp b/boost/spirit/home/phoenix/statement/detail/catch_eval.hpp
new file mode 100644
index 0000000000..bc65e90af6
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/detail/catch_eval.hpp
@@ -0,0 +1,79 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#ifndef PHOENIX_STATEMENT_DETAIL_CATCH_EVAL_HPP
+#define PHOENIX_STATEMENT_DETAIL_CATCH_EVAL_HPP
+
+#include <boost/spirit/home/phoenix/core/limits.hpp>
+#include <boost/preprocessor/iteration/iterate.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_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/mpl/void.hpp>
+
+namespace boost { namespace phoenix {
+ class catch_eval
+ {
+ public:
+ template<typename Env, typename TryBody,
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(PHOENIX_CATCH_LIMIT, typename CatchBody, mpl::void_)>
+ struct result
+ {
+ typedef void type;
+ };
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (1, PHOENIX_CATCH_LIMIT, "boost/spirit/home/phoenix/statement/detail/catch_eval.hpp"))
+
+#include BOOST_PP_ITERATE()
+
+ };
+}}
+
+#endif
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+
+#define PHOENIX_ITERATION BOOST_PP_ITERATION()
+
+ template<typename Rt, typename Env, typename TryBody,
+ BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename CatchBody)>
+ static void eval(
+ const Env& env, TryBody& tryBody,
+ BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, CatchBody, catchBody))
+ {
+ try
+ {
+ tryBody.eval(env);
+ }
+
+#define BOOST_PP_ITERATION_PARAMS_2 \
+ (3, (0, BOOST_PP_DEC(PHOENIX_ITERATION), "boost/spirit/home/phoenix/statement/detail/catch_eval.hpp"))
+
+#include BOOST_PP_ITERATE()
+
+ }
+
+#undef PHOENIX_ITERATION
+
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+
+#define PHOENIX_ITERATION BOOST_PP_ITERATION()
+
+ catch(typename BOOST_PP_CAT(CatchBody, PHOENIX_ITERATION)::exception_type&)
+ {
+ BOOST_PP_CAT(catchBody, PHOENIX_ITERATION).eval(env);
+ }
+
+#undef PHOENIX_ITERATION
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/detail/switch.hpp b/boost/spirit/home/phoenix/statement/detail/switch.hpp
new file mode 100644
index 0000000000..537fcb1cec
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/detail/switch.hpp
@@ -0,0 +1,172 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_DETAIL_SWITCH_HPP
+#define PHOENIX_STATEMENT_DETAIL_SWITCH_HPP
+
+#include <boost/spirit/home/phoenix/core/nothing.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/fusion/include/push_back.hpp>
+#include <boost/fusion/include/push_front.hpp>
+#include <boost/fusion/include/begin.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/value_of.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+
+namespace boost { namespace phoenix
+{
+
+ template <typename Actor, typename K, K Value>
+ struct switch_case;
+
+ template <typename Actor>
+ struct default_case;
+
+ namespace detail
+ {
+ template <typename T>
+ struct is_default_case : mpl::bool_<T::is_default> {};
+
+ template <typename A0, typename A1>
+ struct compose_case_a
+ {
+ // here, A0 and A1 are both switch cases
+ typedef typename
+ mpl::if_<
+ is_default_case<A1>
+ , fusion::vector<actor<A1>, actor<A0> >
+ , fusion::vector<actor<A0>, actor<A1> >
+ >::type
+ type;
+
+ static type
+ eval(A0 const& _0, A1 const& _1, mpl::false_)
+ {
+ return type(_0, _1);
+ }
+
+ static type
+ eval(A0 const& _0, A1 const& _1, mpl::true_)
+ {
+ return type(_1, _0);
+ }
+
+ static type
+ eval(A0 const& _0, A1 const& _1)
+ {
+ return eval(_0, _1, is_default_case<A1>());
+ }
+ };
+
+ template <typename Seq, typename Case>
+ struct compose_case_b
+ {
+ typedef typename fusion::result_of::as_vector<
+ typename mpl::eval_if<
+ is_default_case<Case>
+ , fusion::result_of::push_front<Seq const, actor<Case> >
+ , fusion::result_of::push_back<Seq const, actor<Case> >
+ >::type>::type
+ type;
+
+ static type
+ eval(Seq const& seq, Case const& case_, mpl::false_)
+ {
+ return fusion::as_vector(
+ fusion::push_back(seq, actor<Case>(case_)));
+ }
+
+ static type
+ eval(Seq const& seq, Case const& case_, mpl::true_)
+ {
+ return fusion::as_vector(
+ fusion::push_front(seq, actor<Case>(case_)));
+ }
+
+ static type
+ eval(Seq const& seq, Case const& case_)
+ {
+ return eval(seq, case_, is_default_case<Case>());
+ }
+ };
+
+ template <typename Cases>
+ struct ensure_default
+ {
+ typedef
+ is_default_case<
+ typename fusion::result_of::value_of<
+ typename fusion::result_of::begin<Cases>::type
+ >::type
+ >
+ is_default_case_;
+
+ typedef typename
+ mpl::eval_if<
+ is_default_case_
+ , mpl::identity<Cases>
+ , fusion::result_of::push_front<
+ Cases const, actor<default_case<actor<null_actor> > > >
+ >::type
+ type;
+
+ static type
+ eval(Cases const& cases, mpl::false_);
+
+ static type
+ eval(Cases const& cases, mpl::true_)
+ {
+ return cases;
+ }
+
+ static type
+ eval(Cases const& cases)
+ {
+ return eval(cases, is_default_case_());
+ }
+ };
+
+ template <typename Cond, typename Cases>
+ struct switch_composite
+ {
+ BOOST_STATIC_ASSERT(fusion::traits::is_sequence<Cases>::value);
+ typedef ensure_default<Cases> ensure_default_;
+
+ typedef typename
+ fusion::result_of::as_vector<
+ typename fusion::result_of::push_front<
+ typename ensure_default_::type, Cond>::type
+ >::type
+ tuple_type;
+
+ typedef
+ composite<
+ detail::switch_eval<fusion::result_of::size<tuple_type>::value-2>
+ , tuple_type>
+ type;
+
+ static type
+ eval(Cond const& cond, Cases const& cases)
+ {
+ return fusion::as_vector(
+ fusion::push_front(ensure_default_::eval(cases), cond));
+ }
+ };
+
+ template <typename Cond, typename Cases>
+ struct switch_composite_actor
+ {
+ typedef actor<typename switch_composite<Cond, Cases>::type> type;
+ };
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/detail/switch_eval.hpp b/boost/spirit/home/phoenix/statement/detail/switch_eval.hpp
new file mode 100644
index 0000000000..220745bab8
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/detail/switch_eval.hpp
@@ -0,0 +1,111 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_DETAIL_SWITCH_EVAL_HPP
+#define PHOENIX_STATEMENT_DETAIL_SWITCH_EVAL_HPP
+
+namespace boost { namespace phoenix { namespace detail
+{
+ template <int N>
+ struct switch_eval;
+
+ template <>
+ struct switch_eval<0>
+ {
+ template <
+ typename Env, typename Cond, typename Default
+ >
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <
+ typename RT, typename Env, typename Cond, typename Default
+ >
+ static void
+ eval(
+ Env const& env, Cond& cond, Default& default_
+ )
+ {
+ default_.eval(env);
+ }
+ };
+
+ template <>
+ struct switch_eval<1>
+ {
+ template <
+ typename Env, typename Cond, typename Default
+ , typename Case0
+ >
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <
+ typename RT, typename Env, typename Cond, typename Default
+ , typename Case0
+ >
+ static void
+ eval(
+ Env const& env, Cond& cond, Default& default_
+ , Case0& _0
+ )
+ {
+ switch (cond.eval(env))
+ {
+ case Case0::value:
+ _0.eval(env);
+ break;
+ default:
+ default_.eval(env);
+ }
+ }
+ };
+
+ template <>
+ struct switch_eval<2>
+ {
+ template <
+ typename Env, typename Cond, typename Default
+ , typename Case0, typename Case1
+ >
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <
+ typename RT, typename Env, typename Cond, typename Default
+ , typename Case0, typename Case1
+ >
+ static void
+ eval(
+ Env const& env, Cond& cond, Default& default_
+ , Case0& _0, Case1& _1
+ )
+ {
+ switch (cond.eval(env))
+ {
+ case Case0::value:
+ _0.eval(env);
+ break;
+ case Case1::value:
+ _1.eval(env);
+ break;
+ default:
+ default_.eval(env);
+ }
+ }
+ };
+
+ // Bring in the rest of the switch_evals
+ #include <boost/spirit/home/phoenix/statement/detail/switch_eval.ipp>
+}}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/detail/switch_eval.ipp b/boost/spirit/home/phoenix/statement/detail/switch_eval.ipp
new file mode 100644
index 0000000000..ba4ae74618
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/detail/switch_eval.ipp
@@ -0,0 +1,74 @@
+/*=============================================================================
+ Copyright (c) 2001-2006 Joel de Guzman
+
+ 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_PP_IS_ITERATING
+#ifndef PHOENIX_STATEMENT_DETAIL_SWITCH_EVAL_IPP
+#define PHOENIX_STATEMENT_DETAIL_SWITCH_EVAL_IPP
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define PHOENIX_CASE_ITEM(z, n, prefix) \
+ case BOOST_PP_CAT(Case, n)::value: \
+ BOOST_PP_CAT(_, n).eval(env); \
+ break;
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (3, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT)), \
+ "boost/spirit/home/phoenix/statement/detail/switch_eval.ipp"))
+#include BOOST_PP_ITERATE()
+
+#undef PHOENIX_CASE_ITEM
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <>
+ struct switch_eval<N>
+ {
+ template <
+ typename Env, typename Cond, typename Default
+ , BOOST_PP_ENUM_PARAMS(N, typename Case)
+ >
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <
+ typename RT, typename Env, typename Cond, typename Default
+ , BOOST_PP_ENUM_PARAMS(N, typename Case)
+ >
+ static void
+ eval(Env const& env, Cond& cond, Default& default_
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, Case, & _)
+ )
+ {
+ switch (cond.eval(env))
+ {
+ BOOST_PP_REPEAT(N, PHOENIX_CASE_ITEM, _)
+ default:
+ default_.eval(env);
+ }
+ }
+ };
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/phoenix/statement/do_while.hpp b/boost/spirit/home/phoenix/statement/do_while.hpp
new file mode 100644
index 0000000000..8d634c94c4
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/do_while.hpp
@@ -0,0 +1,62 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_DO_WHILE_HPP
+#define PHOENIX_STATEMENT_DO_WHILE_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ struct do_while_eval
+ {
+ template <typename Env, typename Cond, typename Do>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename RT, typename Env, typename Cond, typename Do>
+ static void
+ eval(Env const& env, Cond& cond, Do& do_)
+ {
+ do
+ do_.eval(env);
+ while (cond.eval(env));
+ }
+ };
+
+ template <typename Do>
+ struct do_while_gen
+ {
+ do_while_gen(Do const& do_)
+ : do_(do_) {}
+
+ template <typename Cond>
+ actor<typename as_composite<do_while_eval, Cond, Do>::type>
+ while_(Cond const& cond) const
+ {
+ return compose<do_while_eval>(cond, do_);
+ }
+
+ Do do_;
+ };
+
+ struct do_gen
+ {
+ template <typename Do>
+ do_while_gen<Do>
+ operator[](Do const& do_) const
+ {
+ return do_while_gen<Do>(do_);
+ }
+ };
+
+ do_gen const do_ = do_gen();
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/for.hpp b/boost/spirit/home/phoenix/statement/for.hpp
new file mode 100644
index 0000000000..35e091feb4
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/for.hpp
@@ -0,0 +1,64 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_FOR_HPP
+#define PHOENIX_STATEMENT_FOR_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ struct for_eval
+ {
+ template <
+ typename Env
+ , typename Init, typename Cond, typename Step, typename Do>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <
+ typename RT, typename Env
+ , typename Init, typename Cond, typename Step, typename Do>
+ static void
+ eval(
+ Env const& env
+ , Init& init, Cond& cond, Step& step, Do& do_)
+ {
+ for (init.eval(env); cond.eval(env); step.eval(env))
+ do_.eval(env);
+ }
+ };
+
+ template <typename Init, typename Cond, typename Step>
+ struct for_gen
+ {
+ for_gen(Init const& init, Cond const& cond, Step const& step)
+ : init(init), cond(cond), step(step) {}
+
+ template <typename Do>
+ actor<typename as_composite<for_eval, Init, Cond, Step, Do>::type>
+ operator[](Do const& do_) const
+ {
+ return compose<for_eval>(init, cond, step, do_);
+ }
+
+ Init init;
+ Cond cond;
+ Step step;
+ };
+
+ template <typename Init, typename Cond, typename Step>
+ inline for_gen<Init, Cond, Step>
+ for_(Init const& init, Cond const& cond, Step const& step)
+ {
+ return for_gen<Init, Cond, Step>(init, cond, step);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/if.hpp b/boost/spirit/home/phoenix/statement/if.hpp
new file mode 100644
index 0000000000..378fec0ca1
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/if.hpp
@@ -0,0 +1,130 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_IF_HPP
+#define PHOENIX_STATEMENT_IF_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/as_actor.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4355)
+#endif
+
+namespace boost { namespace phoenix
+{
+ struct if_else_eval
+ {
+ template <typename Env, typename Cond, typename Then, typename Else>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <
+ typename RT, typename Env
+ , typename Cond, typename Then, typename Else>
+ static void
+ eval(Env const& env, Cond& cond, Then& then, Else& else_)
+ {
+ if (cond.eval(env))
+ then.eval(env);
+ else
+ else_.eval(env);
+ }
+ };
+
+ struct if_eval
+ {
+ template <typename Env, typename Cond, typename Then>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename RT, typename Env, typename Cond, typename Then>
+ static void
+ eval(Env const& env, Cond& cond, Then& then)
+ {
+ if (cond.eval(env))
+ then.eval(env);
+ }
+ };
+
+ template <typename Cond, typename Then>
+ struct if_composite;
+
+ template <typename Cond, typename Then>
+ struct else_gen
+ {
+ else_gen(if_composite<Cond, Then> const& source)
+ : source(source) {}
+
+ template <typename Else>
+ actor<typename as_composite<if_else_eval, Cond, Then, Else>::type>
+ operator[](Else const& else_) const
+ {
+ return compose<if_else_eval>(
+ fusion::at_c<0>(source) // cond
+ , fusion::at_c<1>(source) // then
+ , else_ // else
+ );
+ }
+
+ if_composite<Cond, Then> const& source;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ else_gen& operator= (else_gen const&);
+ };
+
+ template <typename Cond, typename Then>
+ struct if_composite : composite<if_eval, fusion::vector<Cond, Then> >
+ {
+ if_composite(Cond const& cond, Then const& then)
+ : composite<if_eval, fusion::vector<Cond, Then> >(cond, then)
+ , else_(*this) {}
+
+ else_gen<Cond, Then> else_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ if_composite& operator= (if_composite const&);
+ };
+
+ template <typename Cond>
+ struct if_gen
+ {
+ if_gen(Cond const& cond)
+ : cond(cond) {}
+
+ template <typename Then>
+ actor<if_composite<Cond, typename as_actor<Then>::type> >
+ operator[](Then const& then) const
+ {
+ return actor<if_composite<Cond, typename as_actor<Then>::type> >(
+ cond, as_actor<Then>::convert(then));
+ }
+
+ Cond cond;
+ };
+
+ template <typename Cond>
+ inline if_gen<typename as_actor<Cond>::type>
+ if_(Cond const& cond)
+ {
+ return if_gen<typename as_actor<Cond>::type>(
+ as_actor<Cond>::convert(cond));
+ }
+}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/sequence.hpp b/boost/spirit/home/phoenix/statement/sequence.hpp
new file mode 100644
index 0000000000..8a5f0c3e72
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/sequence.hpp
@@ -0,0 +1,55 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_SEQUENCE_HPP
+#define PHOENIX_STATEMENT_SEQUENCE_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ struct sequence_eval
+ {
+ template <typename Env, typename A0, typename A1>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename RT, typename Env, typename A0, typename A1>
+ static void
+ eval(Env const& env, A0& a0, A1& a1)
+ {
+ a0.eval(env);
+ a1.eval(env);
+ }
+ };
+
+ namespace detail
+ {
+ template <typename BaseT0, typename BaseT1>
+ struct comma_result
+ {
+ typedef actor<
+ typename as_composite<
+ sequence_eval
+ , actor<BaseT0>
+ , actor<BaseT1>
+ >::type
+ > type;
+ };
+ }
+
+ template <typename BaseT0, typename BaseT1>
+ inline typename detail::comma_result<BaseT0, BaseT1>::type
+ operator,(actor<BaseT0> const& a0, actor<BaseT1> const& a1)
+ {
+ return compose<sequence_eval>(a0, a1);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/switch.hpp b/boost/spirit/home/phoenix/statement/switch.hpp
new file mode 100644
index 0000000000..1229994faf
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/switch.hpp
@@ -0,0 +1,164 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_SWITCH_HPP
+#define PHOENIX_STATEMENT_SWITCH_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+#include <boost/spirit/home/phoenix/core/nothing.hpp>
+#include <boost/spirit/home/phoenix/statement/detail/switch_eval.hpp>
+#include <boost/spirit/home/phoenix/statement/detail/switch.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/mpl/not.hpp>
+
+namespace boost { namespace phoenix
+{
+ template <typename Derived, typename Actor>
+ struct switch_case_base
+ {
+ typedef Derived derived_t;
+ typedef Actor actor_t;
+ typedef typename Actor::no_nullary no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename Actor::eval_type::template result<Env>::type type;
+ };
+
+ switch_case_base(Actor const& actor)
+ : actor(actor) {}
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return actor.eval(env);
+ }
+
+ Actor actor;
+ };
+
+ template <typename Actor, typename K, K Value>
+ struct switch_case : switch_case_base<switch_case<Actor, K, Value>, Actor>
+ {
+ typedef switch_case_base<switch_case<Actor, K, Value>, Actor> base_t;
+ static K const value = Value;
+ static bool const is_default = false;
+
+ switch_case(Actor const& actor)
+ : base_t(actor) {}
+ };
+
+ template <typename Actor>
+ struct default_case : switch_case_base<default_case<Actor>, Actor>
+ {
+ typedef switch_case_base<default_case<Actor>, Actor> base_t;
+ static bool const is_default = true;
+
+ default_case(Actor const& actor)
+ : base_t(actor) {}
+ };
+
+ template <typename Cond>
+ struct switch_gen
+ {
+ switch_gen(Cond const& cond)
+ : cond(cond) {}
+
+ template <typename Cases>
+ typename lazy_enable_if<
+ fusion::traits::is_sequence<Cases>
+ , detail::switch_composite_actor<Cond, Cases>
+ >::type
+ operator[](Cases const& cases) const
+ {
+ typedef typename
+ detail::switch_composite<Cond, Cases>
+ switch_composite;
+ return switch_composite::eval(cond, cases);
+ }
+
+ template <typename D, typename A>
+ actor<typename detail::
+ switch_composite<Cond, fusion::vector<actor<D> > >::type>
+ operator[](switch_case_base<D, A> const& case_) const
+ {
+ typedef typename
+ detail::switch_composite<Cond, fusion::vector<actor<D> > >
+ switch_composite;
+ return switch_composite::eval(cond,
+ fusion::vector<actor<D> >(static_cast<D const&>(case_)));
+ }
+
+ Cond cond;
+ };
+
+ template <typename Cond>
+ inline switch_gen<typename as_actor<Cond>::type>
+ switch_(Cond const& cond)
+ {
+ return switch_gen<typename as_actor<Cond>::type>(
+ as_actor<Cond>::convert(cond));
+ }
+
+ template <int N, typename A0>
+ switch_case<typename as_actor<A0>::type, int, N>
+ case_(A0 const& _0)
+ {
+ return switch_case<typename as_actor<A0>::type, int, N>
+ (as_actor<A0>::convert(_0));
+ }
+
+ template <typename A0>
+ default_case<typename as_actor<A0>::type>
+ default_(A0 const& _0)
+ {
+ return default_case<typename as_actor<A0>::type>
+ (as_actor<A0>::convert(_0));
+ }
+
+ template <typename D0, typename A0, typename D1, typename A1>
+ inline typename detail::compose_case_a<D0, D1>::type
+ operator,(
+ switch_case_base<D0, A0> const& _0
+ , switch_case_base<D1, A1> const& _1
+ )
+ {
+ return detail::compose_case_a<D0, D1>::eval(
+ static_cast<D0 const&>(_0)
+ , static_cast<D1 const&>(_1)
+ );
+ }
+
+ template <typename Seq, typename D, typename A>
+ inline typename
+ lazy_enable_if<
+ fusion::traits::is_sequence<Seq>
+ , detail::compose_case_b<Seq, D>
+ >::type
+ operator,(Seq const& seq, switch_case_base<D, A> const& case_)
+ {
+ return detail::compose_case_b<Seq, D>::eval(
+ seq, static_cast<D const&>(case_));
+ }
+
+ // Implementation of routines in detail/switch.hpp that depend on
+ // the completeness of default_case.
+ namespace detail {
+ template <typename Cases>
+ typename ensure_default<Cases>::type
+ ensure_default<Cases>::eval(Cases const& cases, mpl::false_)
+ {
+ actor<default_case<actor<null_actor> > > default_
+ = default_case<actor<null_actor> >(nothing);
+ return fusion::push_front(cases, default_);
+ }
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/throw.hpp b/boost/spirit/home/phoenix/statement/throw.hpp
new file mode 100644
index 0000000000..87a087274d
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/throw.hpp
@@ -0,0 +1,66 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_THROW_HPP
+#define PHOENIX_STATEMENT_THROW_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace phoenix {
+
+ struct throw_new_eval
+ {
+ template<typename Env, typename ThrowExpr>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<typename Rt, typename Env, typename ThrowExpr>
+ static void
+ eval(const Env& env, ThrowExpr& throwExpr)
+ {
+ throw throwExpr.eval(env);
+ }
+ };
+
+ struct throw_again_eval
+ {
+ typedef mpl::false_ no_nullary;
+
+ template<typename Env>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<typename Env>
+ void eval(const Env&) const
+ {
+ throw;
+ }
+ };
+
+ inline actor<throw_again_eval> throw_()
+ {
+ return throw_again_eval();
+ }
+
+ template<typename Actor>
+ actor<typename as_composite<throw_new_eval, Actor>::type>
+ throw_(const Actor& a)
+ {
+ return compose<throw_new_eval>(a);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/try_catch.hpp b/boost/spirit/home/phoenix/statement/try_catch.hpp
new file mode 100644
index 0000000000..dccfd425ac
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/try_catch.hpp
@@ -0,0 +1,188 @@
+/*=============================================================================
+ Copyright (c) 2005-2007 Dan Marsden
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_TRY_CATCH_HPP
+#define PHOENIX_STATEMENT_TRY_CATCH_HPP
+
+#include <boost/spirit/home/phoenix/core/actor.hpp>
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+
+#include <boost/fusion/include/push_back.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+
+#include <boost/spirit/home/phoenix/statement/detail/catch_composite.hpp>
+#include <boost/spirit/home/phoenix/statement/detail/catch_eval.hpp>
+#include <boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4355)
+#endif
+
+namespace boost { namespace phoenix {
+
+ template<typename Tuple> struct try_catch_composite;
+
+ namespace meta
+ {
+ template<typename Composite, typename Actor>
+ struct try_catch_composite_push_back
+ {
+ typedef typename Composite::base_type actor_tuple;
+ typedef try_catch_composite<
+ typename fusion::result_of::as_vector<
+ typename fusion::result_of::push_back<
+ actor_tuple, Actor>::type>::type> type;
+ };
+
+ template<typename Composite, typename Actor>
+ struct catch_all_composite_push_back
+ {
+ typedef typename Composite::base_type actor_tuple;
+
+ typedef composite<
+ catch_all_eval,
+ typename fusion::result_of::as_vector<
+ typename fusion::result_of::push_back<
+ actor_tuple, Actor>::type>::type> type;
+ };
+ }
+
+ namespace detail
+ {
+ struct try_catch_composite_push_back
+ {
+ template<typename Composite, typename Actor>
+ struct result
+ : meta::try_catch_composite_push_back<Composite, Actor>
+ {};
+
+ template<typename Composite, typename Actor>
+ typename result<Composite, Actor>::type
+ operator()(
+ const Composite& composite, const Actor& actor) const
+ {
+ typedef typename result<Composite, Actor>::type result;
+ return result(
+ fusion::as_vector(
+ fusion::push_back(composite, actor)));
+ }
+ };
+
+ struct catch_all_composite_push_back
+ {
+ template<typename Composite, typename Actor>
+ struct result
+ : meta::catch_all_composite_push_back<Composite, Actor>
+ {};
+
+ template<typename Composite, typename Actor>
+ typename result<Composite, Actor>::type
+ operator()(
+ const Composite& composite, const Actor& actor) const
+ {
+ typedef typename result<Composite, Actor>::type result;
+ return result(
+ fusion::as_vector(
+ fusion::push_back(composite, actor)));
+ }
+ };
+
+ }
+
+ detail::try_catch_composite_push_back const try_catch_composite_push_back
+ = detail::try_catch_composite_push_back();
+ detail::catch_all_composite_push_back const catch_all_composite_push_back
+ = detail::catch_all_composite_push_back();
+
+ template<typename Exception, typename SourceComposite>
+ struct catch_gen
+ {
+ explicit catch_gen(
+ const SourceComposite& sourceComposite)
+ : mSourceComposite(sourceComposite) { }
+
+ template<typename Actor>
+ actor<typename meta::try_catch_composite_push_back<
+ SourceComposite,
+ detail::catch_composite<Exception, Actor> >::type>
+ operator[](const Actor& actor) const
+ {
+ return try_catch_composite_push_back(
+ mSourceComposite, detail::catch_composite<Exception, Actor>(actor));
+ }
+
+ const SourceComposite& mSourceComposite;
+ };
+
+ template<typename SourceComposite>
+ struct catch_all_gen
+ {
+ explicit catch_all_gen(
+ const SourceComposite& sourceComposite)
+ : mSourceComposite(sourceComposite) { }
+
+ template<typename Actor>
+ actor<typename meta::catch_all_composite_push_back<SourceComposite, Actor>::type>
+ operator[](const Actor& actor) const
+ {
+ return catch_all_composite_push_back(
+ mSourceComposite, actor);
+ }
+
+ const SourceComposite& mSourceComposite;
+ };
+
+ template<typename Tuple>
+ struct try_catch_composite
+ : composite<catch_eval, Tuple>
+ {
+ explicit try_catch_composite(
+ const Tuple& t)
+ :
+ composite<catch_eval, Tuple>(t),
+ catch_all(*this) { }
+
+ try_catch_composite(
+ const try_catch_composite& rhs)
+ : composite<catch_eval, Tuple>(rhs),
+ catch_all(*this) { }
+
+ template<typename Exception>
+ catch_gen<Exception, try_catch_composite> catch_() const
+ {
+ return catch_gen<Exception, try_catch_composite>(
+ *this);
+ }
+
+ const catch_all_gen<try_catch_composite> catch_all;
+
+ private:
+ try_catch_composite& operator=(const try_catch_composite&);
+ };
+
+ struct try_gen
+ {
+ template<typename Try>
+ try_catch_composite<fusion::vector<Try> > operator[](
+ const Try& try_) const
+ {
+ typedef fusion::vector<Try> tuple_type;
+ return try_catch_composite<tuple_type>(
+ tuple_type(try_));
+ }
+ };
+
+ try_gen const try_ = try_gen();
+}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/phoenix/statement/while.hpp b/boost/spirit/home/phoenix/statement/while.hpp
new file mode 100644
index 0000000000..96b988c291
--- /dev/null
+++ b/boost/spirit/home/phoenix/statement/while.hpp
@@ -0,0 +1,56 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STATEMENT_WHILE_HPP
+#define PHOENIX_STATEMENT_WHILE_HPP
+
+#include <boost/spirit/home/phoenix/core/composite.hpp>
+#include <boost/spirit/home/phoenix/core/compose.hpp>
+
+namespace boost { namespace phoenix
+{
+ struct while_eval
+ {
+ template <typename Env, typename Cond, typename Do>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename RT, typename Env, typename Cond, typename Do>
+ static void
+ eval(Env const& env, Cond& cond, Do& do_)
+ {
+ while (cond.eval(env))
+ do_.eval(env);
+ }
+ };
+
+ template <typename Cond>
+ struct while_gen
+ {
+ while_gen(Cond const& cond)
+ : cond(cond) {}
+
+ template <typename Do>
+ actor<typename as_composite<while_eval, Cond, Do>::type>
+ operator[](Do const& do_) const
+ {
+ return compose<while_eval>(cond, do_);
+ }
+
+ Cond cond;
+ };
+
+ template <typename Cond>
+ inline while_gen<Cond>
+ while_(Cond const& cond)
+ {
+ return while_gen<Cond>(cond);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl.hpp b/boost/spirit/home/phoenix/stl.hpp
new file mode 100644
index 0000000000..12832f7d9c
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl.hpp
@@ -0,0 +1,15 @@
+/*=============================================================================
+ Copyright (c) 2006 Daniel Wallin
+ Copyright (c) 2005 Dan Marsden
+ Copyright (c) 2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STL_HPP
+#define PHOENIX_STL_HPP
+
+#include <boost/spirit/home/phoenix/stl/algorithm.hpp>
+#include <boost/spirit/home/phoenix/stl/container.hpp>
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm.hpp b/boost/spirit/home/phoenix/stl/algorithm.hpp
new file mode 100644
index 0000000000..01f4f9d15e
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm.hpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2004 Angus Leeming
+ Copyright (c) 2006 Daniel Wallin
+ Copyright (c) 2005 Dan Marsden
+ Copyright (c) 2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STL_ALGORITHM_HPP
+#define PHOENIX_STL_ALGORITHM_HPP
+
+#include <boost/spirit/home/phoenix/stl/algorithm/iteration.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/querying.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>
+
+#endif // PHOENIX_STL_ALGORITHM_HPP
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp
new file mode 100644
index 0000000000..165aae87a3
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp
@@ -0,0 +1,28 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+
+#ifndef PHOENIX_ALGORITHM_DETAIL_BEGIN_HPP
+#define PHOENIX_ALGORITHM_DETAIL_BEGIN_HPP
+
+#include <boost/range/result_iterator.hpp>
+#include <boost/range/begin.hpp>
+
+namespace boost { namespace phoenix {
+namespace detail
+{
+ template<class R>
+ typename range_result_iterator<R>::type
+ begin_(R& r)
+ {
+ return boost::begin(r);
+ }
+}
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp
new file mode 100644
index 0000000000..1ea263d851
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp
@@ -0,0 +1,30 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+
+#ifndef PHOENIX_ALGORITHM_DETAIL_DECAY_ARRAY_HPP
+#define PHOENIX_ALGORITHM_DETAIL_DECAY_ARRAY_HPP
+
+namespace boost { namespace phoenix {
+namespace detail
+{
+ template<typename T>
+ struct decay_array
+ {
+ typedef T type;
+ };
+
+ template<typename T, int N>
+ struct decay_array<T[N]>
+ {
+ typedef T* type;
+ };
+}
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp
new file mode 100644
index 0000000000..4386d3a9da
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp
@@ -0,0 +1,28 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+
+#ifndef PHOENIX_ALGORITHM_DETAIL_END_HPP
+#define PHOENIX_ALGORITHM_DETAIL_END_HPP
+
+#include <boost/range/result_iterator.hpp>
+#include <boost/range/end.hpp>
+
+namespace boost { namespace phoenix {
+namespace detail
+{
+ template<class R>
+ typename range_result_iterator<R>::type
+ end_(R& r)
+ {
+ return boost::end(r);
+ }
+}
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp
new file mode 100644
index 0000000000..1f7dcce252
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp
@@ -0,0 +1,51 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_equal_range.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_EQUAL_RANGE_EN_14_12_2004
+#define HAS_EQUAL_RANGE_EN_14_12_2004
+
+#include <boost/mpl/or.hpp>
+#include "./is_std_map.hpp"
+#include "./is_std_set.hpp"
+#include "./is_std_hash_map.hpp"
+#include "./is_std_hash_set.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_equal_range
+ : boost::mpl::or_<
+ boost::mpl::or_<
+ is_std_map<T>
+ , is_std_multimap<T>
+ , is_std_set<T>
+ , is_std_multiset<T>
+ >
+ , boost::mpl::or_<
+ is_std_hash_map<T>
+ , is_std_hash_multimap<T>
+ , is_std_hash_set<T>
+ , is_std_hash_multiset<T>
+ >
+ >
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp
new file mode 100644
index 0000000000..3768dd5c43
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp
@@ -0,0 +1,51 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_find.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_FIND_EN_14_12_2004
+#define HAS_FIND_EN_14_12_2004
+
+#include <boost/mpl/or.hpp>
+#include "./is_std_map.hpp"
+#include "./is_std_set.hpp"
+#include "./is_std_hash_map.hpp"
+#include "./is_std_hash_set.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_find
+ : boost::mpl::or_<
+ boost::mpl::or_<
+ is_std_map<T>
+ , is_std_multimap<T>
+ , is_std_set<T>
+ , is_std_multiset<T>
+ >
+ , boost::mpl::or_<
+ is_std_hash_map<T>
+ , is_std_hash_multimap<T>
+ , is_std_hash_set<T>
+ , is_std_hash_multiset<T>
+ >
+ >
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp
new file mode 100644
index 0000000000..c1d47e2927
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp
@@ -0,0 +1,51 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_lower_bound.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_LOWER_BOUND_EN_14_12_2004
+#define HAS_LOWER_BOUND_EN_14_12_2004
+
+#include <boost/mpl/or.hpp>
+#include "./is_std_map.hpp"
+#include "./is_std_set.hpp"
+#include "./is_std_hash_map.hpp"
+#include "./is_std_hash_set.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_lower_bound
+ : boost::mpl::or_<
+ boost::mpl::or_<
+ is_std_map<T>
+ , is_std_multimap<T>
+ , is_std_set<T>
+ , is_std_multiset<T>
+ >
+ , boost::mpl::or_<
+ is_std_hash_map<T>
+ , is_std_hash_multimap<T>
+ , is_std_hash_set<T>
+ , is_std_hash_multiset<T>
+ >
+ >
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp
new file mode 100644
index 0000000000..e86c87c75e
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp
@@ -0,0 +1,34 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_remove.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_REMOVE_EN_14_12_2004
+#define HAS_REMOVE_EN_14_12_2004
+
+#include "./is_std_list.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_remove
+ : is_std_list<T>
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp
new file mode 100644
index 0000000000..99ce7cd8aa
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp
@@ -0,0 +1,34 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_remove_if.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_REMOVE_IF_EN_14_12_2004
+#define HAS_REMOVE_IF_EN_14_12_2004
+
+#include "./is_std_list.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_remove_if
+ : is_std_list<T>
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp
new file mode 100644
index 0000000000..e74bcabf5a
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp
@@ -0,0 +1,34 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_reverse.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_REVERSE_EN_14_12_2004
+#define HAS_REVERSE_EN_14_12_2004
+
+#include "./is_std_list.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_reverse
+ : is_std_list<T>
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp
new file mode 100644
index 0000000000..fa9edc923f
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp
@@ -0,0 +1,34 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_sort.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_SORT_EN_14_12_2004
+#define HAS_SORT_EN_14_12_2004
+
+#include "./is_std_list.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_sort
+ : is_std_list<T>
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp
new file mode 100644
index 0000000000..35dcd3c96b
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp
@@ -0,0 +1,34 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_unique.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_UNIQUE_EN_14_12_2004
+#define HAS_UNIQUE_EN_14_12_2004
+
+#include "./is_std_list.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_unique
+ : is_std_list<T>
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp
new file mode 100644
index 0000000000..995c28c01e
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp
@@ -0,0 +1,51 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_upper_bound.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+#pragma once
+#endif
+
+#ifndef HAS_UPPER_BOUND_EN_14_12_2004
+#define HAS_UPPER_BOUND_EN_14_12_2004
+
+#include <boost/mpl/or.hpp>
+#include "./is_std_map.hpp"
+#include "./is_std_set.hpp"
+#include "./is_std_hash_map.hpp"
+#include "./is_std_hash_set.hpp"
+
+namespace boost
+{
+ // Specialize this for user-defined types
+ template<typename T>
+ struct has_upper_bound
+ : boost::mpl::or_<
+ boost::mpl::or_<
+ is_std_map<T>
+ , is_std_multimap<T>
+ , is_std_set<T>
+ , is_std_multiset<T>
+ >
+ , boost::mpl::or_<
+ is_std_hash_map<T>
+ , is_std_hash_multimap<T>
+ , is_std_hash_set<T>
+ , is_std_hash_multiset<T>
+ >
+ >
+ {
+ };
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_map.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_map.hpp
new file mode 100644
index 0000000000..9d4895c35d
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_map.hpp
@@ -0,0 +1,87 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// is_std_hash_map.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+# pragma once
+#endif
+
+#ifndef IS_STD_HASH_MAP_EN_16_12_2004
+#define IS_STD_HASH_MAP_EN_16_12_2004
+
+#include <boost/mpl/bool.hpp>
+#include "./std_hash_map_fwd.hpp"
+
+namespace boost
+{
+ template<class T>
+ struct is_std_hash_map
+ : boost::mpl::false_
+ {};
+
+ template<class T>
+ struct is_std_hash_multimap
+ : boost::mpl::false_
+ {};
+
+#ifdef BOOST_HAS_HASH
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct is_std_hash_map< ::BOOST_STD_EXTENSION_NAMESPACE::hash_map<Kty,Ty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct is_std_hash_multimap< ::BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<Kty,Ty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {};
+
+#elif defined(BOOST_DINKUMWARE_STDLIB)
+
+ template<
+ class Kty
+ , class Ty
+ , class Tr
+ , class Alloc
+ >
+ struct is_std_hash_map< ::BOOST_STD_EXTENSION_NAMESPACE::hash_map<Kty,Ty,Tr,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<
+ class Kty
+ , class Ty
+ , class Tr
+ , class Alloc
+ >
+ struct is_std_hash_multimap< ::BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<Kty,Ty,Tr,Alloc> >
+ : boost::mpl::true_
+ {};
+
+#endif
+
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_set.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_set.hpp
new file mode 100644
index 0000000000..ece3173152
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_set.hpp
@@ -0,0 +1,83 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// is_std_hash_set.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+# pragma once
+#endif
+
+#ifndef IS_STD_HASH_SET_EN_16_12_2004
+#define IS_STD_HASH_SET_EN_16_12_2004
+
+#include <boost/mpl/bool.hpp>
+#include "./std_hash_set_fwd.hpp"
+
+namespace boost
+{
+ template<class T>
+ struct is_std_hash_set
+ : boost::mpl::false_
+ {};
+
+ template<class T>
+ struct is_std_hash_multiset
+ : boost::mpl::false_
+ {};
+
+#if defined(BOOST_HAS_HASH)
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct is_std_hash_set< ::BOOST_STD_EXTENSION_NAMESPACE::hash_set<Kty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct is_std_hash_multiset< ::BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<Kty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {};
+
+#elif defined(BOOST_DINKUMWARE_STDLIB)
+
+ template<
+ class Kty
+ , class Tr
+ , class Alloc
+ >
+ struct is_std_hash_set< ::BOOST_STD_EXTENSION_NAMESPACE::hash_set<Kty,Tr,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<
+ class Kty
+ , class Tr
+ , class Alloc
+ >
+ struct is_std_hash_multiset< ::BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<Kty,Tr,Alloc> >
+ : boost::mpl::true_
+ {};
+
+#endif
+
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_list.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_list.hpp
new file mode 100644
index 0000000000..8317e51b9b
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_list.hpp
@@ -0,0 +1,41 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// is_std_list.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+# pragma once
+#endif
+
+#ifndef IS_STD_LIST_EN_16_12_2004
+#define IS_STD_LIST_EN_16_12_2004
+
+#include <boost/mpl/bool.hpp>
+#include <boost/detail/container_fwd.hpp>
+
+namespace boost
+{
+ template<class T>
+ struct is_std_list
+ : boost::mpl::false_
+ {};
+
+ template<
+ class Ty
+ , class Alloc
+ >
+ struct is_std_list< ::std::list<Ty,Alloc> >
+ : boost::mpl::true_
+ {};
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_map.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_map.hpp
new file mode 100644
index 0000000000..2b0723114f
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_map.hpp
@@ -0,0 +1,58 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// is_std_map.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+# pragma once
+#endif
+
+#ifndef IS_STD_MAP_EN_16_12_2004
+#define IS_STD_MAP_EN_16_12_2004
+
+#include <boost/mpl/bool.hpp>
+#include <boost/detail/container_fwd.hpp>
+
+namespace boost
+{
+ template<class T>
+ struct is_std_map
+ : boost::mpl::false_
+ {};
+
+ template<
+ class Kty
+ , class Ty
+ , class Pr
+ , class Alloc
+ >
+ struct is_std_map< ::std::map<Kty,Ty,Pr,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<class T>
+ struct is_std_multimap
+ : boost::mpl::false_
+ {};
+
+ template<
+ class Kty
+ , class Ty
+ , class Pr
+ , class Alloc
+ >
+ struct is_std_multimap< ::std::multimap<Kty,Ty,Pr,Alloc> >
+ : boost::mpl::true_
+ {};
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_set.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_set.hpp
new file mode 100644
index 0000000000..43eb25892f
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_set.hpp
@@ -0,0 +1,56 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// is_std_set.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+# pragma once
+#endif
+
+#ifndef IS_STD_SET_EN_16_12_2004
+#define IS_STD_SET_EN_16_12_2004
+
+#include <boost/mpl/bool.hpp>
+#include <boost/detail/container_fwd.hpp>
+
+namespace boost
+{
+ template<class T>
+ struct is_std_set
+ : boost::mpl::false_
+ {};
+
+ template<
+ class Kty
+ , class Pr
+ , class Alloc
+ >
+ struct is_std_set< ::std::set<Kty,Pr,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<class T>
+ struct is_std_multiset
+ : boost::mpl::false_
+ {};
+
+ template<
+ class Kty
+ , class Pr
+ , class Alloc
+ >
+ struct is_std_multiset< ::std::multiset<Kty,Pr,Alloc> >
+ : boost::mpl::true_
+ {};
+}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_map_fwd.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_map_fwd.hpp
new file mode 100644
index 0000000000..9e21c25d90
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_map_fwd.hpp
@@ -0,0 +1,70 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// std_hash_map_fwd.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+# pragma once
+#endif
+
+#ifndef STD_HASH_MAP_FWD_EN_16_12_2004
+#define STD_HASH_MAP_FWD_EN_16_12_2004
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_HAS_HASH)
+
+namespace BOOST_STD_EXTENSION_NAMESPACE
+{
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ class hash_map;
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ class hash_multimap;
+}
+
+#elif defined(BOOST_DINKUMWARE_STDLIB)
+
+namespace BOOST_STD_EXTENSION_NAMESPACE
+{
+ template<
+ class Kty
+ , class Ty
+ , class Tr
+ , class Alloc
+ >
+ class hash_map;
+
+ template<
+ class Kty
+ , class Ty
+ , class Tr
+ , class Alloc
+ >
+ class hash_multimap;
+}
+
+#endif
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_set_fwd.hpp b/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_set_fwd.hpp
new file mode 100644
index 0000000000..76083f4db3
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_set_fwd.hpp
@@ -0,0 +1,66 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// std_hash_set_fwd.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER) && _MSC_VER >= 1000
+# pragma once
+#endif
+
+#ifndef STD_HASH_SET_FWD_EN_16_12_2004
+#define STD_HASH_SET_FWD_EN_16_12_2004
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_HAS_HASH)
+
+namespace BOOST_STD_EXTENSION_NAMESPACE
+{
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ class hash_set;
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ class hash_multiset;
+}
+
+#elif defined(BOOST_DINKUMWARE_STDLIB)
+
+namespace BOOST_STD_EXTENSION_NAMESPACE
+{
+ template<
+ class Kty
+ , class Tr
+ , class Alloc
+ >
+ class hash_set;
+
+ template<
+ class Kty
+ , class Tr
+ , class Alloc
+ >
+ class hash_multiset;
+}
+
+#endif
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/iteration.hpp b/boost/spirit/home/phoenix/stl/algorithm/iteration.hpp
new file mode 100644
index 0000000000..c11905e738
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/iteration.hpp
@@ -0,0 +1,69 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+// Copyright 2005 Dan Marsden.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+
+#ifndef PHOENIX_ALGORITHM_ITERATION_HPP
+#define PHOENIX_ALGORITHM_ITERATION_HPP
+
+#include <algorithm>
+#include <numeric>
+
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>
+
+#include <boost/spirit/home/phoenix/function/function.hpp>
+
+namespace boost { namespace phoenix {
+namespace impl
+{
+ struct for_each
+ {
+ template<class R, class F>
+ struct result
+ {
+ typedef F type;
+ };
+
+ template<class R, class F>
+ F operator()(R& r, F fn) const
+ {
+ return std::for_each(detail::begin_(r), detail::end_(r), fn);
+ }
+ };
+
+ struct accumulate
+ {
+ template<class R, class I, class C = void>
+ struct result
+ {
+ typedef I type;
+ };
+
+ template<class R, class I>
+ typename result<R,I>::type
+ operator()(R& r, I i) const
+ {
+ return std::accumulate(detail::begin_(r), detail::end_(r), i);
+ }
+
+ template<class R, class I, class C>
+ typename result<R,I,C>::type
+ operator()(R& r, I i, C c) const
+ {
+ return std::accumulate(detail::begin_(r), detail::end_(r), i, c);
+ }
+ };
+}
+
+function<impl::for_each> const for_each = impl::for_each();
+function<impl::accumulate> const accumulate = impl::accumulate();
+
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/querying.hpp b/boost/spirit/home/phoenix/stl/algorithm/querying.hpp
new file mode 100644
index 0000000000..87456fd7ff
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/querying.hpp
@@ -0,0 +1,502 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+// Copyright 2005 Dan Marsden.
+// Copyright 2008 Hartmut Kaiser.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+
+#ifndef PHOENIX_ALGORITHM_QUERYING_HPP
+#define PHOENIX_ALGORITHM_QUERYING_HPP
+
+#include <algorithm>
+
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp>
+
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp>
+
+#include <boost/spirit/home/phoenix/function/function.hpp>
+
+#include <boost/range/result_iterator.hpp>
+#include <boost/range/difference_type.hpp>
+
+namespace boost { namespace phoenix {
+namespace impl
+{
+ struct find
+ {
+ template<class R, class T>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& x, mpl::true_) const
+ {
+ return r.find(x);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& x, mpl::false_) const
+ {
+ return std::find(detail::begin_(r), detail::end_(r), x);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type operator()(R& r, T const& x) const
+ {
+ return execute(r, x, has_find<R>());
+ }
+ };
+
+ struct find_if
+ {
+ template<class R, class P>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return std::find_if(detail::begin_(r), detail::end_(r), p);
+ }
+ };
+
+ struct find_end
+ {
+ template<class R, class R2, class P = void>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class R2>
+ typename result<R, R2>::type operator()(R& r, R2& r2) const
+ {
+ return std::find_end(
+ detail::begin_(r)
+ , detail::end_(r)
+ , detail::begin_(r2)
+ , detail::end_(r2)
+ );
+ }
+
+ template<class R, class R2, class P>
+ typename result<R, R2, P>::type operator()(R& r, R2& r2, P p) const
+ {
+ return std::find_end(
+ detail::begin_(r)
+ , detail::end_(r)
+ , detail::begin_(r2)
+ , detail::end_(r2)
+ , p
+ );
+ }
+ };
+
+ struct find_first_of
+ {
+ template<class R, class R2, class P = void>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class R2>
+ typename result<R, R2>::type operator()(R& r, R2& r2) const
+ {
+ return std::find_first_of(
+ detail::begin_(r)
+ , detail::end_(r)
+ , detail::begin_(r2)
+ , detail::end_(r2)
+ );
+ }
+
+ template<class R, class R2, class P>
+ typename result<R, R2, P>::type operator()(R& r, R2& r2, P p) const
+ {
+ return std::find_first_of(
+ detail::begin_(r)
+ , detail::end_(r)
+ , detail::begin_(r2)
+ , detail::end_(r2)
+ , p
+ );
+ }
+ };
+
+ struct adjacent_find
+ {
+ template<class R, class P = void>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R>
+ typename result<R>::type operator()(R& r) const
+ {
+ return std::adjacent_find(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return std::adjacent_find(detail::begin_(r), detail::end_(r), p);
+ }
+ };
+
+ struct count
+ {
+ template<class R, class T>
+ struct result : range_difference<R>
+ {};
+
+ template<class R, class T>
+ typename result<R, T>::type operator()(R& r, T const& x) const
+ {
+ return std::count(detail::begin_(r), detail::end_(r), x);
+ }
+ };
+
+ struct count_if
+ {
+ template<class R, class P>
+ struct result : range_difference<R>
+ {};
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return std::count_if(detail::begin_(r), detail::end_(r), p);
+ }
+ };
+
+ struct distance
+ {
+ template<class R>
+ struct result : range_difference<R>
+ {};
+
+ template<class R>
+ typename result<R>::type operator()(R& r) const
+ {
+ return std::distance(detail::begin_(r), detail::end_(r));
+ }
+ };
+
+ struct equal
+ {
+ template<class R, class I, class P = void>
+ struct result
+ {
+ typedef bool type;
+ };
+
+ template<class R, class I>
+ bool operator()(R& r, I i) const
+ {
+ return std::equal(detail::begin_(r), detail::end_(r), i);
+ }
+
+ template<class R, class I, class P>
+ bool operator()(R& r, I i, P p) const
+ {
+ return std::equal(detail::begin_(r), detail::end_(r), i, p);
+ }
+ };
+
+ struct search
+ {
+ template<class R, class R2, class P = void>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class R2>
+ typename result<R, R2>::type operator()(R& r, R2& r2) const
+ {
+ return std::search(
+ detail::begin_(r)
+ , detail::end_(r)
+ , detail::begin_(r2)
+ , detail::end_(r2)
+ );
+ }
+
+ template<class R, class R2, class P>
+ typename result<R, R2, P>::type operator()(R& r, R2& r2, P p) const
+ {
+ return std::search(
+ detail::begin_(r)
+ , detail::end_(r)
+ , detail::begin_(r2)
+ , detail::end_(r2)
+ , p
+ );
+ }
+ };
+
+ struct lower_bound
+ {
+ template<class R, class T, class C = void>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& val, mpl::true_) const
+ {
+ return r.lower_bound(val);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& val, mpl::false_) const
+ {
+ return std::lower_bound(detail::begin_(r), detail::end_(r), val);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type operator()(R& r, T const& val) const
+ {
+ return execute(r, val, has_lower_bound<R>());
+ }
+
+ template<class R, class T, class C>
+ typename result<R, T>::type operator()(R& r, T const& val, C c) const
+ {
+ return std::lower_bound(detail::begin_(r), detail::end_(r), val, c);
+ }
+ };
+
+ struct upper_bound
+ {
+ template<class R, class T, class C = void>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& val, mpl::true_) const
+ {
+ return r.upper_bound(val);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& val, mpl::false_) const
+ {
+ return std::upper_bound(detail::begin_(r), detail::end_(r), val);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type operator()(R& r, T const& val) const
+ {
+ return execute(r, val, has_upper_bound<R>());
+ }
+
+ template<class R, class T, class C>
+ typename result<R, T>::type operator()(R& r, T const& val, C c) const
+ {
+ return std::upper_bound(detail::begin_(r), detail::end_(r), val, c);
+ }
+ };
+
+ struct equal_range
+ {
+ template<class R, class T, class C = void>
+ struct result
+ {
+ typedef std::pair<
+ typename range_result_iterator<R>::type
+ , typename range_result_iterator<R>::type
+ > type;
+ };
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& val, mpl::true_) const
+ {
+ return r.equal_range(val);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& val, mpl::false_) const
+ {
+ return std::equal_range(detail::begin_(r), detail::end_(r), val);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type operator()(R& r, T const& val) const
+ {
+ return execute(r, val, has_equal_range<R>());
+ }
+
+ template<class R, class T, class C>
+ typename result<R, T>::type operator()(R& r, T const& val, C c) const
+ {
+ return std::equal_range(detail::begin_(r), detail::end_(r), val, c);
+ }
+ };
+
+ struct mismatch
+ {
+ template<class R, class I, class P = void>
+ struct result
+ {
+ typedef std::pair<
+ typename range_result_iterator<R>::type
+ , typename detail::decay_array<I>::type
+ > type;
+ };
+
+ template<class R, class I>
+ typename result<R, I>::type operator()(R& r, I i) const
+ {
+ return std::mismatch(detail::begin_(r), detail::end_(r), i);
+ }
+
+ template<class R, class I, class P>
+ typename result<R, I, P>::type operator()(R& r, I i, P p) const
+ {
+ return std::mismatch(detail::begin_(r), detail::end_(r), i, p);
+ }
+ };
+
+ struct binary_search
+ {
+ template<class R, class T, class C = void>
+ struct result
+ {
+ typedef bool type;
+ };
+
+ template<class R, class T>
+ bool operator()(R& r, T const& val) const
+ {
+ return std::binary_search(detail::begin_(r), detail::end_(r), val);
+ }
+
+ template<class R, class T, class C>
+ bool operator()(R& r, T const& val, C c) const
+ {
+ return std::binary_search(detail::begin_(r), detail::end_(r), val, c);
+ }
+ };
+
+ struct includes
+ {
+ template<class R1, class R2, class C = void>
+ struct result
+ {
+ typedef bool type;
+ };
+
+ template<class R1, class R2>
+ bool operator()(R1& r1, R2& r2) const
+ {
+ return std::includes(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ );
+ }
+
+ template<class R1, class R2, class C>
+ bool operator()(R1& r1, R2& r2, C c) const
+ {
+ return std::includes(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , c
+ );
+ }
+ };
+
+ struct min_element
+ {
+ template<class R, class P = void>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R>
+ typename result<R>::type operator()(R& r) const
+ {
+ return std::min_element(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return std::min_element(detail::begin_(r), detail::end_(r), p);
+ }
+ };
+
+ struct max_element
+ {
+ template<class R, class P = void>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R>
+ typename result<R>::type operator()(R& r) const
+ {
+ return std::max_element(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return std::max_element(detail::begin_(r), detail::end_(r), p);
+ }
+ };
+
+ struct lexicographical_compare
+ {
+ template<class R1, class R2, class P = void>
+ struct result
+ {
+ typedef bool type;
+ };
+
+ template<class R1, class R2>
+ typename result<R1, R2>::type operator()(R1& r1, R2& r2) const
+ {
+ return std::lexicographical_compare(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ );
+ }
+
+ template<class R1, class R2, class P>
+ typename result<R1, R2>::type operator()(R1& r1, R2& r2, P p) const
+ {
+ return std::lexicographical_compare(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , p
+ );
+ }
+ };
+
+}
+
+function<impl::find> const find = impl::find();
+function<impl::find_if> const find_if = impl::find_if();
+function<impl::find_end> const find_end = impl::find_end();
+function<impl::find_first_of> const find_first_of = impl::find_first_of();
+function<impl::adjacent_find> const adjacent_find = impl::adjacent_find();
+function<impl::count> const count = impl::count();
+function<impl::count_if> const count_if = impl::count_if();
+function<impl::distance> const distance = impl::distance();
+function<impl::equal> const equal = impl::equal();
+function<impl::search> const search = impl::search();
+function<impl::lower_bound> const lower_bound = impl::lower_bound();
+function<impl::upper_bound> const upper_bound = impl::upper_bound();
+function<impl::equal_range> const equal_range = impl::equal_range();
+function<impl::mismatch> const mismatch = impl::mismatch();
+function<impl::binary_search> const binary_search = impl::binary_search();
+function<impl::includes> const includes = impl::includes();
+function<impl::min_element> const min_element = impl::min_element();
+function<impl::max_element> const max_element = impl::max_element();
+function<impl::lexicographical_compare> const lexicographical_compare = impl::lexicographical_compare();
+
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/algorithm/transformation.hpp b/boost/spirit/home/phoenix/stl/algorithm/transformation.hpp
new file mode 100644
index 0000000000..7405be7885
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/algorithm/transformation.hpp
@@ -0,0 +1,1071 @@
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+// Copyright 2005 Dan Marsden.
+//
+// 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)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+
+#ifndef PHOENIX_ALGORITHM_TRANSFORMATION_HPP
+#define PHOENIX_ALGORITHM_TRANSFORMATION_HPP
+
+#include <algorithm>
+#include <numeric>
+
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp>
+
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>
+#include <boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp>
+
+#include <boost/spirit/home/phoenix/function/function.hpp>
+
+#include <boost/range/result_iterator.hpp>
+#include <boost/range/difference_type.hpp>
+
+#include <boost/mpl/if.hpp>
+
+#include <boost/type_traits/is_void.hpp>
+
+namespace boost { namespace phoenix { namespace impl
+{
+ struct swap
+ {
+ template <class A, class B>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <class A, class B>
+ void operator()(A& a, B& b) const
+ {
+ using std::swap;
+ swap(a, b);
+ }
+ };
+
+ struct copy
+ {
+ template<class R, class I>
+ struct result
+ : detail::decay_array<I>
+ {};
+
+ template<class R, class I>
+ typename result<R,I>::type
+ operator()(R& r, I i) const
+ {
+ return std::copy(detail::begin_(r), detail::end_(r), i);
+ }
+ };
+
+ struct copy_backward
+ {
+ template<class R, class I>
+ struct result
+ {
+ typedef I type;
+ };
+
+ template<class R, class I>
+ I operator()(R& r, I i) const
+ {
+ return std::copy_backward(detail::begin_(r), detail::end_(r), i);
+ }
+ };
+
+ struct transform
+ {
+ template<class R, class OutorI1, class ForOut, class BinF = void>
+ struct result
+ : detail::decay_array<
+ typename mpl::if_<is_void<BinF>, OutorI1, ForOut>::type>
+ {
+ };
+
+ template<class R, class O, class F>
+ typename result<R,O,F>::type
+ operator()(R& r, O o, F f) const
+ {
+ return std::transform(detail::begin_(r), detail::end_(r), o, f);
+ }
+
+ template<class R, class I, class O, class F>
+ typename result<R,I,O,F>::type
+ operator()(R& r, I i, O o, F f) const
+ {
+ return std::transform(detail::begin_(r), detail::end_(r), i, o, f);
+ }
+ };
+
+ struct replace
+ {
+ template<class R, class T, class T2>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class T>
+ void operator()(R& r, T const& what, T const& with) const
+ {
+ std::replace(detail::begin_(r), detail::end_(r), what, with);
+ }
+ };
+
+ struct replace_if
+ {
+ template<class R, class P, class T>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class P, class T>
+ void operator()(R& r, P p, T const& with) const
+ {
+ std::replace_if(detail::begin_(r), detail::end_(r), p, with);
+ }
+ };
+
+ struct replace_copy
+ {
+ template<class R, class O, class T, class T2>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R, class O, class T>
+ typename result<R,O,T,T>::type
+ operator()(R& r, O o, T const& what, T const& with) const
+ {
+ return std::replace_copy(detail::begin_(r), detail::end_(r), o, what, with);
+ }
+ };
+
+ struct replace_copy_if
+ {
+ template<class R, class O, class P, class T>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R, class O, class P, class T>
+ typename result<R,O,P,T>::type
+ operator()(R& r, O o, P p, T const& with) const
+ {
+ return std::replace_copy_if(detail::begin_(r), detail::end_(r), o, p, with);
+ }
+ };
+
+ struct fill
+ {
+ template<class R, class T>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class T>
+ void operator()(R& r, T const& x) const
+ {
+ std::fill(detail::begin_(r), detail::end_(r), x);
+ }
+ };
+
+ struct fill_n
+ {
+ template<class R, class N, class T>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class N, class T>
+ void operator()(R& r, N n, T const& x) const
+ {
+ std::fill_n(detail::begin_(r), n, x);
+ }
+ };
+
+ struct generate
+ {
+ template<class R, class G>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class G>
+ void operator()(R& r, G g) const
+ {
+ std::generate(detail::begin_(r), detail::end_(r), g);
+ }
+ };
+
+ struct generate_n
+ {
+ template<class R, class N, class G>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class N, class G>
+ void operator()(R& r, N n, G g) const
+ {
+ std::generate_n(detail::begin_(r), n, g);
+ }
+ };
+
+ struct remove
+ {
+ template<class R, class T>
+ struct result : range_result_iterator<R>
+ {
+ };
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& x, mpl::true_) const
+ {
+ r.remove(x);
+ return detail::end_(r);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type execute(R& r, T const& x, mpl::false_) const
+ {
+ return std::remove(detail::begin_(r), detail::end_(r), x);
+ }
+
+ template<class R, class T>
+ typename result<R, T>::type operator()(R& r, T const& x) const
+ {
+ return execute(r, x, has_remove<R>());
+ }
+ };
+
+ struct remove_if
+ {
+ template<class R, class P>
+ struct result : range_result_iterator<R>
+ {
+ };
+
+ template<class R, class P>
+ typename result<R, P>::type execute(R& r, P p, mpl::true_) const
+ {
+ r.remove_if(p);
+ return detail::end_(r);
+ }
+
+ template<class R, class P>
+ typename result<R, P>::type execute(R& r, P p, mpl::false_) const
+ {
+ return std::remove_if(detail::begin_(r), detail::end_(r), p);
+ }
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return execute(r, p, has_remove_if<R>());
+ }
+ };
+
+ struct remove_copy
+ {
+ template<class R, class O, class T>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R, class O, class T>
+ typename result<R,O,T>::type
+ operator()(R& r, O o, T const& x) const
+ {
+ return std::remove_copy(detail::begin_(r), detail::end_(r), o, x);
+ }
+ };
+
+ struct remove_copy_if
+ {
+ template<class R, class O, class P>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R, class O, class P>
+ typename result<R,O,P>::type
+ operator()(R& r, O o, P p) const
+ {
+ return std::remove_copy_if(detail::begin_(r), detail::end_(r), o, p);
+ }
+ };
+
+ struct unique
+ {
+ template<class R, class P = void>
+ struct result : range_result_iterator<R>
+ {
+ };
+
+ template<class R>
+ typename result<R>::type execute(R& r, mpl::true_) const
+ {
+ r.unique();
+ return detail::end_(r);
+ }
+
+ template<class R>
+ typename result<R>::type execute(R& r, mpl::false_) const
+ {
+ return std::unique(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R>
+ typename result<R>::type operator()(R& r) const
+ {
+ return execute(r, has_unique<R>());
+ }
+
+
+ template<class R, class P>
+ typename result<R>::type execute(R& r, P p, mpl::true_) const
+ {
+ r.unique(p);
+ return detail::end_(r);
+ }
+
+ template<class R, class P>
+ typename result<R, P>::type execute(R& r, P p, mpl::false_) const
+ {
+ return std::unique(detail::begin_(r), detail::end_(r), p);
+ }
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return execute(r, p, has_unique<R>());
+ }
+ };
+
+ struct unique_copy
+ {
+ template<class R, class O, class P = void>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R, class O>
+ typename result<R, O>::type operator()(R& r, O o) const
+ {
+ return std::unique_copy(
+ detail::begin_(r)
+ , detail::end_(r)
+ , o
+ );
+ }
+
+ template<class R, class O, class P>
+ typename result<R, O, P>::type operator()(R& r, O o, P p) const
+ {
+ return std::unique_copy(
+ detail::begin_(r)
+ , detail::end_(r)
+ , o
+ , p
+ );
+ }
+ };
+
+ struct reverse
+ {
+ template<class R>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R>
+ void execute(R& r, mpl::true_) const
+ {
+ r.reverse();
+ }
+
+ template<class R>
+ void execute(R& r, mpl::false_) const
+ {
+ std::reverse(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R>
+ void operator()(R& r) const
+ {
+ execute(r, has_reverse<R>());
+ }
+ };
+
+ struct reverse_copy
+ {
+ template<class R, class O>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R, class O>
+ typename result<R, O>::type operator()(R& r, O o) const
+ {
+ return std::reverse_copy(
+ detail::begin_(r)
+ , detail::end_(r)
+ , o
+ );
+ }
+ };
+
+ struct rotate
+ {
+ template<class R, class M>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class M>
+ void operator()(R& r, M m) const
+ {
+ std::rotate(
+ detail::begin_(r)
+ , m
+ , detail::end_(r)
+ );
+ }
+ };
+
+ struct rotate_copy
+ {
+ template<class R, class M, class O>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R, class M, class O>
+ typename result<R, M, O>::type operator()(R& r, M m, O o) const
+ {
+ return std::rotate_copy(
+ detail::begin_(r)
+ , m
+ , detail::end_(r)
+ , o
+ );
+ }
+ };
+
+ struct random_shuffle
+ {
+ template<class R, class G = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R>
+ void operator()(R& r) const
+ {
+ return std::random_shuffle(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class G>
+ void operator()(R& r, G g) const
+ {
+ return std::random_shuffle(detail::begin_(r), detail::end_(r), g);
+ }
+ };
+
+ struct partition
+ {
+ template<class R, class P>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return std::partition(detail::begin_(r), detail::end_(r), p);
+ }
+ };
+
+ struct stable_partition
+ {
+ template<class R, class P>
+ struct result : range_result_iterator<R>
+ {};
+
+ template<class R, class P>
+ typename result<R, P>::type operator()(R& r, P p) const
+ {
+ return std::stable_partition(detail::begin_(r), detail::end_(r), p);
+ }
+ };
+
+ struct sort
+ {
+ template<class R, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R>
+ void execute(R& r, mpl::true_) const
+ {
+ r.sort();
+ }
+
+ template<class R>
+ void execute(R& r, mpl::false_) const
+ {
+ std::sort(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R>
+ void operator()(R& r) const
+ {
+ execute(r, has_sort<R>());
+ }
+
+ template<class R, class C>
+ void execute(R& r, C c, mpl::true_) const
+ {
+ r.sort(c);
+ }
+
+ template<class R, class C>
+ void execute(R& r, C c, mpl::false_) const
+ {
+ std::sort(detail::begin_(r), detail::end_(r), c);
+ }
+
+ template<class R, class C>
+ void operator()(R& r, C c) const
+ {
+ execute(r, c, has_sort<R>());
+ }
+ };
+
+ struct stable_sort
+ {
+ template<class R, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R>
+ void operator()(R& r) const
+ {
+ std::stable_sort(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class C>
+ void operator()(R& r, C c) const
+ {
+ std::stable_sort(detail::begin_(r), detail::end_(r), c);
+ }
+ };
+
+ struct partial_sort
+ {
+ template<class R, class M, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class M>
+ void operator()(R& r, M m) const
+ {
+ std::partial_sort(detail::begin_(r), m, detail::end_(r));
+ }
+
+ template<class R, class M, class C>
+ void operator()(R& r, M m, C c) const
+ {
+ std::partial_sort(detail::begin_(r), m, detail::end_(r), c);
+ }
+ };
+
+ struct partial_sort_copy
+ {
+ template<class R1, class R2, class C = void>
+ struct result : range_result_iterator<R2>
+ {};
+
+ template<class R1, class R2>
+ typename result<R1, R2>::type operator()(R1& r1, R2& r2) const
+ {
+ return std::partial_sort_copy(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ );
+ }
+
+ template<class R1, class R2, class C>
+ typename result<R1, R2>::type operator()(R1& r1, R2& r2, C c) const
+ {
+ return std::partial_sort_copy(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , c
+ );
+ }
+ };
+
+ struct nth_element
+ {
+ template<class R, class N, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class N>
+ void operator()(R& r, N n) const
+ {
+ return std::nth_element(detail::begin_(r), n, detail::end_(r));
+ }
+
+ template<class R, class N, class C>
+ void operator()(R& r, N n, C c) const
+ {
+ return std::nth_element(detail::begin_(r), n, detail::end_(r), c);
+ }
+ };
+
+ struct merge
+ {
+ template<class R1, class R2, class O, class C = void>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R1, class R2, class O>
+ typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
+ {
+ return std::merge(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ );
+ }
+
+ template<class R1, class R2, class O, class C>
+ typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
+ {
+ return std::merge(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ , c
+ );
+ }
+ };
+
+ struct inplace_merge
+ {
+ template<class R, class M, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R, class M>
+ void operator()(R& r, M m) const
+ {
+ return std::inplace_merge(detail::begin_(r), m, detail::end_(r));
+ }
+
+ template<class R, class M, class C>
+ void operator()(R& r, M m, C c) const
+ {
+ return std::inplace_merge(detail::begin_(r), m, detail::end_(r), c);
+ }
+ };
+
+ struct next_permutation
+ {
+ template<class R, class C = void>
+ struct result
+ {
+ typedef bool type;
+ };
+
+ template<class R>
+ bool operator()(R& r) const
+ {
+ return std::next_permutation(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class C>
+ bool operator()(R& r, C c) const
+ {
+ return std::next_permutation(detail::begin_(r), detail::end_(r), c);
+ }
+ };
+
+ struct prev_permutation
+ {
+ template<class R, class C = void>
+ struct result
+ {
+ typedef bool type;
+ };
+
+ template<class R>
+ bool operator()(R& r) const
+ {
+ return std::prev_permutation(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class C>
+ bool operator()(R& r, C c) const
+ {
+ return std::prev_permutation(detail::begin_(r), detail::end_(r), c);
+ }
+ };
+
+
+ struct inner_product
+ {
+ template<class R, class I, class T, class C1 = void, class C2 = void>
+ struct result
+ {
+ typedef T type;
+ };
+
+ template<class R, class I, class T>
+ typename result<R,I,T>::type
+ operator()(R& r, I i, T t) const
+ {
+ return std::inner_product(
+ detail::begin_(r), detail::end_(r), i, t);
+ }
+
+ template<class R, class I, class T, class C1, class C2>
+ typename result<R,I,T,C1,C2>::type
+ operator()(R& r, I i, T t, C1 c1, C2 c2) const
+ {
+ return std::inner_product(
+ detail::begin_(r), detail::end_(r), i,
+ t, c1, c2);
+ }
+ };
+
+ struct partial_sum
+ {
+ template<class R, class I, class C = void>
+ struct result
+ : detail::decay_array<I>
+ {};
+
+ template<class R, class I>
+ typename result<R,I>::type
+ operator()(R& r, I i) const
+ {
+ return std::partial_sum(
+ detail::begin_(r), detail::end_(r), i);
+ }
+
+ template<class R, class I, class C>
+ typename result<R,I,C>::type
+ operator()(R& r, I i, C c) const
+ {
+ return std::partial_sum(
+ detail::begin_(r), detail::end_(r), i, c);
+ }
+ };
+
+ struct adjacent_difference
+ {
+ template<class R, class I, class C = void>
+ struct result
+ : detail::decay_array<I>
+ {};
+
+ template<class R, class I>
+ typename result<R,I>::type
+ operator()(R& r, I i) const
+ {
+ return std::adjacent_difference(
+ detail::begin_(r), detail::end_(r), i);
+ }
+
+ template<class R, class I, class C>
+ typename result<R,I,C>::type
+ operator()(R& r, I i, C c) const
+ {
+ return std::adjacent_difference(
+ detail::begin_(r), detail::end_(r), i, c);
+ }
+ };
+
+ struct push_heap
+ {
+ template<class R, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R>
+ void operator()(R& r) const
+ {
+ std::push_heap(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class C>
+ void operator()(R& r, C c) const
+ {
+ std::push_heap(detail::begin_(r), detail::end_(r), c);
+ }
+ };
+
+ struct pop_heap
+ {
+ template<class R, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R>
+ void operator()(R& r) const
+ {
+ std::pop_heap(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class C>
+ void operator()(R& r, C c) const
+ {
+ std::pop_heap(detail::begin_(r), detail::end_(r), c);
+ }
+ };
+
+ struct make_heap
+ {
+ template<class R, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R>
+ void operator()(R& r) const
+ {
+ std::make_heap(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class C>
+ void operator()(R& r, C c) const
+ {
+ std::make_heap(detail::begin_(r), detail::end_(r), c);
+ }
+ };
+
+ struct sort_heap
+ {
+ template<class R, class C = void>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template<class R>
+ void operator()(R& r) const
+ {
+ std::sort_heap(detail::begin_(r), detail::end_(r));
+ }
+
+ template<class R, class C>
+ void operator()(R& r, C c) const
+ {
+ std::sort_heap(detail::begin_(r), detail::end_(r), c);
+ }
+ };
+
+ struct set_union
+ {
+ template<class R1, class R2, class O, class C = void>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R1, class R2, class O>
+ typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
+ {
+ return std::set_union(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ );
+ }
+
+ template<class R1, class R2, class O, class C>
+ typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
+ {
+ return std::set_union(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ , c
+ );
+ }
+ };
+
+ struct set_intersection
+ {
+ template<class R1, class R2, class O, class C = void>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R1, class R2, class O>
+ typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
+ {
+ return std::set_intersection(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ );
+ }
+
+ template<class R1, class R2, class O, class C>
+ typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
+ {
+ return std::set_intersection(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ , c
+ );
+ }
+ };
+
+ struct set_difference
+ {
+ template<class R1, class R2, class O, class C = void>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R1, class R2, class O>
+ typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
+ {
+ return std::set_difference(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ );
+ }
+
+ template<class R1, class R2, class O, class C>
+ typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
+ {
+ return std::set_difference(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ , c
+ );
+ }
+ };
+
+ struct set_symmetric_difference
+ {
+ template<class R1, class R2, class O, class C = void>
+ struct result
+ : detail::decay_array<O>
+ {};
+
+ template<class R1, class R2, class O>
+ typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
+ {
+ return std::set_symmetric_difference(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ );
+ }
+
+ template<class R1, class R2, class O, class C>
+ typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
+ {
+ return std::set_symmetric_difference(
+ detail::begin_(r1), detail::end_(r1)
+ , detail::begin_(r2), detail::end_(r2)
+ , o
+ , c
+ );
+ }
+ };
+
+}}} // boost::phoenix::impl
+
+namespace boost { namespace phoenix
+{
+ function<impl::swap> const swap = impl::swap();
+ function<impl::copy> const copy = impl::copy();
+ function<impl::copy_backward> const copy_backward = impl::copy_backward();
+ function<impl::transform> const transform = impl::transform();
+ function<impl::replace> const replace = impl::replace();
+ function<impl::replace_if> const replace_if = impl::replace_if();
+ function<impl::replace_copy> const replace_copy = impl::replace_copy();
+ function<impl::replace_copy_if> const replace_copy_if = impl::replace_copy_if();
+ function<impl::fill> const fill = impl::fill();
+ function<impl::fill_n> const fill_n = impl::fill_n();
+ function<impl::generate> const generate = impl::generate();
+ function<impl::generate_n> const generate_n = impl::generate_n();
+ function<impl::remove> const remove = impl::remove();
+ function<impl::remove_if> const remove_if = impl::remove_if();
+ function<impl::remove_copy> const remove_copy = impl::remove_copy();
+ function<impl::remove_copy_if> const remove_copy_if = impl::remove_copy_if();
+ function<impl::unique> const unique = impl::unique();
+ function<impl::unique_copy> const unique_copy = impl::unique_copy();
+ function<impl::reverse> const reverse = impl::reverse();
+ function<impl::reverse_copy> const reverse_copy = impl::reverse_copy();
+ function<impl::rotate> const rotate = impl::rotate();
+ function<impl::rotate_copy> const rotate_copy = impl::rotate_copy();
+ function<impl::random_shuffle> const random_shuffle = impl::random_shuffle();
+ function<impl::partition> const partition = impl::partition();
+ function<impl::stable_partition> const stable_partition = impl::stable_partition();
+ function<impl::sort> const sort = impl::sort();
+ function<impl::stable_sort> const stable_sort = impl::stable_sort();
+ function<impl::partial_sort> const partial_sort = impl::partial_sort();
+ function<impl::partial_sort_copy> const partial_sort_copy = impl::partial_sort_copy();
+ function<impl::nth_element> const nth_element = impl::nth_element();
+ function<impl::merge> const merge = impl::merge();
+ function<impl::inplace_merge> const inplace_merge = impl::inplace_merge();
+ function<impl::next_permutation> const next_permutation = impl::next_permutation();
+ function<impl::prev_permutation> const prev_permutation = impl::prev_permutation();
+ function<impl::inner_product> const inner_product = impl::inner_product();
+ function<impl::partial_sum> const partial_sum = impl::partial_sum();
+ function<impl::adjacent_difference> const adjacent_difference = impl::adjacent_difference();
+ function<impl::push_heap> const push_heap = impl::push_heap();
+ function<impl::pop_heap> const pop_heap = impl::pop_heap();
+ function<impl::make_heap> const make_heap = impl::make_heap();
+ function<impl::sort_heap> const sort_heap = impl::sort_heap();
+ function<impl::set_union> const set_union = impl::set_union();
+ function<impl::set_intersection> const set_intersection = impl::set_intersection();
+ function<impl::set_difference> const set_difference = impl::set_difference();
+ function<impl::set_symmetric_difference> const set_symmetric_difference = impl::set_symmetric_difference();
+}}
+
+#endif
diff --git a/boost/spirit/home/phoenix/stl/container.hpp b/boost/spirit/home/phoenix/stl/container.hpp
new file mode 100644
index 0000000000..6798fcb434
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/container.hpp
@@ -0,0 +1,13 @@
+/*=============================================================================
+ Copyright (c) 2004 Angus Leeming
+ Copyright (c) 2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STL_CONTAINER_HPP
+#define PHOENIX_STL_CONTAINER_HPP
+
+#include <boost/spirit/home/phoenix/stl/container/container.hpp>
+
+#endif // PHOENIX_STL_CONTAINER_HPP
diff --git a/boost/spirit/home/phoenix/stl/container/container.hpp b/boost/spirit/home/phoenix/stl/container/container.hpp
new file mode 100644
index 0000000000..7e043d1d5d
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/container/container.hpp
@@ -0,0 +1,706 @@
+/*=============================================================================
+ Copyright (c) 2004 Angus Leeming
+ Copyright (c) 2004 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_STL_CONTAINER_CONTAINER_HPP
+#define PHOENIX_STL_CONTAINER_CONTAINER_HPP
+
+#include <boost/spirit/home/phoenix/stl/container/detail/container.hpp>
+#include <boost/spirit/home/phoenix/function/function.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_const.hpp>
+
+namespace boost { namespace phoenix
+{
+///////////////////////////////////////////////////////////////////////////////
+//
+// STL container member functions
+//
+// Lazy functions for STL container member functions
+//
+// These functions provide a mechanism for the lazy evaluation of the
+// public member functions of the STL containers. For an overview of
+// what is meant by 'lazy evaluation', see the comments in operators.hpp
+// and functions.hpp.
+//
+// Lazy functions are provided for all of the member functions of the
+// following containers:
+//
+// deque - list - map - multimap - vector.
+//
+// Indeed, should *your* class have member functions with the same names
+// and signatures as those listed below, then it will automatically be
+// supported. To summarize, lazy functions are provided for member
+// functions:
+//
+// assign - at - back - begin - capacity - clear - empty - end -
+// erase - front - get_allocator - insert - key_comp - max_size -
+// pop_back - pop_front - push_back - push_front - rbegin - rend -
+// reserve - resize . size - splice - value_comp.
+//
+// The lazy functions' names are the same as the corresponding member
+// function. Sample usage:
+//
+// "Normal" version "Lazy" version
+// ---------------- --------------
+// my_vector.at(5) phoenix::at(arg1, 5)
+// my_list.size() phoenix::size(arg1)
+// my_vector1.swap(my_vector2) phoenix::swap(arg1, arg2)
+//
+// Notice that member functions with names that clash with a
+// function in stl algorithms are absent. This will be provided
+// in Phoenix's algorithm module.
+//
+// No support is provided here for lazy versions of operator+=,
+// operator[] etc. Such operators are not specific to STL containers and
+// lazy versions can therefore be found in operators.hpp.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Lazy member function implementaions.
+//
+// The structs below provide the guts of the implementation. Thereafter,
+// the corresponding lazy function itself is simply:
+//
+// function<stl::assign> const assign = stl::assign();
+//
+// The structs provide a nested "result" class template whose
+// "type" typedef enables the lazy function to ascertain the type
+// to be returned when it is invoked.
+//
+// They also provide operator() member functions with signatures
+// corresponding to those of the underlying member function of
+// the STL container.
+//
+///////////////////////////////////////////////////////////////////////////////
+ namespace stl
+ {
+ struct assign
+ {
+ template <
+ typename C
+ , typename Arg1 = fusion::void_
+ , typename Arg2 = fusion::void_
+ , typename Arg3 = fusion::void_
+ >
+ struct result
+ {
+ typedef typename add_reference<C>::type type;
+ };
+
+ template <typename C, typename Arg1>
+ C& operator()(C& c, Arg1 const& arg1) const
+ {
+ c.assign(arg1);
+ return c;
+ }
+
+ template <typename C, typename Arg1, typename Arg2>
+ C& operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
+ {
+ c.assign(arg1, arg2);
+ return c;
+ }
+
+ template <typename C, typename Arg1, typename Arg2, typename Arg3>
+ C& operator()(
+ C& c
+ , Arg1 const& arg1
+ , Arg2 const& arg2
+ , Arg3 const& arg3) const
+ {
+ return c.assign(arg1, arg2, arg3);
+ }
+ };
+
+ struct at
+ {
+ template <typename C, typename Index>
+ struct result
+ {
+ typedef typename const_qualified_reference_of<C>::type type;
+ };
+
+ template <typename C, typename Index>
+ typename result<C, Index>::type
+ operator()(C& c, Index const& i) const
+ {
+ return c.at(i);
+ }
+ };
+
+ struct back
+ {
+ template <typename C>
+ struct result
+ {
+ typedef
+ typename const_qualified_reference_of<C>::type
+ type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C& c) const
+ {
+ return c.back();
+ }
+ };
+
+ struct begin
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename const_qualified_iterator_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C& c) const
+ {
+ return c.begin();
+ }
+ };
+
+ struct capacity
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename size_type_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C const& c) const
+ {
+ return c.capacity();
+ }
+ };
+
+ struct clear
+ {
+ template <typename C>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename C>
+ void operator()(C& c) const
+ {
+ return c.clear();
+ }
+ };
+
+ struct empty
+ {
+ template <typename C>
+ struct result
+ {
+ typedef bool type;
+ };
+
+ template <typename C>
+ bool operator()(C const& c) const
+ {
+ return c.empty();
+ }
+ };
+
+ struct end
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename const_qualified_iterator_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C& c) const
+ {
+ return c.end();
+ }
+ };
+
+ struct erase
+ {
+ // This mouthful can differentiate between the generic erase
+ // functions (Container == std::deque, std::list, std::vector) and
+ // that specific to the two map-types, std::map and std::multimap.
+ //
+ // where C is a std::deque, std::list, std::vector:
+ //
+ // 1) iterator C::erase(iterator where);
+ // 2) iterator C::erase(iterator first, iterator last);
+ //
+ // where M is a std::map or std::multimap:
+ //
+ // 3) size_type M::erase(const Key& keyval);
+ // 4) void M::erase(iterator where);
+ // 5) void M::erase(iterator first, iterator last);
+
+ template <typename C, typename Arg1, typename Arg2 = fusion::void_>
+ struct result
+ {
+ // BOOST_MSVC #if branch here in map_erase_result non-
+ // standard behavior. The return type should be void but
+ // VC7.1 prefers to return iterator_of<C>. As a result,
+ // VC7.1 complains of error C2562:
+ // boost::phoenix::stl::erase::operator() 'void' function
+ // returning a value. Oh well... :*
+
+ typedef
+ boost::mpl::eval_if<
+ boost::is_same<Arg1, typename iterator_of<C>::type>
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1500)
+ , iterator_of<C>
+#else
+ , boost::mpl::identity<void>
+#endif
+ , size_type_of<C>
+ >
+ map_erase_result;
+
+ typedef typename
+ boost::mpl::eval_if<
+ has_mapped_type<C>
+ , map_erase_result
+ , iterator_of<C>
+ >::type
+ type;
+ };
+
+ template <typename C, typename Arg1>
+ typename result<C, Arg1>::type
+ operator()(C& c, Arg1 const& arg1) const
+ {
+ return c.erase(arg1);
+ }
+
+ template <typename C, typename Arg1, typename Arg2>
+ typename result<C, Arg1, Arg2>::type
+ operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
+ {
+ return c.erase(arg1, arg2);
+ }
+ };
+
+ struct front
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename const_qualified_reference_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C& c) const
+ {
+ return c.front();
+ }
+ };
+
+ struct get_allocator
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename allocator_type_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C const& c) const
+ {
+ return c.get_allocator();
+ }
+ };
+
+ struct insert
+ {
+ // This mouthful can differentiate between the generic insert
+ // functions (Container == deque, list, vector) and those
+ // specific to the two map-types, std::map and std::multimap.
+ //
+ // where C is a std::deque, std::list, std::vector:
+ //
+ // 1) iterator C::insert(iterator where, value_type value);
+ // 2) void C::insert(
+ // iterator where, size_type count, value_type value);
+ // 3) template <typename Iter>
+ // void C::insert(iterator where, Iter first, Iter last);
+ //
+ // where M is a std::map and MM is a std::multimap:
+ //
+ // 4) pair<iterator, bool> M::insert(value_type const&);
+ // 5) iterator MM::insert(value_type const&);
+ //
+ // where M is a std::map or std::multimap:
+ //
+ // 6) template <typename Iter>
+ // void M::insert(Iter first, Iter last);
+
+ template <
+ typename C
+ , typename Arg1
+ , typename Arg2 = fusion::void_
+ , typename Arg3 = fusion::void_
+ >
+ class result
+ {
+ struct pair_iterator_bool
+ {
+ typedef typename std::pair<typename C::iterator, bool> type;
+ };
+
+ typedef
+ boost::mpl::eval_if<
+ map_insert_returns_pair<C>
+ , pair_iterator_bool
+ , iterator_of<C>
+ >
+ choice_1;
+
+ typedef
+ boost::mpl::eval_if<
+ boost::mpl::and_<
+ boost::is_same<Arg3, fusion::void_>
+ , boost::mpl::not_<boost::is_same<Arg1, Arg2> > >
+ , iterator_of<C>
+ , boost::mpl::identity<void>
+ >
+ choice_2;
+
+ public:
+
+ typedef typename
+ boost::mpl::eval_if<
+ boost::is_same<Arg2, fusion::void_>
+ , choice_1
+ , choice_2
+ >::type
+ type;
+ };
+
+ template <typename C, typename Arg1>
+ typename result<C, Arg1>::type
+ operator()(C& c, Arg1 const& arg1) const
+ {
+ return c.insert(arg1);
+ }
+
+ template <typename C, typename Arg1, typename Arg2>
+ typename result<C, Arg1, Arg2>::type
+ operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
+ {
+ return c.insert(arg1, arg2);
+ }
+
+ template <typename C, typename Arg1, typename Arg2, typename Arg3>
+ typename result<C, Arg1, Arg2, Arg3>::type
+ operator()(
+ C& c, Arg1 const& arg1, Arg2 const& arg2, Arg3 const& arg3) const
+ {
+ return c.insert(arg1, arg2, arg3);
+ }
+ };
+
+ struct key_comp
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename key_compare_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C const& c) const
+ {
+ return c.key_comp();
+ }
+ };
+
+ struct max_size
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename size_type_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C const& c) const
+ {
+ return c.max_size();
+ }
+ };
+
+ struct pop_back
+ {
+ template <typename C>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename C>
+ void operator()(C& c) const
+ {
+ return c.pop_back();
+ }
+ };
+
+ struct pop_front
+ {
+ template <typename C>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename C>
+ void operator()(C& c) const
+ {
+ return c.pop_front();
+ }
+ };
+
+ struct push_back
+ {
+ template <typename C, typename Arg>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename C, typename Arg>
+ void operator()(C& c, Arg const& data) const
+ {
+ return c.push_back(data);
+ }
+ };
+
+ struct push_front
+ {
+ template <typename C, typename Arg>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename C, typename Arg>
+ void operator()(C& c, Arg const& data) const
+ {
+ return c.push_front(data);
+ }
+ };
+
+ struct rbegin
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename
+ const_qualified_reverse_iterator_of<C>::type
+ type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C& c) const
+ {
+ return c.rbegin();
+ }
+ };
+
+ struct rend
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename
+ const_qualified_reverse_iterator_of<C>::type
+ type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C& c) const
+ {
+ return c.rend();
+ }
+ };
+
+ struct reserve
+ {
+
+ template <typename C, typename Arg>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename C, typename Arg>
+ void operator()(C& c, Arg const& count) const
+ {
+ return c.reserve(count);
+ }
+ };
+
+ struct resize
+ {
+ template <typename C, typename Arg1, typename Arg2 = fusion::void_>
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename C, typename Arg1>
+ void operator()(C& c, Arg1 const& arg1) const
+ {
+ return c.resize(arg1);
+ }
+
+ template <typename C, typename Arg1, typename Arg2>
+ void operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
+ {
+ return c.resize(arg1, arg2);
+ }
+ };
+
+ struct size
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename size_type_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C const& c) const
+ {
+ return c.size();
+ }
+ };
+
+ struct splice
+ {
+ template <
+ typename C
+ , typename Arg1
+ , typename Arg2
+ , typename Arg3 = fusion::void_
+ , typename Arg4 = fusion::void_
+ >
+ struct result
+ {
+ typedef void type;
+ };
+
+ template <typename C, typename Arg1, typename Arg2>
+ void operator()(C& c, Arg1 const& arg1, Arg2& arg2) const
+ {
+ c.splice(arg1, arg2);
+ }
+
+ template <
+ typename C
+ , typename Arg1
+ , typename Arg2
+ , typename Arg3
+ >
+ void operator()(
+ C& c
+ , Arg1 const& arg1
+ , Arg2& arg2
+ , Arg3 const& arg3
+ ) const
+ {
+ c.splice(arg1, arg2, arg3);
+ }
+
+ template <
+ typename C
+ , typename Arg1
+ , typename Arg2
+ , typename Arg3
+ , typename Arg4
+ >
+ void operator()(
+ C& c
+ , Arg1 const& arg1
+ , Arg2& arg2
+ , Arg3 const& arg3
+ , Arg4 const& arg4
+ ) const
+ {
+ c.splice(arg1, arg2, arg3, arg4);
+ }
+ };
+
+ struct value_comp
+ {
+ template <typename C>
+ struct result
+ {
+ typedef typename value_compare_of<C>::type type;
+ };
+
+ template <typename C>
+ typename result<C>::type
+ operator()(C const& c) const
+ {
+ return c.value_comp();
+ }
+ };
+
+} // namespace stl
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The lazy functions themselves.
+//
+///////////////////////////////////////////////////////////////////////////////
+function<stl::assign> const assign = stl::assign();
+function<stl::at> const at = stl::at();
+function<stl::back> const back = stl::back();
+function<stl::begin> const begin = stl::begin();
+function<stl::capacity> const capacity = stl::capacity();
+function<stl::clear> const clear = stl::clear();
+function<stl::empty> const empty = stl::empty();
+function<stl::end> const end = stl::end();
+function<stl::erase> const erase = stl::erase();
+function<stl::front> const front = stl::front();
+function<stl::get_allocator> const get_allocator = stl::get_allocator();
+function<stl::insert> const insert = stl::insert();
+function<stl::key_comp> const key_comp = stl::key_comp();
+function<stl::max_size> const max_size = stl::max_size();
+function<stl::pop_back> const pop_back = stl::pop_back();
+function<stl::pop_front> const pop_front = stl::pop_front();
+function<stl::push_back> const push_back = stl::push_back();
+function<stl::push_front> const push_front = stl::push_front();
+function<stl::rbegin> const rbegin = stl::rbegin();
+function<stl::rend> const rend = stl::rend();
+function<stl::reserve> const reserve = stl::reserve();
+function<stl::resize> const resize = stl::resize();
+function<stl::size> const size = stl::size();
+function<stl::splice> const splice = stl::splice();
+function<stl::value_comp> const value_comp = stl::value_comp();
+
+}} // namespace boost::phoenix
+
+#endif // PHOENIX_STL_CONTAINERS_HPP
diff --git a/boost/spirit/home/phoenix/stl/container/detail/container.hpp b/boost/spirit/home/phoenix/stl/container/detail/container.hpp
new file mode 100644
index 0000000000..eecf68dbaf
--- /dev/null
+++ b/boost/spirit/home/phoenix/stl/container/detail/container.hpp
@@ -0,0 +1,173 @@
+/*=============================================================================
+ Copyright (c) 2004 Angus Leeming
+ Copyright (c) 2004 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_CONTAINER_DETAIL_CONTAINER_HPP
+#define PHOENIX_CONTAINER_DETAIL_CONTAINER_HPP
+
+#include <utility>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_const.hpp>
+
+namespace boost { namespace phoenix { namespace stl
+{
+///////////////////////////////////////////////////////////////////////////////
+//
+// Metafunctions "value_type_of", "key_type_of" etc.
+//
+// These metafunctions define a typedef "type" that returns the nested
+// type if it exists. If not then the typedef returns void.
+//
+// For example, "value_type_of<std::vector<int> >::type" is "int" whilst
+// "value_type_of<double>::type" is "void".
+//
+// I use a macro to define structs "value_type_of" etc simply to cut
+// down on the amount of code. The macro is #undef-ed immediately after
+// its final use.
+//
+/////////////////////////////////////////////////////////////////c//////////////
+#define MEMBER_TYPE_OF(MEMBER_TYPE) \
+ template <typename C> \
+ struct BOOST_PP_CAT(MEMBER_TYPE, _of) \
+ { \
+ typedef typename C::MEMBER_TYPE type; \
+ }
+
+ MEMBER_TYPE_OF(allocator_type);
+ MEMBER_TYPE_OF(const_iterator);
+ MEMBER_TYPE_OF(const_reference);
+ MEMBER_TYPE_OF(const_reverse_iterator);
+ MEMBER_TYPE_OF(container_type);
+ MEMBER_TYPE_OF(data_type);
+ MEMBER_TYPE_OF(iterator);
+ MEMBER_TYPE_OF(key_compare);
+ MEMBER_TYPE_OF(key_type);
+ MEMBER_TYPE_OF(reference);
+ MEMBER_TYPE_OF(reverse_iterator);
+ MEMBER_TYPE_OF(size_type);
+ MEMBER_TYPE_OF(value_compare);
+ MEMBER_TYPE_OF(value_type);
+
+#undef MEMBER_TYPE_OF
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Const-Qualified types.
+//
+// Many of the stl member functions have const and non-const
+// overloaded versions that return distinct types. For example:
+//
+// iterator begin();
+// const_iterator begin() const;
+//
+// The three class templates defined below,
+// const_qualified_reference_of, const_qualified_iterator_of
+// and const_qualified_reverse_iterator_of provide a means to extract
+// this return type automatically.
+//
+///////////////////////////////////////////////////////////////////////////////
+ template <typename C>
+ struct const_qualified_reference_of
+ {
+ typedef typename
+ boost::mpl::eval_if<
+ boost::is_const<C>
+ , const_reference_of<C>
+ , reference_of<C>
+ >::type
+ type;
+ };
+
+ template <typename C>
+ struct const_qualified_iterator_of
+ {
+ typedef typename
+ boost::mpl::eval_if<
+ boost::is_const<C>
+ , const_iterator_of<C>
+ , iterator_of<C>
+ >::type
+ type;
+ };
+
+ template <typename C>
+ struct const_qualified_reverse_iterator_of
+ {
+ typedef typename
+ boost::mpl::eval_if<
+ boost::is_const<C>
+ , const_reverse_iterator_of<C>
+ , reverse_iterator_of<C>
+ >::type
+ type;
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// has_mapped_type<C>
+//
+// Given a container C, determine if it is a map or multimap
+// by checking if it has a member type named "mapped_type".
+//
+///////////////////////////////////////////////////////////////////////////////
+ namespace stl_impl
+ {
+ struct one { char a[1]; };
+ struct two { char a[2]; };
+
+ template <typename C>
+ one has_mapped_type(typename C::mapped_type(*)());
+
+ template <typename C>
+ two has_mapped_type(...);
+ }
+
+ template <typename C>
+ struct has_mapped_type
+ : boost::mpl::bool_<
+ sizeof(stl_impl::has_mapped_type<C>(0)) == sizeof(stl_impl::one)
+ >
+ {};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// map_insert_returns_pair<C>
+//
+// Distinguish a map from a multimap by checking the return type
+// of its "insert" member function. A map returns a pair while
+// a multimap returns an iterator.
+//
+///////////////////////////////////////////////////////////////////////////////
+ namespace stl_impl
+ {
+ // Cool implementation of map_insert_returns_pair by Daniel Wallin.
+ // Thanks Daniel!!! I owe you a Pizza!
+
+ template<class A, class B>
+ one map_insert_returns_pair_check(std::pair<A,B> const&);
+
+ template <typename T>
+ two map_insert_returns_pair_check(T const&);
+
+ template <typename C>
+ struct map_insert_returns_pair
+ {
+ static typename C::value_type const& get;
+ BOOST_STATIC_CONSTANT(int,
+ value = sizeof(
+ map_insert_returns_pair_check(((C*)0)->insert(get))));
+ typedef boost::mpl::bool_<value == sizeof(one)> type;
+ };
+ }
+
+ template <typename C>
+ struct map_insert_returns_pair
+ : stl_impl::map_insert_returns_pair<C>::type {};
+
+}}} // namespace boost::phoenix::stl
+
+#endif // PHOENIX_STL_CONTAINER_TRAITS_HPP
diff --git a/boost/spirit/home/phoenix/version.hpp b/boost/spirit/home/phoenix/version.hpp
new file mode 100644
index 0000000000..c29baf8e47
--- /dev/null
+++ b/boost/spirit/home/phoenix/version.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2005-2008 Hartmut Kaiser
+ Copyright (c) 2005-2007 Joel de Guzman
+
+ Distributed under the 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 PHOENIX_VERSION_HPP
+#define PHOENIX_VERSION_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// This is the version of the library
+//
+///////////////////////////////////////////////////////////////////////////////
+#define BOOST_PHOENIX_VERSION 0x2000 // 2.0.0
+
+#endif
diff --git a/boost/spirit/home/qi.hpp b/boost/spirit/home/qi.hpp
new file mode 100644
index 0000000000..afdf1cb97c
--- /dev/null
+++ b/boost/spirit/home/qi.hpp
@@ -0,0 +1,31 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_QI_MARCH_04_2007_0852PM)
+#define BOOST_SPIRIT_QI_MARCH_04_2007_0852PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/action.hpp>
+#include <boost/spirit/home/qi/auto.hpp>
+#include <boost/spirit/home/qi/auxiliary.hpp>
+#include <boost/spirit/home/qi/char.hpp>
+#include <boost/spirit/home/qi/binary.hpp>
+#include <boost/spirit/home/qi/directive.hpp>
+#include <boost/spirit/home/qi/nonterminal.hpp>
+#include <boost/spirit/home/qi/numeric.hpp>
+#include <boost/spirit/home/qi/operator.hpp>
+#include <boost/spirit/home/qi/parse.hpp>
+#include <boost/spirit/home/qi/parse_attr.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/string.hpp>
+#include <boost/spirit/home/qi/what.hpp>
+#include <boost/spirit/home/qi/stream.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/action.hpp b/boost/spirit/home/qi/action.hpp
new file mode 100644
index 0000000000..d963b75771
--- /dev/null
+++ b/boost/spirit/home/qi/action.hpp
@@ -0,0 +1,16 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_ACTION_JANUARY_07_2007_1233PM)
+#define SPIRIT_ACTION_JANUARY_07_2007_1233PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/action/action.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/action/action.hpp b/boost/spirit/home/qi/action/action.hpp
new file mode 100644
index 0000000000..746dd84c1d
--- /dev/null
+++ b/boost/spirit/home/qi/action/action.hpp
@@ -0,0 +1,202 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_ACTION_JANUARY_07_2007_1128AM)
+#define SPIRIT_ACTION_JANUARY_07_2007_1128AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/context.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/action_dispatch.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ BOOST_PP_REPEAT(SPIRIT_ARGUMENTS_LIMIT, SPIRIT_USING_ARGUMENT, _)
+
+ template <typename Subject, typename Action>
+ struct action : unary_parser<action<Subject, Action> >
+ {
+ typedef Subject subject_type;
+ typedef Action action_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<Subject, Context, Iterator>
+ {};
+
+ action(Subject const& subject, Action f)
+ : subject(subject), f(f) {}
+
+#ifndef BOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr_) const
+ {
+ typedef typename attribute<Context, Iterator>::type attr_type;
+ typedef traits::make_attribute<attr_type, Attribute> make_attribute;
+
+ // create an attribute if one is not supplied
+ typedef traits::transform_attribute<
+ typename make_attribute::type, attr_type, domain> transform;
+
+ typename make_attribute::type made_attr = make_attribute::call(attr_);
+ typename transform::type attr = transform::pre(made_attr);
+
+ Iterator save = first;
+ if (subject.parse(first, last, context, skipper, attr))
+ {
+ // call the function, passing the attribute, the context.
+ // The client can return false to fail parsing.
+ if (traits::action_dispatch<Subject>()(f, attr, context))
+ {
+ // Do up-stream transformation, this integrates the results
+ // back into the original attribute value, if appropriate.
+ traits::post_transform(attr_, attr);
+ return true;
+ }
+
+ // reset iterators if semantic action failed the match
+ // retrospectively
+ first = save;
+ }
+ return false;
+ }
+#else
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ Iterator save = first;
+ if (subject.parse(first, last, context, skipper, attr)) // Use the attribute as-is
+ {
+ // call the function, passing the attribute, the context.
+ // The client can return false to fail parsing.
+ if (traits::action_dispatch<Subject>()(f, attr, context))
+ return true;
+
+ // reset iterators if semantic action failed the match
+ // retrospectively
+ first = save;
+ }
+ return false;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , unused_type) const
+ {
+ typedef typename attribute<Context, Iterator>::type attr_type;
+ typedef traits::make_attribute<attr_type, unused_type> make_attribute;
+
+ // synthesize the attribute since one is not supplied
+ typedef traits::transform_attribute<
+ typename make_attribute::type, attr_type, domain> transform;
+
+ typename make_attribute::type made_attr = make_attribute::call(unused_type());
+ typename transform::type attr = transform::pre(made_attr);
+
+ Iterator save = first;
+ if (subject.parse(first, last, context, skipper, attr))
+ {
+ // call the function, passing the attribute, the context.
+ // The client can return false to fail parsing.
+ if (traits::action_dispatch<Subject>()(f, attr, context))
+ return true;
+
+ // reset iterators if semantic action failed the match
+ // retrospectively
+ first = save;
+ }
+ return false;
+ }
+#endif
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ // the action is transparent (does not add any info)
+ return subject.what(context);
+ }
+
+ Subject subject;
+ Action f;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ action& operator= (action const&);
+ };
+}}}
+
+namespace boost { namespace spirit
+{
+ // Qi action meta-compiler
+ template <>
+ struct make_component<qi::domain, tag::action>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ remove_const<typename Elements::car_type>::type
+ subject_type;
+
+ typedef typename
+ remove_const<typename Elements::cdr_type::car_type>::type
+ action_type;
+
+ typedef qi::action<subject_type, action_type> type;
+ };
+
+ template <typename Elements>
+ typename result<make_component(Elements, unused_type)>::type
+ operator()(Elements const& elements, unused_type) const
+ {
+ typename result<make_component(Elements, unused_type)>::type
+ result(elements.car, elements.cdr.car);
+ return result;
+ }
+ };
+}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Action>
+ struct has_semantic_action<qi::action<Subject, Action> >
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Action, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::action<Subject, Action>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/auto.hpp b/boost/spirit/home/qi/auto.hpp
new file mode 100644
index 0000000000..afc7667b8f
--- /dev/null
+++ b/boost/spirit/home/qi/auto.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_AUTO_NOV_29_2009_0335PM)
+#define BOOST_SPIRIT_AUTO_NOV_29_2009_0335PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auto/auto.hpp>
+#include <boost/spirit/home/qi/detail/parse_auto.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/auto/auto.hpp b/boost/spirit/home/qi/auto/auto.hpp
new file mode 100644
index 0000000000..59d1ab3825
--- /dev/null
+++ b/boost/spirit/home/qi/auto/auto.hpp
@@ -0,0 +1,90 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_QI_AUTO_NOV_29_2009_0336PM)
+#define BOOST_SPIRIT_QI_AUTO_NOV_29_2009_0336PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/detail/hold_any.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/auto/create_parser.hpp>
+#include <boost/mpl/bool.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<qi::domain, tag::auto_> // enables auto_
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::auto_;
+#endif
+ using spirit::auto_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct auto_parser
+ : parser<auto_parser<Modifiers> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef spirit::hold_any type;
+ };
+
+ auto_parser(Modifiers const& modifiers)
+ : modifiers_(modifiers) {}
+
+ template <typename Iterator, typename Context, typename Skipper
+ , typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, Attribute& attr) const
+ {
+ return compile<qi::domain>(create_parser<Attribute>(), modifiers_)
+ .parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("auto_");
+ }
+
+ Modifiers modifiers_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::auto_, Modifiers>
+ {
+ typedef auto_parser<Modifiers> result_type;
+
+ result_type operator()(unused_type, Modifiers const& modifiers) const
+ {
+ return result_type(modifiers);
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/auto/create_parser.hpp b/boost/spirit/home/qi/auto/create_parser.hpp
new file mode 100644
index 0000000000..bca492f713
--- /dev/null
+++ b/boost/spirit/home/qi/auto/create_parser.hpp
@@ -0,0 +1,45 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_QI_CREATE_NOV_21_2009_0444PM)
+#define BOOST_SPIRIT_QI_CREATE_NOV_21_2009_0444PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auto/meta_create.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace result_of
+{
+ template <typename T>
+ struct create_parser
+ : spirit::traits::meta_create<qi::domain, T> {};
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ // Main API function for parser creation from data type
+ template <typename T>
+ typename result_of::create_parser<T>::type
+ create_parser()
+ {
+ return spirit::traits::meta_create<qi::domain, T>::call();
+ }
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ // Meta function returning true if create_parser does return a valid
+ // parser for the given type T.
+ template <typename T>
+ struct create_parser_exists
+ : meta_create_exists<qi::domain, T> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/auto/meta_create.hpp b/boost/spirit/home/qi/auto/meta_create.hpp
new file mode 100644
index 0000000000..334fd12448
--- /dev/null
+++ b/boost/spirit/home/qi/auto/meta_create.hpp
@@ -0,0 +1,274 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_QI_META_CREATE_NOV_21_2009_0432PM)
+#define BOOST_SPIRIT_QI_META_CREATE_NOV_21_2009_0432PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/auto/meta_create.hpp>
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/variant.hpp>
+#include <boost/optional.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // compatible STL containers
+ template <typename Container>
+ struct meta_create_container
+ {
+ typedef make_unary_proto_expr<
+ typename Container::value_type
+ , proto::tag::dereference, qi::domain
+ > make_proto_expr;
+
+ typedef typename make_proto_expr::type type;
+
+ static type call()
+ {
+ return make_proto_expr::call();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Fusion sequences
+ template <typename Sequence>
+ struct meta_create_sequence
+ {
+ // create a mpl sequence from the given fusion sequence
+ typedef typename mpl::fold<
+ typename fusion::result_of::as_vector<Sequence>::type
+ , mpl::vector<>, mpl::push_back<mpl::_, mpl::_>
+ >::type sequence_type;
+
+ typedef make_nary_proto_expr<
+ sequence_type, proto::tag::shift_right, qi::domain
+ > make_proto_expr;
+
+ typedef typename make_proto_expr::type type;
+
+ static type call()
+ {
+ return make_proto_expr::call();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // the default is to use the standard streaming operator unless it's a
+ // STL container or a fusion sequence
+
+ // The default implementation will be chosen if no predefined mapping of
+ // the data type T to a Qi component is defined.
+ struct no_auto_mapping_exists {};
+
+ template <typename T, typename Enable = void>
+ struct meta_create_impl : mpl::identity<no_auto_mapping_exists> {};
+
+ template <typename T>
+ struct meta_create_impl<T
+ , typename enable_if<mpl::and_<
+ traits::is_container<T>, mpl::not_<traits::is_string<T> > >
+ >::type>
+ : meta_create_container<T> {};
+
+ template <typename T>
+ struct meta_create_impl<T, typename enable_if<
+ spirit::detail::is_fusion_sequence_but_not_proto_expr<T>
+ >::type>
+ : meta_create_sequence<T> {};
+
+ template <typename T, typename Enable = void>
+ struct meta_create : meta_create_impl<T> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // optional
+ template <typename T>
+ struct meta_create<boost::optional<T> >
+ {
+ typedef make_unary_proto_expr<
+ T, proto::tag::negate, qi::domain
+ > make_proto_expr;
+
+ typedef typename make_proto_expr::type type;
+
+ static type call()
+ {
+ return make_proto_expr::call();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // alternatives
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct meta_create<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ {
+ typedef make_nary_proto_expr<
+ typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types
+ , proto::tag::bitwise_or, qi::domain
+ > make_proto_expr;
+
+ typedef typename make_proto_expr::type type;
+
+ static type call()
+ {
+ return make_proto_expr::call();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // predefined specializations for primitive components
+
+ // character generator
+ template <>
+ struct meta_create<char>
+ {
+ typedef spirit::standard::char_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<signed char>
+ {
+ typedef spirit::standard::char_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<wchar_t>
+ {
+ typedef spirit::standard_wide::char_type type;
+ static type call() { return type(); }
+ };
+
+ template <>
+ struct meta_create<unsigned char>
+ {
+ typedef spirit::standard::char_type type;
+ static type call() { return type(); }
+ };
+
+ // boolean generator
+ template <>
+ struct meta_create<bool>
+ {
+ typedef spirit::bool_type type;
+ static type call() { return type(); }
+ };
+
+ // integral generators
+ template <>
+ struct meta_create<int>
+ {
+ typedef spirit::int_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<short>
+ {
+ typedef spirit::short_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<long>
+ {
+ typedef spirit::long_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<unsigned int>
+ {
+ typedef spirit::uint_type type;
+ static type call() { return type(); }
+ };
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+ template <>
+ struct meta_create<unsigned short>
+ {
+ typedef spirit::ushort_type type;
+ static type call() { return type(); }
+ };
+#endif
+ template <>
+ struct meta_create<unsigned long>
+ {
+ typedef spirit::ulong_type type;
+ static type call() { return type(); }
+ };
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct meta_create<boost::long_long_type>
+ {
+ typedef spirit::long_long_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<boost::ulong_long_type>
+ {
+ typedef spirit::ulong_long_type type;
+ static type call() { return type(); }
+ };
+#endif
+
+ // floating point generators
+ template <>
+ struct meta_create<float>
+ {
+ typedef spirit::float_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<double>
+ {
+ typedef spirit::double_type type;
+ static type call() { return type(); }
+ };
+ template <>
+ struct meta_create<long double>
+ {
+ typedef spirit::long_double_type type;
+ static type call() { return type(); }
+ };
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // main customization point for create_parser
+ template <typename T, typename Enable = void>
+ struct create_parser : qi::meta_create<T> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // dispatch this to the Qi related specializations
+ template <typename T>
+ struct meta_create<qi::domain, T>
+ : create_parser<typename spirit::detail::remove_const_ref<T>::type> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Check whether a valid mapping exits for the given data type to a Qi
+ // component
+ template <typename T>
+ struct meta_create_exists<qi::domain, T>
+ : mpl::not_<is_same<
+ qi::no_auto_mapping_exists
+ , typename meta_create<qi::domain, T>::type
+ > > {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/auxiliary.hpp b/boost/spirit/home/qi/auxiliary.hpp
new file mode 100644
index 0000000000..0f972b58c0
--- /dev/null
+++ b/boost/spirit/home/qi/auxiliary.hpp
@@ -0,0 +1,22 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_AUXILIARY_FEBRUARY_03_2007_0355PM)
+#define BOOST_SPIRIT_AUXILIARY_FEBRUARY_03_2007_0355PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auxiliary/eps.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/qi/auxiliary/eol.hpp>
+#include <boost/spirit/home/qi/auxiliary/eoi.hpp>
+#include <boost/spirit/home/qi/auxiliary/attr.hpp>
+#include <boost/spirit/home/qi/auxiliary/attr_cast.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/auxiliary/attr.hpp b/boost/spirit/home/qi/auxiliary/attr.hpp
new file mode 100644
index 0000000000..2778a685f1
--- /dev/null
+++ b/boost/spirit/home/qi/auxiliary/attr.hpp
@@ -0,0 +1,110 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_ATTR_JUL_23_2008_0956AM)
+#define BOOST_SPIRIT_ATTR_JUL_23_2008_0956AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/remove_const.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A0> // enables attr()
+ struct use_terminal<
+ qi::domain, terminal_ex<tag::attr, fusion::vector1<A0> > >
+ : mpl::true_ {};
+
+ template <> // enables *lazy* attr()
+ struct use_lazy_terminal<qi::domain, tag::attr, 1>
+ : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::attr;
+#endif
+ using spirit::attr_type;
+
+ template <typename Value>
+ struct attr_parser : primitive_parser<attr_parser<Value> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute : remove_const<Value> {};
+
+ attr_parser(typename add_reference<Value>::type value)
+ : value_(value) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& /*first*/, Iterator const& /*last*/
+ , Context& /*context*/, Skipper const& /*skipper*/
+ , Attribute& attr) const
+ {
+ spirit::traits::assign_to(value_, attr);
+ return true; // never consume any input, succeed always
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("attr");
+ }
+
+ Value value_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ attr_parser& operator= (attr_parser const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::attr, fusion::vector1<A0> >
+ , Modifiers>
+ {
+ typedef typename add_const<A0>::type const_value;
+ typedef attr_parser<const_value> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Attr, typename Context, typename Iterator>
+ struct handles_container<qi::attr_parser<T>, Attr, Context, Iterator>
+ : traits::is_container<Attr> {};
+}}}
+
+#endif
+
+
diff --git a/boost/spirit/home/qi/auxiliary/attr_cast.hpp b/boost/spirit/home/qi/auxiliary/attr_cast.hpp
new file mode 100644
index 0000000000..a8fc6880e0
--- /dev/null
+++ b/boost/spirit/home/qi/auxiliary/attr_cast.hpp
@@ -0,0 +1,145 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_QI_ATTR_CAST_SEP_26_2009_0735PM)
+#define SPIRIT_QI_ATTR_CAST_SEP_26_2009_0735PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/auxiliary/attr_cast.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables attr_cast<>() pseudo parser
+ template <typename Expr, typename Exposed, typename Transformed>
+ struct use_terminal<qi::domain
+ , tag::stateful_tag<Expr, tag::attr_cast, Exposed, Transformed> >
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ using spirit::attr_cast;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // attr_cast_parser consumes the attribute of subject generator without
+ // generating anything
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Exposed, typename Transformed, typename Subject>
+ struct attr_cast_parser
+ : unary_parser<attr_cast_parser<Exposed, Transformed, Subject> >
+ {
+ typedef typename result_of::compile<qi::domain, Subject>::type
+ subject_type;
+
+ typedef typename mpl::eval_if<
+ traits::not_is_unused<Transformed>
+ , mpl::identity<Transformed>
+ , traits::attribute_of<subject_type> >::type
+ transformed_attribute_type;
+
+ attr_cast_parser(Subject const& subject)
+ : subject(subject)
+ {
+ // If you got an error_invalid_expression error message here,
+ // then the expression (Subject) is not a valid spirit qi
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Subject);
+ }
+
+ // If Exposed is given, we use the given type, otherwise all we can do
+ // is to guess, so we expose our inner type as an attribute and
+ // deal with the passed attribute inside the parse function.
+ template <typename Context, typename Iterator>
+ struct attribute
+ : mpl::if_<traits::not_is_unused<Exposed>, Exposed
+ , transformed_attribute_type>
+ {};
+
+ template <typename Iterator, typename Context, typename Skipper
+ , typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ // Find the real exposed attribute. If exposed is given, we use it
+ // otherwise we assume the exposed attribute type to be the actual
+ // attribute type as passed by the user.
+ typedef typename mpl::if_<
+ traits::not_is_unused<Exposed>, Exposed, Attribute>::type
+ exposed_attribute_type;
+
+ // do down-stream transformation, provides attribute for embedded
+ // parser
+ typedef traits::transform_attribute<
+ exposed_attribute_type, transformed_attribute_type, domain>
+ transform;
+
+ typename transform::type attr_ = transform::pre(attr);
+
+ if (!compile<qi::domain>(subject).
+ parse(first, last, context, skipper, attr_))
+ {
+ transform::fail(attr);
+ return false;
+ }
+
+ // do up-stream transformation, this mainly integrates the results
+ // back into the original attribute value, if appropriate
+ traits::post_transform(attr, attr_);
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("attr_cast"
+ , compile<qi::domain>(subject).what(context));
+ }
+
+ Subject subject;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ attr_cast_parser& operator= (attr_cast_parser const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generator: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Exposed, typename Transformed
+ , typename Modifiers>
+ struct make_primitive<
+ tag::stateful_tag<Expr, tag::attr_cast, Exposed, Transformed>, Modifiers>
+ {
+ typedef attr_cast_parser<Exposed, Transformed, Expr> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ typedef tag::stateful_tag<
+ Expr, tag::attr_cast, Exposed, Transformed> tag_type;
+ using spirit::detail::get_stateful_data;
+ return result_type(get_stateful_data<tag_type>::call(term));
+ }
+ };
+
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/auxiliary/eoi.hpp b/boost/spirit/home/qi/auxiliary/eoi.hpp
new file mode 100644
index 0000000000..a1dffd484e
--- /dev/null
+++ b/boost/spirit/home/qi/auxiliary/eoi.hpp
@@ -0,0 +1,80 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_EOI_APRIL_18_2008_0751PM)
+#define BOOST_SPIRIT_EOI_APRIL_18_2008_0751PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<qi::domain, tag::eoi> // enables eoi
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::eoi;
+#endif
+ using spirit::eoi_type;
+
+ struct eoi_parser : primitive_parser<eoi_parser>
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& /*attr*/) const
+ {
+ qi::skip_over(first, last, skipper);
+ return first == last;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("eoi");
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::eoi, Modifiers>
+ {
+ typedef eoi_parser result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+}}}
+
+#endif
+
+
diff --git a/boost/spirit/home/qi/auxiliary/eol.hpp b/boost/spirit/home/qi/auxiliary/eol.hpp
new file mode 100644
index 0000000000..4564c9c49e
--- /dev/null
+++ b/boost/spirit/home/qi/auxiliary/eol.hpp
@@ -0,0 +1,98 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_EOL_APRIL_18_2008_0751PM)
+#define BOOST_SPIRIT_EOL_APRIL_18_2008_0751PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<qi::domain, tag::eol> // enables eol
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::eol;
+#endif
+ using spirit::eol_type;
+
+ struct eol_parser : primitive_parser<eol_parser>
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& /*attr*/) const
+ {
+ qi::skip_over(first, last, skipper);
+
+ Iterator it = first;
+ bool matched = false;
+ if (it != last && *it == '\r') // CR
+ {
+ matched = true;
+ ++it;
+ }
+ if (it != last && *it == '\n') // LF
+ {
+ matched = true;
+ ++it;
+ }
+
+ if (!matched)
+ return false;
+
+ first = it;
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("eol");
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::eol, Modifiers>
+ {
+ typedef eol_parser result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+}}}
+
+#endif
+
+
diff --git a/boost/spirit/home/qi/auxiliary/eps.hpp b/boost/spirit/home/qi/auxiliary/eps.hpp
new file mode 100644
index 0000000000..fe23935555
--- /dev/null
+++ b/boost/spirit/home/qi/auxiliary/eps.hpp
@@ -0,0 +1,132 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_EPS_MARCH_23_2007_0454PM)
+#define BOOST_SPIRIT_EPS_MARCH_23_2007_0454PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<qi::domain, tag::eps> // enables eps
+ : mpl::true_ {};
+
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::eps, fusion::vector1<A0> > // enables eps(bool-condition)
+ > : is_convertible<A0, bool> {};
+
+ template <> // enables eps(f)
+ struct use_lazy_terminal<
+ qi::domain, tag::eps, 1 /*arity*/
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::eps;
+#endif
+ using spirit::eps_type;
+
+ struct eps_parser : primitive_parser<eps_parser>
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& /*attr*/) const
+ {
+ qi::skip_over(first, last, skipper);
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("eps");
+ }
+ };
+
+ struct semantic_predicate : primitive_parser<semantic_predicate>
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ semantic_predicate(bool predicate)
+ : predicate(predicate) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& /*attr*/) const
+ {
+ qi::skip_over(first, last, skipper);
+ return predicate;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("semantic-predicate");
+ }
+
+ bool predicate;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::eps, Modifiers>
+ {
+ typedef eps_parser result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::eps, fusion::vector1<A0> >
+ , Modifiers>
+ {
+ typedef semantic_predicate result_type;
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args) ? true : false);
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/auxiliary/lazy.hpp b/boost/spirit/home/qi/auxiliary/lazy.hpp
new file mode 100644
index 0000000000..b935261325
--- /dev/null
+++ b/boost/spirit/home/qi/auxiliary/lazy.hpp
@@ -0,0 +1,287 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_LAZY_MARCH_27_2007_1002AM)
+#define BOOST_SPIRIT_LAZY_MARCH_27_2007_1002AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/lazy.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/utility/result_of.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/not.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Eval>
+ struct use_terminal<qi::domain, phoenix::actor<Eval> > // enables phoenix actors
+ : mpl::true_ {};
+
+ // forward declaration
+ template <typename Terminal, typename Actor, int Arity>
+ struct lazy_terminal;
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ using spirit::lazy;
+ typedef modify<qi::domain> qi_modify;
+
+ namespace detail
+ {
+ template <typename Parser, typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool lazy_parse_impl(Parser const& p
+ , Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr, mpl::false_)
+ {
+ return p.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Parser, typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool lazy_parse_impl(Parser const& p
+ , Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr, mpl::true_)
+ {
+ // If DeducedAuto is false (semantic actions is present), the
+ // component's attribute is unused.
+ return p.parse(first, last, context, skipper, unused);
+ }
+
+ template <typename Parser, typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool lazy_parse_impl_main(Parser const& p
+ , Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr)
+ {
+ // If DeducedAuto is true (no semantic action), we pass the parser's
+ // attribute on to the component.
+ typedef typename traits::has_semantic_action<Parser>::type auto_rule;
+ return lazy_parse_impl(p, first, last, context, skipper, attr, auto_rule());
+ }
+ }
+
+ template <typename Function, typename Modifiers>
+ struct lazy_parser : parser<lazy_parser<Function, Modifiers> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ boost::result_of<qi_modify(tag::lazy_eval, Modifiers)>::type
+ modifier;
+
+ typedef typename
+ remove_reference<
+ typename boost::result_of<Function(unused_type, Context)>::type
+ >::type
+ expr_type;
+
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr_type) is not a valid spirit qi
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, expr_type);
+
+ typedef typename
+ result_of::compile<qi::domain, expr_type, modifier>::type
+ parser_type;
+
+ typedef typename
+ traits::attribute_of<parser_type, Context, Iterator>::type
+ type;
+ };
+
+ lazy_parser(Function const& function, Modifiers const& modifiers)
+ : function(function), modifiers(modifiers) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ return detail::lazy_parse_impl_main(
+ compile<qi::domain>(function(unused, context)
+ , qi_modify()(tag::lazy_eval(), modifiers))
+ , first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("lazy"
+ , compile<qi::domain>(function(unused, context)
+ , qi_modify()(tag::lazy_eval(), modifiers))
+ .what(context)
+ );
+ }
+
+ Function function;
+ Modifiers modifiers;
+ };
+
+
+ template <typename Function, typename Subject, typename Modifiers>
+ struct lazy_directive
+ : unary_parser<lazy_directive<Function, Subject, Modifiers> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ boost::result_of<qi_modify(tag::lazy_eval, Modifiers)>::type
+ modifier;
+
+ typedef typename
+ remove_reference<
+ typename boost::result_of<Function(unused_type, Context)>::type
+ >::type
+ directive_expr_type;
+
+ typedef typename
+ proto::result_of::make_expr<
+ proto::tag::subscript
+ , directive_expr_type
+ , Subject
+ >::type
+ expr_type;
+
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr_type) is not a valid spirit qi
+ // expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, expr_type);
+
+ typedef typename
+ result_of::compile<qi::domain, expr_type, modifier>::type
+ parser_type;
+
+ typedef typename
+ traits::attribute_of<parser_type, Context, Iterator>::type
+ type;
+ };
+
+ lazy_directive(
+ Function const& function
+ , Subject const& subject
+ , Modifiers const& modifiers)
+ : function(function), subject(subject), modifiers(modifiers) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ return detail::lazy_parse_impl_main(compile<qi::domain>(
+ proto::make_expr<proto::tag::subscript>(
+ function(unused, context)
+ , subject)
+ , qi_modify()(tag::lazy_eval(), modifiers))
+ , first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("lazy-directive"
+ , compile<qi::domain>(
+ proto::make_expr<proto::tag::subscript>(
+ function(unused, context)
+ , subject
+ ), qi_modify()(tag::lazy_eval(), modifiers))
+ .what(context)
+ );
+ }
+
+ Function function;
+ Subject subject;
+ Modifiers modifiers;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Eval, typename Modifiers>
+ struct make_primitive<phoenix::actor<Eval>, Modifiers>
+ {
+ typedef lazy_parser<phoenix::actor<Eval>, Modifiers> result_type;
+ result_type operator()(phoenix::actor<Eval> const& f
+ , Modifiers const& modifiers) const
+ {
+ return result_type(f, modifiers);
+ }
+ };
+
+ template <typename Terminal, typename Actor, int Arity, typename Modifiers>
+ struct make_primitive<lazy_terminal<Terminal, Actor, Arity>, Modifiers>
+ {
+ typedef lazy_parser<Actor, Modifiers> result_type;
+ result_type operator()(
+ lazy_terminal<Terminal, Actor, Arity> const& lt
+ , Modifiers const& modifiers) const
+ {
+ return result_type(lt.actor, modifiers);
+ }
+ };
+
+ template <typename Terminal, typename Actor, int Arity, typename Subject, typename Modifiers>
+ struct make_directive<lazy_terminal<Terminal, Actor, Arity>, Subject, Modifiers>
+ {
+ typedef lazy_directive<Actor, Subject, Modifiers> result_type;
+ result_type operator()(
+ lazy_terminal<Terminal, Actor, Arity> const& lt
+ , Subject const& subject, Modifiers const& modifiers) const
+ {
+ return result_type(lt.actor, subject, modifiers);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Actor, typename Modifiers, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<
+ qi::lazy_parser<Actor, Modifiers>, Attribute, Context, Iterator>
+ : handles_container<
+ typename qi::lazy_parser<Actor, Modifiers>::template
+ attribute<Context, Iterator>::parser_type
+ , Attribute, Context, Iterator>
+ {};
+
+ template <typename Subject, typename Actor, typename Modifiers
+ , typename Attribute, typename Context, typename Iterator>
+ struct handles_container<
+ qi::lazy_directive<Actor, Subject, Modifiers>, Attribute
+ , Context, Iterator>
+ : handles_container<
+ typename qi::lazy_directive<Actor, Subject, Modifiers>::template
+ attribute<Context, Iterator>::parser_type
+ , Attribute, Context, Iterator>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/binary.hpp b/boost/spirit/home/qi/binary.hpp
new file mode 100644
index 0000000000..f930a6025b
--- /dev/null
+++ b/boost/spirit/home/qi/binary.hpp
@@ -0,0 +1,16 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_BINARY_MAY_08_2007_0906AM)
+#define BOOST_SPIRIT_BINARY_MAY_08_2007_0906AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/binary/binary.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/binary/binary.hpp b/boost/spirit/home/qi/binary/binary.hpp
new file mode 100644
index 0000000000..7d47a6e2ee
--- /dev/null
+++ b/boost/spirit/home/qi/binary/binary.hpp
@@ -0,0 +1,413 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_BINARY_MAY_08_2007_0808AM)
+#define BOOST_SPIRIT_BINARY_MAY_08_2007_0808AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/detail/endian.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+#include <boost/config.hpp>
+
+#define BOOST_SPIRIT_ENABLE_BINARY(name) \
+ template <> \
+ struct use_terminal<qi::domain, tag::name> \
+ : mpl::true_ {}; \
+ \
+ template <typename A0> \
+ struct use_terminal<qi::domain \
+ , terminal_ex<tag::name, fusion::vector1<A0> > > \
+ : mpl::or_<is_integral<A0>, is_enum<A0> > {}; \
+ \
+ template <> \
+ struct use_lazy_terminal<qi::domain, tag::name, 1> : mpl::true_ {}; \
+ \
+/***/
+
+#define BOOST_SPIRIT_ENABLE_BINARY_IEEE754(name) \
+ template<> \
+ struct use_terminal<qi::domain, tag::name>: mpl::true_ {}; \
+ \
+ template<typename A0> \
+ struct use_terminal<qi::domain, terminal_ex<tag::name, \
+ fusion::vector1<A0> > >: is_floating_point<A0> {}; \
+ \
+ template<> \
+ struct use_lazy_terminal<qi::domain, tag::name, 1>: mpl::true_ {}; \
+ \
+/***/
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_ENABLE_BINARY(byte_) // enables byte_
+ BOOST_SPIRIT_ENABLE_BINARY(word) // enables word
+ BOOST_SPIRIT_ENABLE_BINARY(big_word) // enables big_word
+ BOOST_SPIRIT_ENABLE_BINARY(little_word) // enables little_word
+ BOOST_SPIRIT_ENABLE_BINARY(dword) // enables dword
+ BOOST_SPIRIT_ENABLE_BINARY(big_dword) // enables big_dword
+ BOOST_SPIRIT_ENABLE_BINARY(little_dword) // enables little_dword
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_SPIRIT_ENABLE_BINARY(qword) // enables qword
+ BOOST_SPIRIT_ENABLE_BINARY(big_qword) // enables big_qword
+ BOOST_SPIRIT_ENABLE_BINARY(little_qword) // enables little_qword
+#endif
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(bin_float)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(big_bin_float)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(little_bin_float)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(bin_double)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(big_bin_double)
+ BOOST_SPIRIT_ENABLE_BINARY_IEEE754(little_bin_double)
+}}
+
+#undef BOOST_SPIRIT_ENABLE_BINARY
+#undef BOOST_SPIRIT_ENABLE_BINARY_IEEE754
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using boost::spirit::byte_;
+ using boost::spirit::word;
+ using boost::spirit::big_word;
+ using boost::spirit::little_word;
+ using boost::spirit::dword;
+ using boost::spirit::big_dword;
+ using boost::spirit::little_dword;
+#ifdef BOOST_HAS_LONG_LONG
+ using boost::spirit::qword;
+ using boost::spirit::big_qword;
+ using boost::spirit::little_qword;
+#endif
+ using boost::spirit::bin_float;
+ using boost::spirit::big_bin_float;
+ using boost::spirit::little_bin_float;
+ using boost::spirit::bin_double;
+ using boost::spirit::big_bin_double;
+ using boost::spirit::little_bin_double;
+#endif
+
+ using boost::spirit::byte_type;
+ using boost::spirit::word_type;
+ using boost::spirit::big_word_type;
+ using boost::spirit::little_word_type;
+ using boost::spirit::dword_type;
+ using boost::spirit::big_dword_type;
+ using boost::spirit::little_dword_type;
+#ifdef BOOST_HAS_LONG_LONG
+ using boost::spirit::qword_type;
+ using boost::spirit::big_qword_type;
+ using boost::spirit::little_qword_type;
+#endif
+ using boost::spirit::bin_float_type;
+ using boost::spirit::big_bin_float_type;
+ using boost::spirit::little_bin_float_type;
+ using boost::spirit::bin_double_type;
+ using boost::spirit::big_bin_double_type;
+ using boost::spirit::little_bin_double_type;
+
+ namespace detail
+ {
+ template <int bits>
+ struct integer
+ {
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_SPIRIT_ASSERT_MSG(
+ bits == 8 || bits == 16 || bits == 32 || bits == 64,
+ not_supported_binary_size, ());
+#else
+ BOOST_SPIRIT_ASSERT_MSG(
+ bits == 8 || bits == 16 || bits == 32,
+ not_supported_binary_size, ());
+#endif
+ };
+
+ template <>
+ struct integer<8>
+ {
+ enum { size = 1 };
+ typedef uint_least8_t type;
+ };
+
+ template <>
+ struct integer<16>
+ {
+ enum { size = 2 };
+ typedef uint_least16_t type;
+ };
+
+ template <>
+ struct integer<32>
+ {
+ enum { size = 4 };
+ typedef uint_least32_t type;
+ };
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct integer<64>
+ {
+ enum { size = 8 };
+ typedef uint_least64_t type;
+ };
+#endif
+
+ template <int bits>
+ struct floating_point
+ {
+ BOOST_SPIRIT_ASSERT_MSG(
+ bits == 32 || bits == 64,
+ not_supported_binary_size, ());
+ };
+
+ template <>
+ struct floating_point<32>
+ {
+ enum { size = 4 };
+ typedef float type;
+ };
+
+ template <>
+ struct floating_point<64>
+ {
+ enum { size = 8 };
+ typedef double type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <BOOST_SCOPED_ENUM(boost::endian::endianness) bits>
+ struct what;
+
+ template <>
+ struct what<boost::endian::endianness::native>
+ {
+ static std::string is()
+ {
+ return "native-endian binary";
+ }
+ };
+
+ template <>
+ struct what<boost::endian::endianness::little>
+ {
+ static char const* is()
+ {
+ return "little-endian binary";
+ }
+ };
+
+ template <>
+ struct what<boost::endian::endianness::big>
+ {
+ static char const* is()
+ {
+ return "big-endian binary";
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, BOOST_SCOPED_ENUM(boost::endian::endianness) endian, int bits>
+ struct any_binary_parser : primitive_parser<any_binary_parser<T, endian, bits> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef boost::endian::endian<endian, typename T::type,
+ bits> type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper);
+
+ typename attribute<Context, Iterator>::type attr_;
+ unsigned char* bytes = reinterpret_cast<unsigned char*>(&attr_);
+
+ Iterator it = first;
+ for (unsigned int i = 0; i < sizeof(attr_); ++i)
+ {
+ if (it == last)
+ return false;
+ *bytes++ = *it++;
+ }
+
+ first = it;
+ spirit::traits::assign_to(attr_, attr);
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info(qi::detail::what<endian>::is());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename V, typename T
+ , BOOST_SCOPED_ENUM(boost::endian::endianness) endian, int bits>
+ struct binary_lit_parser
+ : primitive_parser<binary_lit_parser<V, T, endian, bits> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ binary_lit_parser(V n)
+ : n(n) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper);
+
+ // Even if the endian types are not pod's (at least not in the
+ // definition of C++03) it seems to be safe to assume they are
+ // (but in C++0x the endian types _are_ PODs).
+ // This allows us to treat them as a sequence of consecutive bytes.
+ boost::endian::endian<endian, typename T::type, bits> attr_;
+
+#if defined(BOOST_MSVC)
+// warning C4244: 'argument' : conversion from 'const int' to 'foo', possible loss of data
+#pragma warning(push)
+#pragma warning(disable: 4244)
+#endif
+ attr_ = n;
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+ unsigned char* bytes = reinterpret_cast<unsigned char*>(&attr_);
+
+ Iterator it = first;
+ for (unsigned int i = 0; i < sizeof(attr_); ++i)
+ {
+ if (it == last || *bytes++ != static_cast<unsigned char>(*it++))
+ return false;
+ }
+
+ first = it;
+ spirit::traits::assign_to(attr_, attr);
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info(qi::detail::what<endian>::is());
+ }
+
+ V n;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, BOOST_SCOPED_ENUM(boost::endian::endianness) endian, int bits>
+ struct make_binary_parser
+ {
+ typedef any_binary_parser<T, endian, bits> result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ template <typename V, typename T
+ , BOOST_SCOPED_ENUM(boost::endian::endianness) endian, int bits>
+ struct make_binary_lit_parser
+ {
+ typedef binary_lit_parser<V, T, endian, bits> result_type;
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+#define BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(name, endiantype, bits) \
+ template <typename Modifiers> \
+ struct make_primitive<tag::name, Modifiers> \
+ : make_binary_parser<detail::integer<bits>, \
+ boost::endian::endianness::endiantype, bits> {}; \
+ \
+ template <typename Modifiers, typename A0> \
+ struct make_primitive< \
+ terminal_ex<tag::name, fusion::vector1<A0> > , Modifiers> \
+ : make_binary_lit_parser<A0, detail::integer<bits>, \
+ boost::endian::endianness::endiantype, bits> {}; \
+ \
+ /***/
+
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(byte_, native, 8)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(word, native, 16)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(big_word, big, 16)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(little_word, little, 16)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(dword, native, 32)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(big_dword, big, 32)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(little_dword, little, 32)
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(qword, native, 64)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(big_qword, big, 64)
+ BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE(little_qword, little, 64)
+#endif
+
+#undef BOOST_SPIRIT_MAKE_BINARY_PRIMITIVE
+
+#define BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(name, endiantype, bits) \
+ template<typename Modifiers> \
+ struct make_primitive<tag::name, Modifiers> \
+ : make_binary_parser<detail::floating_point<bits>, \
+ boost::endian::endianness::endiantype, bits> {}; \
+ \
+ template<typename Modifiers, typename A0> \
+ struct make_primitive< \
+ terminal_ex<tag::name, fusion::vector1<A0> >, Modifiers> \
+ : make_binary_lit_parser<A0, detail::floating_point<bits>, \
+ boost::endian::endianness::endiantype, \
+ bits> {}; \
+ \
+ /***/
+
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(bin_float, native, 32)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(big_bin_float, big, 32)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(little_bin_float, little, 32)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(bin_double, native, 64)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(big_bin_double, big, 64)
+ BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE(little_bin_double, little, 64)
+
+#undef BOOST_SPIRIT_MAKE_BINARY_IEEE754_PRIMITIVE
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/char.hpp b/boost/spirit/home/qi/char.hpp
new file mode 100644
index 0000000000..66739db354
--- /dev/null
+++ b/boost/spirit/home/qi/char.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_CHAR_FEBRUARY_02_2007_0921AM)
+#define BOOST_SPIRIT_CHAR_FEBRUARY_02_2007_0921AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/char/char_parser.hpp>
+#include <boost/spirit/home/qi/char/char.hpp>
+#include <boost/spirit/home/qi/char/char_class.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/char/char.hpp b/boost/spirit/home/qi/char/char.hpp
new file mode 100644
index 0000000000..7269da4197
--- /dev/null
+++ b/boost/spirit/home/qi/char/char.hpp
@@ -0,0 +1,615 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ 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)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_CHAR_APRIL_16_2006_1051AM)
+#define BOOST_SPIRIT_CHAR_APRIL_16_2006_1051AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/support/char_set/basic_chset.hpp>
+#include <boost/spirit/home/qi/char/char_parser.hpp>
+#include <boost/spirit/home/qi/char/char_class.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/qi/detail/enable_lit.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <string>
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct use_terminal<qi::domain
+ , terminal<
+ tag::char_code<tag::char_, CharEncoding> // enables char_
+ >
+ > : mpl::true_ {};
+
+ template <typename CharEncoding, typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<
+ tag::char_code<tag::char_, CharEncoding> // enables char_('x'), char_("x")
+ , fusion::vector1<A0> // and char_("a-z0-9")
+ >
+ > : mpl::true_ {};
+
+ template <typename CharEncoding, typename A0, typename A1>
+ struct use_terminal<qi::domain
+ , terminal_ex<
+ tag::char_code<tag::char_, CharEncoding> // enables char_('a','z')
+ , fusion::vector2<A0, A1>
+ >
+ > : mpl::true_ {};
+
+ template <typename CharEncoding> // enables *lazy* char_('x'), char_("x")
+ struct use_lazy_terminal< // and char_("a-z0-9")
+ qi::domain
+ , tag::char_code<tag::char_, CharEncoding>
+ , 1 // arity
+ > : mpl::true_ {};
+
+ template <typename CharEncoding> // enables *lazy* char_('a','z')
+ struct use_lazy_terminal<
+ qi::domain
+ , tag::char_code<tag::char_, CharEncoding>
+ , 2 // arity
+ > : mpl::true_ {};
+
+ template <>
+ struct use_terminal<qi::domain, char> // enables 'x'
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<qi::domain, char[2]> // enables "x"
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<qi::domain, wchar_t> // enables wchar_t
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<qi::domain, wchar_t[2]> // enables L"x"
+ : mpl::true_ {};
+
+ // enables lit(...)
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<traits::is_char<A0> >::type>
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::lit; // lit('x') is equivalent to 'x'
+#endif
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser for a single character
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, bool no_attribute, bool no_case = false>
+ struct literal_char
+ : char_parser<
+ literal_char<CharEncoding, no_attribute, false>
+ , typename CharEncoding::char_type
+ , typename mpl::if_c<no_attribute, unused_type
+ , typename CharEncoding::char_type>::type>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ template <typename Char>
+ literal_char(Char ch)
+ : ch(static_cast<char_type>(ch)) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename mpl::if_c<
+ no_attribute, unused_type, char_type>::type
+ type;
+ };
+
+ template <typename CharParam, typename Context>
+ bool test(CharParam ch_, Context&) const
+ {
+ return traits::ischar<CharParam, char_encoding>::call(ch_) &&
+ ch == char_type(ch_);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("literal-char", char_encoding::toucs4(ch));
+ }
+
+ char_type ch;
+ };
+
+ template <typename CharEncoding, bool no_attribute>
+ struct literal_char<CharEncoding, no_attribute, true> // case insensitive
+ : char_parser<
+ literal_char<CharEncoding, no_attribute, true>
+ , typename mpl::if_c<no_attribute, unused_type
+ , typename CharEncoding::char_type>::type>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ literal_char(char_type ch)
+ : lo(static_cast<char_type>(char_encoding::tolower(ch)))
+ , hi(static_cast<char_type>(char_encoding::toupper(ch))) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename mpl::if_c<
+ no_attribute, unused_type, char_type>::type
+ type;
+ };
+
+ template <typename CharParam, typename Context>
+ bool test(CharParam ch_, Context&) const
+ {
+ if (!traits::ischar<CharParam, char_encoding>::call(ch_))
+ return false;
+
+ char_type ch = char_type(ch_); // optimize for token based parsing
+ return this->lo == ch || this->hi == ch;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("no-case-literal-char", char_encoding::toucs4(lo));
+ }
+
+ char_type lo, hi;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser for a character range
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, bool no_case = false>
+ struct char_range
+ : char_parser<char_range<CharEncoding, false>, typename CharEncoding::char_type>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ char_range(char_type from, char_type to)
+ : from(from), to(to) {}
+
+ template <typename CharParam, typename Context>
+ bool test(CharParam ch_, Context&) const
+ {
+ if (!traits::ischar<CharParam, char_encoding>::call(ch_))
+ return false;
+
+ char_type ch = char_type(ch_); // optimize for token based parsing
+ return !(ch < from) && !(to < ch);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ info result("char-range", char_encoding::toucs4(from));
+ boost::get<std::string>(result.value) += '-';
+ boost::get<std::string>(result.value) += to_utf8(char_encoding::toucs4(to));
+ return result;
+ }
+
+ char_type from, to;
+ };
+
+ template <typename CharEncoding>
+ struct char_range<CharEncoding, true> // case insensitive
+ : char_parser<char_range<CharEncoding, true>, typename CharEncoding::char_type>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ char_range(char_type from, char_type to)
+ : from_lo(static_cast<char_type>(char_encoding::tolower(from)))
+ , to_lo(static_cast<char_type>(char_encoding::tolower(to)))
+ , from_hi(static_cast<char_type>(char_encoding::toupper(from)))
+ , to_hi(static_cast<char_type>(char_encoding::toupper(to)))
+ {}
+
+ template <typename CharParam, typename Context>
+ bool test(CharParam ch_, Context&) const
+ {
+ if (!traits::ischar<CharParam, char_encoding>::call(ch_))
+ return false;
+
+ char_type ch = char_type(ch_); // optimize for token based parsing
+ return (!(ch < from_lo) && !(to_lo < ch))
+ || (!(ch < from_hi) && !(to_hi < ch))
+ ;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ info result("no-case-char-range", char_encoding::toucs4(from_lo));
+ boost::get<std::string>(result.value) += '-';
+ boost::get<std::string>(result.value) += to_utf8(char_encoding::toucs4(to_lo));
+ return result;
+ }
+
+ char_type from_lo, to_lo, from_hi, to_hi;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser for a character set
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, bool no_attribute, bool no_case = false>
+ struct char_set
+ : char_parser<char_set<CharEncoding, no_attribute, false>
+ , typename mpl::if_c<no_attribute, unused_type
+ , typename CharEncoding::char_type>::type>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ template <typename String>
+ char_set(String const& str)
+ {
+ using spirit::detail::cast_char;
+
+ typedef typename
+ remove_const<
+ typename traits::char_type_of<String>::type
+ >::type
+ in_type;
+
+ BOOST_SPIRIT_ASSERT_MSG((
+ (sizeof(char_type) >= sizeof(in_type))
+ ), cannot_convert_string, (String));
+
+ in_type const* definition =
+ (in_type const*)traits::get_c_string(str);
+ in_type ch = *definition++;
+ while (ch)
+ {
+ in_type next = *definition++;
+ if (next == '-')
+ {
+ next = *definition++;
+ if (next == 0)
+ {
+ chset.set(cast_char<char_type>(ch));
+ chset.set('-');
+ break;
+ }
+ chset.set(
+ cast_char<char_type>(ch),
+ cast_char<char_type>(next)
+ );
+ }
+ else
+ {
+ chset.set(cast_char<char_type>(ch));
+ }
+ ch = next;
+ }
+ }
+
+ template <typename CharParam, typename Context>
+ bool test(CharParam ch, Context&) const
+ {
+ return traits::ischar<CharParam, char_encoding>::call(ch) &&
+ chset.test(char_type(ch));
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("char-set");
+ }
+
+ support::detail::basic_chset<char_type> chset;
+ };
+
+ template <typename CharEncoding, bool no_attribute>
+ struct char_set<CharEncoding, no_attribute, true> // case insensitive
+ : char_parser<char_set<CharEncoding, no_attribute, true>
+ , typename mpl::if_c<no_attribute, unused_type
+ , typename CharEncoding::char_type>::type>
+ {
+ typedef typename CharEncoding::char_type char_type;
+ typedef CharEncoding char_encoding;
+
+ template <typename String>
+ char_set(String const& str)
+ {
+ typedef typename traits::char_type_of<String>::type in_type;
+
+ BOOST_SPIRIT_ASSERT_MSG((
+ (sizeof(char_type) == sizeof(in_type))
+ ), cannot_convert_string, (String));
+
+ char_type const* definition =
+ (char_type const*)traits::get_c_string(str);
+ char_type ch = *definition++;
+ while (ch)
+ {
+ char_type next = *definition++;
+ if (next == '-')
+ {
+ next = *definition++;
+ if (next == 0)
+ {
+ chset.set(static_cast<char_type>(CharEncoding::tolower(ch)));
+ chset.set(static_cast<char_type>(CharEncoding::toupper(ch)));
+ chset.set('-');
+ break;
+ }
+ chset.set(static_cast<char_type>(CharEncoding::tolower(ch))
+ , static_cast<char_type>(CharEncoding::tolower(next)));
+ chset.set(static_cast<char_type>(CharEncoding::toupper(ch))
+ , static_cast<char_type>(CharEncoding::toupper(next)));
+ }
+ else
+ {
+ chset.set(static_cast<char_type>(CharEncoding::tolower(ch)));
+ chset.set(static_cast<char_type>(CharEncoding::toupper(ch)));
+ }
+ ch = next;
+ }
+ }
+
+ template <typename CharParam, typename Context>
+ bool test(CharParam ch, Context&) const
+ {
+ return traits::ischar<CharParam, char_encoding>::call(ch) &&
+ chset.test(char_type(ch));
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("no-case-char-set");
+ }
+
+ support::detail::basic_chset<char_type> chset;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Modifiers, typename Encoding>
+ struct basic_literal
+ {
+ static bool const no_case =
+ has_modifier<
+ Modifiers
+ , tag::char_code_base<tag::no_case>
+ >::value;
+
+ static bool const no_attr =
+ !has_modifier<
+ Modifiers
+ , tag::lazy_eval
+ >::value;
+
+ typedef literal_char<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers, Encoding, no_case>::type
+ , no_attr
+ , no_case>
+ result_type;
+
+ template <typename Char>
+ result_type operator()(Char ch, unused_type) const
+ {
+ return result_type(ch);
+ }
+
+ template <typename Char>
+ result_type operator()(Char const* str, unused_type) const
+ {
+ return result_type(str[0]);
+ }
+ };
+ }
+
+ template <typename Modifiers>
+ struct make_primitive<char, Modifiers>
+ : detail::basic_literal<Modifiers, char_encoding::standard> {};
+
+ template <typename Modifiers>
+ struct make_primitive<char const(&)[2], Modifiers>
+ : detail::basic_literal<Modifiers, char_encoding::standard> {};
+
+ template <typename Modifiers>
+ struct make_primitive<wchar_t, Modifiers>
+ : detail::basic_literal<Modifiers, char_encoding::standard_wide> {};
+
+ template <typename Modifiers>
+ struct make_primitive<wchar_t const(&)[2], Modifiers>
+ : detail::basic_literal<Modifiers, char_encoding::standard_wide> {};
+
+ template <typename CharEncoding, typename Modifiers>
+ struct make_primitive<
+ terminal<tag::char_code<tag::char_, CharEncoding> >, Modifiers>
+ {
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
+ typedef tag::char_code<tag::char_, char_encoding> tag;
+ typedef char_class<tag> result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // char_('x')
+ template <typename CharEncoding, typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector1<A0> >
+ , Modifiers>
+ {
+ static bool const no_case =
+ has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
+
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
+ typedef typename
+ mpl::if_<
+ traits::is_string<A0>
+ , char_set<char_encoding, false, no_case>
+ , literal_char<char_encoding, false, no_case>
+ >::type
+ result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ // lit('x')
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers
+ , typename enable_if<traits::is_char<A0> >::type>
+ {
+ static bool const no_case =
+ has_modifier<
+ Modifiers
+ , tag::char_code_base<tag::no_case>
+ >::value;
+
+ typedef typename traits::char_encoding_from_char<
+ typename traits::char_type_of<A0>::type>::type encoding;
+
+ typedef literal_char<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers, encoding, no_case>::type
+ , true, no_case>
+ result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding, typename Modifiers, typename Char>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector1<Char(&)[2]> // For single char strings
+ >
+ , Modifiers>
+ {
+ static bool const no_case =
+ has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
+
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
+ typedef literal_char<char_encoding, false, no_case> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args)[0]);
+ }
+ };
+
+ template <typename CharEncoding, typename Modifiers, typename A0, typename A1>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector2<A0, A1>
+ >
+ , Modifiers>
+ {
+ static bool const no_case =
+ has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
+
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
+ typedef char_range<char_encoding, no_case> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(
+ fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args)
+ );
+ }
+ };
+
+ template <typename CharEncoding, typename Modifiers, typename Char>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::char_, CharEncoding>
+ , fusion::vector2<Char(&)[2], Char(&)[2]> // For single char strings
+ >
+ , Modifiers>
+ {
+ static bool const no_case =
+ has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
+
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
+ typedef char_range<char_encoding, no_case> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(
+ fusion::at_c<0>(term.args)[0]
+ , fusion::at_c<1>(term.args)[0]
+ );
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/char/char_class.hpp b/boost/spirit/home/qi/char/char_class.hpp
new file mode 100644
index 0000000000..9b77b7d54a
--- /dev/null
+++ b/boost/spirit/home/qi/char/char_class.hpp
@@ -0,0 +1,118 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_CHAR_CLASS_APRIL_16_2006_1051AM)
+#define BOOST_SPIRIT_CHAR_CLASS_APRIL_16_2006_1051AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/char/char_parser.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/modify.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/mpl/eval_if.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ // enables alnum, alpha, graph, etc.
+ template <typename CharClass, typename CharEncoding>
+ struct use_terminal<qi::domain, tag::char_code<CharClass, CharEncoding> >
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ // hoist the char classification namespaces into qi sub-namespaces of the
+ // same name
+ namespace ascii { using namespace boost::spirit::ascii; }
+ namespace iso8859_1 { using namespace boost::spirit::iso8859_1; }
+ namespace standard { using namespace boost::spirit::standard; }
+ namespace standard_wide { using namespace boost::spirit::standard_wide; }
+#if defined(BOOST_SPIRIT_UNICODE)
+ namespace unicode { using namespace boost::spirit::unicode; }
+#endif
+
+ // Import the standard namespace into the qi namespace. This allows
+ // for default handling of all character/string related operations if not
+ // prefixed with a character set namespace.
+ using namespace boost::spirit::standard;
+
+ // Import encoding
+ using spirit::encoding;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generic char classification parser (for alnum, alpha, graph, etc.)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Tag>
+ struct char_class
+ : char_parser<char_class<Tag>, typename Tag::char_encoding::char_type>
+ {
+ typedef typename Tag::char_encoding char_encoding;
+ typedef typename Tag::char_class classification;
+
+ template <typename CharParam, typename Context>
+ bool test(CharParam ch, Context&) const
+ {
+ using spirit::char_class::classify;
+ return traits::ischar<CharParam, char_encoding>::call(ch) &&
+ classify<char_encoding>::is(classification(), ch);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ typedef spirit::char_class::what<char_encoding> what_;
+ return info(what_::is(classification()));
+ }
+ };
+
+ namespace detail
+ {
+ template <typename Tag, bool no_case = false>
+ struct make_char_class : mpl::identity<Tag> {};
+
+ template <>
+ struct make_char_class<tag::lower, true> : mpl::identity<tag::alpha> {};
+
+ template <>
+ struct make_char_class<tag::upper, true> : mpl::identity<tag::alpha> {};
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharClass, typename CharEncoding, typename Modifiers>
+ struct make_primitive<tag::char_code<CharClass, CharEncoding>, Modifiers>
+ {
+ static bool const no_case =
+ has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
+
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
+ typedef tag::char_code<
+ typename detail::make_char_class<CharClass, no_case>::type
+ , char_encoding>
+ tag;
+
+ typedef char_class<tag> result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/char/char_parser.hpp b/boost/spirit/home/qi/char/char_parser.hpp
new file mode 100644
index 0000000000..b896f73774
--- /dev/null
+++ b/boost/spirit/home/qi/char/char_parser.hpp
@@ -0,0 +1,157 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_CHAR_PARSER_APR_16_2006_0906AM)
+#define BOOST_SPIRIT_CHAR_PARSER_APR_16_2006_0906AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::complement> // enables ~
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace traits // classification
+{
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(char_parser_id)
+ }
+
+ template <typename T>
+ struct is_char_parser : detail::has_char_parser_id<T> {};
+}}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The base char_parser
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Derived, typename Char, typename Attr = Char>
+ struct char_parser : primitive_parser<Derived>
+ {
+ typedef Char char_type;
+ struct char_parser_id;
+
+ // if Attr is unused_type, Derived must supply its own attribute
+ // metafunction
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef Attr type;
+ };
+
+ template <typename Iterator, typename Context, typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper);
+
+ if (first != last && this->derived().test(*first, context))
+ {
+ spirit::traits::assign_to(*first, attr);
+ ++first;
+ return true;
+ }
+ return false;
+ }
+
+ // Requirement: p.test(ch, context) -> bool
+ //
+ // ch: character being parsed
+ // context: enclosing rule context
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // negated_char_parser handles ~cp expressions (cp is a char_parser)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Positive>
+ struct negated_char_parser :
+ char_parser<negated_char_parser<Positive>, typename Positive::char_type>
+ {
+ negated_char_parser(Positive const& positive)
+ : positive(positive) {}
+
+ template <typename CharParam, typename Context>
+ bool test(CharParam ch, Context& context) const
+ {
+ return !positive.test(ch, context);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("not", positive.what(context));
+ }
+
+ Positive positive;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Positive>
+ struct make_negated_char_parser
+ {
+ typedef negated_char_parser<Positive> result_type;
+ result_type operator()(Positive const& positive) const
+ {
+ return result_type(positive);
+ }
+ };
+
+ template <typename Positive>
+ struct make_negated_char_parser<negated_char_parser<Positive> >
+ {
+ typedef Positive result_type;
+ result_type operator()(negated_char_parser<Positive> const& ncp) const
+ {
+ return ncp.positive;
+ }
+ };
+ }
+
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::complement, Elements, Modifiers>
+ {
+ typedef typename
+ fusion::result_of::value_at_c<Elements, 0>::type
+ subject;
+
+ BOOST_SPIRIT_ASSERT_MSG((
+ traits::is_char_parser<subject>::value
+ ), subject_is_not_negatable, (subject));
+
+ typedef typename
+ detail::make_negated_char_parser<subject>::result_type
+ result_type;
+
+ result_type operator()(Elements const& elements, unused_type) const
+ {
+ return detail::make_negated_char_parser<subject>()(
+ fusion::at_c<0>(elements));
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/alternative_function.hpp b/boost/spirit/home/qi/detail/alternative_function.hpp
new file mode 100644
index 0000000000..aad0c54866
--- /dev/null
+++ b/boost/spirit/home/qi/detail/alternative_function.hpp
@@ -0,0 +1,214 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_ALTERNATIVE_FUNCTION_APRIL_23_2007_1046AM)
+#define SPIRIT_ALTERNATIVE_FUNCTION_APRIL_23_2007_1046AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/variant.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ template <typename Variant, typename Expected>
+ struct find_substitute
+ {
+ // Get the typr from the variant that can be a substitute for Expected.
+ // If none is found, just return Expected
+
+ typedef Variant variant_type;
+ typedef typename variant_type::types types;
+ typedef typename mpl::end<types>::type end;
+
+ typedef typename
+ mpl::find_if<types, is_same<mpl::_1, Expected> >::type
+ iter_1;
+
+ typedef typename
+ mpl::eval_if<
+ is_same<iter_1, end>,
+ mpl::find_if<types, traits::is_substitute<mpl::_1, Expected> >,
+ mpl::identity<iter_1>
+ >::type
+ iter;
+
+ typedef typename
+ mpl::eval_if<
+ is_same<iter, end>,
+ mpl::identity<Expected>,
+ mpl::deref<iter>
+ >::type
+ type;
+ };
+
+ template <typename Iterator, typename Context, typename Skipper,
+ typename Attribute>
+ struct alternative_function
+ {
+ alternative_function(
+ Iterator& first, Iterator const& last, Context& context,
+ Skipper const& skipper, Attribute& attr)
+ : first(first), last(last), context(context), skipper(skipper),
+ attr(attr)
+ {
+ }
+
+ template <typename Component>
+ bool call(Component const& component, mpl::true_) const
+ {
+ // if Attribute is not a variant, then pass it as-is
+ return component.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Component>
+ bool call_optional_or_variant(Component const& component, mpl::true_) const
+ {
+ // If Attribute is an optional, then create an attribute for the Component
+ // with the type optional::value_type. If the expected attribute is unused type,
+ // use it instead.
+ typedef typename
+ traits::attribute_of<Component, Context, Iterator>::type
+ expected_type;
+
+ typename mpl::if_<
+ is_same<expected_type, unused_type>,
+ unused_type,
+ typename Attribute::value_type>::type
+ val;
+
+ if (component.parse(first, last, context, skipper, val))
+ {
+ traits::assign_to(val, attr);
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Component>
+ bool call_variant(Component const& component, mpl::false_) const
+ {
+ // If Attribute is a variant, then search the variant types for a
+ // suitable substitute type.
+
+ typename
+ find_substitute<Attribute,
+ typename traits::attribute_of<Component, Context, Iterator>::type
+ >::type
+ val;
+
+ if (component.parse(first, last, context, skipper, val))
+ {
+ traits::assign_to(val, attr);
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Component>
+ bool call_variant(Component const& component, mpl::true_) const
+ {
+ // If Attribute is a variant and the expected attribute is
+ // the same type (pass the variant as-is).
+
+ return component.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Component>
+ bool call_optional_or_variant(Component const& component, mpl::false_) const
+ {
+ // Attribute is a variant...
+
+ typedef typename
+ traits::attribute_of<Component, Context, Iterator>::type
+ expected;
+ return call_variant(component,
+ is_same<Attribute, expected>());
+ }
+
+ template <typename Component>
+ bool call(Component const& component, mpl::false_) const
+ {
+ return call_optional_or_variant(
+ component, spirit::traits::not_is_variant<Attribute, qi::domain>());
+ }
+
+ template <typename Component>
+ bool call_unused(Component const& component, mpl::true_) const
+ {
+ // return true if the parser succeeds
+ return call(component,
+ mpl::and_<
+ spirit::traits::not_is_variant<Attribute, qi::domain>,
+ spirit::traits::not_is_optional<Attribute, qi::domain>
+ >());
+ }
+
+ template <typename Component>
+ bool call_unused(Component const& component, mpl::false_) const
+ {
+ return component.parse(first, last, context, skipper, unused);
+ }
+
+ template <typename Component>
+ bool operator()(Component const& component) const
+ {
+ // return true if the parser succeeds
+ typedef typename traits::not_is_unused<
+ typename traits::attribute_of<Component, Context, Iterator>::type
+ >::type predicate;
+
+ return call_unused(component, predicate());
+ }
+
+ Iterator& first;
+ Iterator const& last;
+ Context& context;
+ Skipper const& skipper;
+ Attribute& attr;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ alternative_function& operator= (alternative_function const&);
+ };
+
+ template <typename Iterator, typename Context, typename Skipper>
+ struct alternative_function<Iterator, Context, Skipper, unused_type const>
+ {
+ alternative_function(
+ Iterator& first, Iterator const& last, Context& context,
+ Skipper const& skipper, unused_type)
+ : first(first), last(last), context(context), skipper(skipper)
+ {
+ }
+
+ template <typename Component>
+ bool operator()(Component const& component)
+ {
+ // return true if the parser succeeds
+ return component.parse(first, last, context, skipper,
+ unused);
+ }
+
+ Iterator& first;
+ Iterator const& last;
+ Context& context;
+ Skipper const& skipper;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ alternative_function& operator= (alternative_function const&);
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/assign_to.hpp b/boost/spirit/home/qi/detail/assign_to.hpp
new file mode 100644
index 0000000000..a94010ca91
--- /dev/null
+++ b/boost/spirit/home/qi/detail/assign_to.hpp
@@ -0,0 +1,363 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ASSIGN_TO_APR_16_2006_0812PM)
+#define BOOST_SPIRIT_ASSIGN_TO_APR_16_2006_0812PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/detail/construct.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/fusion/include/copy.hpp>
+#include <boost/ref.hpp>
+#include <boost/range/iterator_range.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This file contains assignment utilities. The utilities provided also
+ // accept spirit's unused_type; all no-ops. Compiler optimization will
+ // easily strip these away.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Iterator, typename Enable>
+ struct assign_to_attribute_from_iterators
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, Attribute& attr)
+ {
+ if (traits::is_empty(attr))
+ attr = Attribute(first, last);
+ else {
+ for (Iterator i = first; i != last; ++i)
+ push_back(attr, *i);
+ }
+ }
+ };
+
+ template <typename Attribute, typename Iterator>
+ struct assign_to_attribute_from_iterators<
+ reference_wrapper<Attribute>, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last
+ , reference_wrapper<Attribute> attr)
+ {
+ if (traits::is_empty(attr))
+ attr = Attribute(first, last);
+ else {
+ for (Iterator i = first; i != last; ++i)
+ push_back(attr, *i);
+ }
+ }
+ };
+
+ template <typename Attribute, typename Iterator>
+ struct assign_to_attribute_from_iterators<
+ boost::optional<Attribute>, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last
+ , boost::optional<Attribute>& attr)
+ {
+ Attribute val;
+ assign_to(first, last, val);
+ attr = val;
+ }
+ };
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<
+ iterator_range<Iterator>, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last
+ , iterator_range<Iterator>& attr)
+ {
+ attr = iterator_range<Iterator>(first, last);
+ }
+ };
+
+ template <typename Iterator, typename Attribute>
+ inline void
+ assign_to(Iterator const& first, Iterator const& last, Attribute& attr)
+ {
+ assign_to_attribute_from_iterators<Attribute, Iterator>::
+ call(first, last, attr);
+ }
+
+ template <typename Iterator>
+ inline void
+ assign_to(Iterator const&, Iterator const&, unused_type)
+ {
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Attribute>
+ void assign_to(T const& val, Attribute& attr);
+
+ template <typename Attribute, typename T, typename Enable>
+ struct assign_to_attribute_from_value
+ {
+ typedef typename traits::one_element_sequence<Attribute>::type
+ is_one_element_sequence;
+
+ typedef typename mpl::eval_if<
+ is_one_element_sequence
+ , fusion::result_of::at_c<Attribute, 0>
+ , mpl::identity<Attribute&>
+ >::type type;
+
+ template <typename T_>
+ static void
+ call(T_ const& val, Attribute& attr, mpl::false_)
+ {
+ attr = static_cast<Attribute>(val);
+ }
+
+ // This handles the case where the attribute is a single element fusion
+ // sequence. We silently assign to the only element and treat it as the
+ // attribute to parse the results into.
+ template <typename T_>
+ static void
+ call(T_ const& val, Attribute& attr, mpl::true_)
+ {
+ typedef typename fusion::result_of::value_at_c<Attribute, 0>::type
+ element_type;
+ fusion::at_c<0>(attr) = static_cast<element_type>(val);
+ }
+
+ static void
+ call(T const& val, Attribute& attr)
+ {
+ call(val, attr, is_one_element_sequence());
+ }
+ };
+
+ template <typename Attribute>
+ struct assign_to_attribute_from_value<Attribute, Attribute>
+ {
+ static void
+ call(Attribute const& val, Attribute& attr)
+ {
+ attr = val;
+ }
+ };
+
+ template <typename Attribute, typename T>
+ struct assign_to_attribute_from_value<Attribute, reference_wrapper<T>
+ , typename disable_if<is_same<Attribute, reference_wrapper<T> > >::type>
+ {
+ static void
+ call(reference_wrapper<T> const& val, Attribute& attr)
+ {
+ assign_to(val.get(), attr);
+ }
+ };
+
+ template <typename Attribute, typename T>
+ struct assign_to_attribute_from_value<Attribute, boost::optional<T>
+ , typename disable_if<is_same<Attribute, boost::optional<T> > >::type>
+ {
+ static void
+ call(boost::optional<T> const& val, Attribute& attr)
+ {
+ assign_to(val.get(), attr);
+ }
+ };
+
+ namespace detail
+ {
+ template <typename A, typename B>
+ struct is_same_size_sequence
+ : mpl::bool_<fusion::result_of::size<A>::value
+ == fusion::result_of::size<B>::value>
+ {};
+ }
+
+ template <typename Attribute, typename T>
+ struct assign_to_attribute_from_value<Attribute, T,
+ mpl::and_<
+ fusion::traits::is_sequence<Attribute>,
+ fusion::traits::is_sequence<T>,
+ detail::is_same_size_sequence<Attribute, T>
+ >
+ >
+ {
+ static void
+ call(T const& val, Attribute& attr)
+ {
+ fusion::copy(val, attr);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename T, typename Enable>
+ struct assign_to_container_from_value
+ {
+ // T is not a container and not a string
+ template <typename T_>
+ static void call(T_ const& val, Attribute& attr, mpl::false_, mpl::false_)
+ {
+ traits::push_back(attr, val);
+ }
+
+ // T is a container (but not a string), and T is convertible to the
+ // value_type of the Attribute container
+ template <typename T_>
+ static void
+ append_to_container_not_string(T_ const& val, Attribute& attr, mpl::true_)
+ {
+ traits::push_back(attr, val);
+ }
+
+ // T is a container (but not a string), generic overload
+ template <typename T_>
+ static void
+ append_to_container_not_string(T_ const& val, Attribute& attr, mpl::false_)
+ {
+ typedef typename traits::container_iterator<T_ const>::type
+ iterator_type;
+
+ iterator_type end = traits::end(val);
+ for (iterator_type i = traits::begin(val); i != end; traits::next(i))
+ traits::push_back(attr, traits::deref(i));
+ }
+
+ // T is a container (but not a string)
+ template <typename T_>
+ static void call(T_ const& val, Attribute& attr, mpl::true_, mpl::false_)
+ {
+ typedef typename container_value<Attribute>::type value_type;
+ typedef typename is_convertible<T, value_type>::type is_value_type;
+
+ append_to_container_not_string(val, attr, is_value_type());
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // T is a string
+ template <typename Iterator>
+ static void append_to_string(Attribute& attr, Iterator begin, Iterator end)
+ {
+ for (Iterator i = begin; i != end; ++i)
+ traits::push_back(attr, *i);
+ }
+
+ // T is string, but not convertible to value_type of container
+ template <typename T_>
+ static void append_to_container(T_ const& val, Attribute& attr, mpl::false_)
+ {
+ typedef typename char_type_of<T_>::type char_type;
+
+ append_to_string(attr, traits::get_begin<char_type>(val)
+ , traits::get_end<char_type>(val));
+ }
+
+ // T is string, and convertible to value_type of container
+ template <typename T_>
+ static void append_to_container(T_ const& val, Attribute& attr, mpl::true_)
+ {
+ traits::push_back(attr, val);
+ }
+
+ template <typename T_, typename Pred>
+ static void call(T_ const& val, Attribute& attr, Pred, mpl::true_)
+ {
+ typedef typename container_value<Attribute>::type value_type;
+ typedef typename is_convertible<T, value_type>::type is_value_type;
+
+ append_to_container(val, attr, is_value_type());
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ static void call(T const& val, Attribute& attr)
+ {
+ typedef typename traits::is_container<T>::type is_container;
+ typedef typename traits::is_string<T>::type is_string;
+
+ call(val, attr, is_container(), is_string());
+ }
+ };
+
+ template <typename Attribute>
+ struct assign_to_container_from_value<Attribute, Attribute>
+ {
+ static void
+ call(Attribute const& val, Attribute& attr)
+ {
+ attr = val;
+ }
+ };
+
+ template <typename Attribute, typename T>
+ struct assign_to_container_from_value<Attribute, boost::optional<T>
+ , typename disable_if<is_same<Attribute, boost::optional<T> > >::type>
+ {
+ static void
+ call(boost::optional<T> const& val, Attribute& attr)
+ {
+ assign_to(val.get(), attr);
+ }
+ };
+
+ template <typename Attribute, typename T>
+ struct assign_to_container_from_value<Attribute, reference_wrapper<T>
+ , typename disable_if<is_same<Attribute, reference_wrapper<T> > >::type>
+ {
+ static void
+ call(reference_wrapper<T> const& val, Attribute& attr)
+ {
+ assign_to(val.get(), attr);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ // overload for non-container attributes
+ template <typename T, typename Attribute>
+ inline void
+ assign_to(T const& val, Attribute& attr, mpl::false_)
+ {
+ assign_to_attribute_from_value<Attribute, T>::call(val, attr);
+ }
+
+ // overload for containers (but not for variants or optionals
+ // holding containers)
+ template <typename T, typename Attribute>
+ inline void
+ assign_to(T const& val, Attribute& attr, mpl::true_)
+ {
+ assign_to_container_from_value<Attribute, T>::call(val, attr);
+ }
+ }
+
+ template <typename T, typename Attribute>
+ inline void
+ assign_to(T const& val, Attribute& attr)
+ {
+ typedef typename mpl::and_<
+ traits::is_container<Attribute>
+ , traits::not_is_variant<Attribute>
+ , traits::not_is_optional<Attribute>
+ >::type is_not_wrapped_container;
+
+ detail::assign_to(val, attr, is_not_wrapped_container());
+ }
+
+ template <typename T>
+ inline void
+ assign_to(T const&, unused_type)
+ {
+ }
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/attributes.hpp b/boost/spirit/home/qi/detail/attributes.hpp
new file mode 100644
index 0000000000..0a66a65586
--- /dev/null
+++ b/boost/spirit/home/qi/detail/attributes.hpp
@@ -0,0 +1,176 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_QI_DETAIL_ATTRIBUTES_APR_18_2010_0458PM)
+#define SPIRIT_QI_DETAIL_ATTRIBUTES_APR_18_2010_0458PM
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/utree/utree_traits_fwd.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Exposed, typename Transformed>
+ struct default_transform_attribute
+ {
+ typedef Transformed type;
+
+ static Transformed pre(Exposed&) { return Transformed(); }
+
+ static void post(Exposed& val, Transformed const& attr)
+ {
+ traits::assign_to(attr, val);
+ }
+
+ // fail() will be called by Qi rule's if the rhs failed parsing
+ static void fail(Exposed&) {}
+ };
+
+ // handle case where no transformation is required as the types are the same
+ template <typename Attribute>
+ struct default_transform_attribute<Attribute, Attribute>
+ {
+ typedef Attribute& type;
+ static Attribute& pre(Attribute& val) { return val; }
+ static void post(Attribute&, Attribute const&) {}
+ static void fail(Attribute&) {}
+ };
+
+ template <typename Exposed, typename Transformed>
+ struct proxy_transform_attribute
+ {
+ typedef Transformed type;
+
+ static Transformed pre(Exposed& val) { return Transformed(val); }
+ static void post(Exposed&, Transformed const&) { /* no-op */ }
+
+ // fail() will be called by Qi rule's if the rhs failed parsing
+ static void fail(Exposed&) {}
+ };
+
+ // handle case where no transformation is required as the types are the same
+ template <typename Attribute>
+ struct proxy_transform_attribute<Attribute, Attribute>
+ {
+ typedef Attribute& type;
+ static Attribute& pre(Attribute& val) { return val; }
+ static void post(Attribute&, Attribute const&) {}
+ static void fail(Attribute&) {}
+ };
+
+ // main specialization for Qi
+ template <typename Exposed, typename Transformed, typename Enable = void>
+ struct transform_attribute
+ : mpl::if_<
+ mpl::and_<
+ mpl::not_<is_const<Exposed> >
+ , mpl::not_<is_reference<Exposed> >
+ , traits::is_proxy<Transformed> >
+ , proxy_transform_attribute<Exposed, Transformed>
+ , default_transform_attribute<Exposed, Transformed>
+ >::type
+ {};
+
+ template <typename Exposed, typename Transformed>
+ struct transform_attribute<boost::optional<Exposed>, Transformed
+ , typename disable_if<is_same<boost::optional<Exposed>, Transformed> >::type>
+ {
+ typedef Transformed& type;
+ static Transformed& pre(boost::optional<Exposed>& val)
+ {
+ if (!val)
+ val = Transformed();
+ return boost::get<Transformed>(val);
+ }
+ static void post(boost::optional<Exposed>&, Transformed const&) {}
+ static void fail(boost::optional<Exposed>& val)
+ {
+ val = none_t(); // leave optional uninitialized if rhs failed
+ }
+ };
+
+ // reference types need special handling
+ template <typename Attribute>
+ struct transform_attribute<Attribute&, Attribute>
+ {
+ typedef Attribute& type;
+ static Attribute& pre(Attribute& val) { return val; }
+ static void post(Attribute&, Attribute const&) {}
+ static void fail(Attribute&) {}
+ };
+
+ // unused_type needs some special handling as well
+ template <>
+ struct transform_attribute<unused_type, unused_type>
+ {
+ typedef unused_type type;
+ static unused_type pre(unused_type) { return unused; }
+ static void post(unused_type, unused_type) {}
+ static void fail(unused_type) {}
+ };
+
+ template <>
+ struct transform_attribute<unused_type const, unused_type>
+ : transform_attribute<unused_type, unused_type>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<unused_type, Attribute>
+ : transform_attribute<unused_type, unused_type>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<unused_type const, Attribute>
+ : transform_attribute<unused_type, unused_type>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<Attribute, unused_type>
+ : transform_attribute<unused_type, unused_type>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<Attribute const, unused_type>
+ : transform_attribute<unused_type, unused_type>
+ {};
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Exposed, typename Transformed>
+ struct transform_attribute<Exposed, Transformed, qi::domain>
+ : qi::transform_attribute<Exposed, Transformed>
+ {};
+
+ template <typename Exposed, typename Transformed>
+ struct transform_attribute<Exposed&, Transformed, qi::domain>
+ : transform_attribute<Exposed, Transformed, qi::domain>
+ {};
+
+ template <typename Attribute>
+ struct transform_attribute<Attribute&, Attribute, qi::domain>
+ : qi::transform_attribute<Attribute&, Attribute>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Exposed, typename Transformed>
+ void post_transform(Exposed& dest, Transformed const& attr)
+ {
+ return transform_attribute<Exposed, Transformed, qi::domain>::post(dest, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Exposed, typename Transformed>
+ void fail_transform(Exposed& dest, Transformed const&)
+ {
+ return transform_attribute<Exposed, Transformed, qi::domain>::fail(dest);
+ }
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/construct.hpp b/boost/spirit/home/qi/detail/construct.hpp
new file mode 100644
index 0000000000..5d8122f6a5
--- /dev/null
+++ b/boost/spirit/home/qi/detail/construct.hpp
@@ -0,0 +1,202 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CONSTRUCT_MAR_24_2007_0629PM)
+#define BOOST_SPIRIT_CONSTRUCT_MAR_24_2007_0629PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/spirit/home/qi/parse.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // We provide overloads for the assign_to_attribute_from_iterators
+ // customization point for all built in types
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<char, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const&, char& attr)
+ {
+ attr = *first;
+ }
+ };
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<signed char, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const&, signed char& attr)
+ {
+ attr = *first;
+ }
+ };
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<unsigned char, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const&, unsigned char& attr)
+ {
+ attr = *first;
+ }
+ };
+
+ // wchar_t is intrinsic
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<wchar_t, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const&, wchar_t& attr)
+ {
+ attr = *first;
+ }
+ };
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+ // wchar_t is intrinsic, have separate overload for unsigned short
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<unsigned short, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const&, unsigned short& attr)
+ {
+ attr = *first;
+ }
+ };
+#endif
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<bool, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, bool& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, bool_type(), attr);
+ }
+ };
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<short, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, short& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, short_type(), attr);
+ }
+ };
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<int, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, int& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, int_type(), attr);
+ }
+ };
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<unsigned int, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, unsigned int& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, uint_type(), attr);
+ }
+ };
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<long, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, long& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, long_type(), attr);
+ }
+ };
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<unsigned long, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, unsigned long& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, ulong_type(), attr);
+ }
+ };
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<long_long_type, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, long_long_type& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, long_long_type(), attr);
+ }
+ };
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<ulong_long_type, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, ulong_long_type& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, ulong_long_type(), attr);
+ }
+ };
+#endif
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<float, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, float& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, float_type(), attr);
+ }
+ };
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<double, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, double& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, double_type(), attr);
+ }
+ };
+
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<long double, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, long double& attr)
+ {
+ Iterator first_ = first;
+ qi::parse(first_, last, long_double_type(), attr);
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/enable_lit.hpp b/boost/spirit/home/qi/detail/enable_lit.hpp
new file mode 100644
index 0000000000..8bf2518297
--- /dev/null
+++ b/boost/spirit/home/qi/detail/enable_lit.hpp
@@ -0,0 +1,30 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_QI_DETAIL_ENABLE_LIT_JAN_06_2011_0945PM)
+#define BOOST_SPIRIT_QI_DETAIL_ENABLE_LIT_JAN_06_2011_0945PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+ // enables lazy lit(...) for qi
+ template <>
+ struct use_lazy_terminal<qi::domain, tag::lit, 1>
+ : mpl::true_ {};
+}}
+
+#endif
+
diff --git a/boost/spirit/home/qi/detail/expect_function.hpp b/boost/spirit/home/qi/detail/expect_function.hpp
new file mode 100644
index 0000000000..34dd910744
--- /dev/null
+++ b/boost/spirit/home/qi/detail/expect_function.hpp
@@ -0,0 +1,105 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_EXPECT_FUNCTION_APR_29_2007_0558PM)
+#define SPIRIT_EXPECT_FUNCTION_APR_29_2007_0558PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/multi_pass_wrapper.hpp>
+#include <boost/throw_exception.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ template <
+ typename Iterator, typename Context
+ , typename Skipper, typename Exception>
+ struct expect_function
+ {
+ typedef Iterator iterator_type;
+ typedef Context context_type;
+
+ expect_function(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper)
+ : first(first)
+ , last(last)
+ , context(context)
+ , skipper(skipper)
+ , is_first(true)
+ {
+ }
+
+ template <typename Component, typename Attribute>
+ bool operator()(Component const& component, Attribute& attr) const
+ {
+ // if this is not the first component in the expect chain we
+ // need to flush any multi_pass iterator we might be acting on
+ if (!is_first)
+ spirit::traits::clear_queue(first);
+
+ // if we are testing the first component in the sequence,
+ // return true if the parser fails, if this is not the first
+ // component, throw exception if the parser fails
+ if (!component.parse(first, last, context, skipper, attr))
+ {
+ if (is_first)
+ {
+ is_first = false;
+ return true; // true means the match failed
+ }
+ boost::throw_exception(Exception(first, last, component.what(context)));
+#if defined(BOOST_NO_EXCEPTIONS)
+ return true; // for systems not supporting exceptions
+#endif
+ }
+ is_first = false;
+ return false;
+ }
+
+ template <typename Component>
+ bool operator()(Component const& component) const
+ {
+ // if this is not the first component in the expect chain we
+ // need to flush any multi_pass iterator we might be acting on
+ if (!is_first)
+ spirit::traits::clear_queue(first);
+
+ // if we are testing the first component in the sequence,
+ // return true if the parser fails, if this not the first
+ // component, throw exception if the parser fails
+ if (!component.parse(first, last, context, skipper, unused))
+ {
+ if (is_first)
+ {
+ is_first = false;
+ return true;
+ }
+ boost::throw_exception(Exception(first, last, component.what(context)));
+#if defined(BOOST_NO_EXCEPTIONS)
+ return false; // for systems not supporting exceptions
+#endif
+ }
+ is_first = false;
+ return false;
+ }
+
+ Iterator& first;
+ Iterator const& last;
+ Context& context;
+ Skipper const& skipper;
+ mutable bool is_first;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ expect_function& operator= (expect_function const&);
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/fail_function.hpp b/boost/spirit/home/qi/detail/fail_function.hpp
new file mode 100644
index 0000000000..fca03b33f9
--- /dev/null
+++ b/boost/spirit/home/qi/detail/fail_function.hpp
@@ -0,0 +1,59 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_FAIL_FUNCTION_APRIL_22_2006_0159PM)
+#define SPIRIT_FAIL_FUNCTION_APRIL_22_2006_0159PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ template <typename Iterator, typename Context, typename Skipper>
+ struct fail_function
+ {
+ typedef Iterator iterator_type;
+ typedef Context context_type;
+
+ fail_function(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper)
+ : first(first)
+ , last(last)
+ , context(context)
+ , skipper(skipper)
+ {
+ }
+
+ template <typename Component, typename Attribute>
+ bool operator()(Component const& component, Attribute& attr) const
+ {
+ // return true if the parser fails
+ return !component.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Component>
+ bool operator()(Component const& component) const
+ {
+ // return true if the parser fails
+ return !component.parse(first, last, context, skipper, unused);
+ }
+
+ Iterator& first;
+ Iterator const& last;
+ Context& context;
+ Skipper const& skipper;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ fail_function& operator= (fail_function const&);
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/parse.hpp b/boost/spirit/home/qi/detail/parse.hpp
new file mode 100644
index 0000000000..b81f1e76a0
--- /dev/null
+++ b/boost/spirit/home/qi/detail/parse.hpp
@@ -0,0 +1,97 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_DETAIL_PARSE_DEC_02_2009_0411PM)
+#define BOOST_SPIRIT_DETAIL_PARSE_DEC_02_2009_0411PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_flag.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Enable = void>
+ struct parse_impl
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ // Did you intend to use the auto_ facilities while forgetting to
+ // #include <boost/spirit/include/qi_auto.hpp>?
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ };
+
+ template <typename Expr>
+ struct parse_impl<Expr
+ , typename enable_if<traits::matches<qi::domain, Expr> >::type>
+ {
+ template <typename Iterator>
+ static bool call(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr)
+ {
+ return compile<qi::domain>(expr).parse(
+ first, last, unused, unused, unused);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Enable = void>
+ struct phrase_parse_impl
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ // Did you intend to use the auto_ facilities while forgetting to
+ // #include <boost/spirit/include/qi_auto.hpp>?
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ };
+
+ template <typename Expr>
+ struct phrase_parse_impl<Expr
+ , typename enable_if<traits::matches<qi::domain, Expr> >::type>
+ {
+ template <typename Iterator, typename Skipper>
+ static bool call(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the skipper is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+
+ typedef
+ typename result_of::compile<qi::domain, Skipper>::type
+ skipper_type;
+ skipper_type const skipper_ = compile<qi::domain>(skipper);
+
+ if (!compile<qi::domain>(expr).parse(
+ first, last, unused, skipper_, unused))
+ return false;
+
+ if (post_skip == skip_flag::postskip)
+ qi::skip_over(first, last, skipper_);
+ return true;
+ }
+ };
+
+}}}}
+
+#endif
+
diff --git a/boost/spirit/home/qi/detail/parse_auto.hpp b/boost/spirit/home/qi/detail/parse_auto.hpp
new file mode 100644
index 0000000000..a61a0b48ae
--- /dev/null
+++ b/boost/spirit/home/qi/detail/parse_auto.hpp
@@ -0,0 +1,191 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_DETAIL_PARSE_AUTO_DEC_02_2009_0426PM)
+#define BOOST_SPIRIT_DETAIL_PARSE_AUTO_DEC_02_2009_0426PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/parse.hpp>
+#include <boost/spirit/home/qi/auto/create_parser.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/and.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ struct parse_impl<Expr
+ , typename enable_if<
+ mpl::and_<
+ traits::meta_create_exists<qi::domain, Expr>
+ , mpl::not_<traits::matches<qi::domain, Expr> > >
+ >::type>
+ {
+ template <typename Iterator>
+ static bool call(Iterator& first, Iterator last, Expr& expr)
+ {
+ return qi::parse(first, last, create_parser<Expr>(), expr);
+ }
+
+ template <typename Iterator>
+ static bool call(Iterator& first, Iterator last, Expr const& expr)
+ {
+ return qi::parse(first, last, create_parser<Expr>()
+ , const_cast<Expr&>(expr));
+ }
+ };
+
+ // the following specializations are needed to explicitly disambiguate
+ // the two possible specializations for parse_impl<char> and
+ // parse_impl<wchar_t>
+ template <>
+ struct parse_impl<char>
+ {
+ template <typename Iterator>
+ static bool call(Iterator& first, Iterator last, char& expr)
+ {
+ return qi::parse(first, last, create_parser<char>(), expr);
+ }
+
+ template <typename Iterator>
+ static bool call(Iterator& first, Iterator last, char const&)
+ {
+ return qi::parse(first, last, create_parser<char>());
+ }
+ };
+
+ template <>
+ struct parse_impl<wchar_t>
+ {
+ template <typename Iterator>
+ static bool call(Iterator& first, Iterator last, wchar_t& expr)
+ {
+ return qi::parse(first, last, create_parser<wchar_t>(), expr);
+ }
+
+ template <typename Iterator>
+ static bool call(Iterator& first, Iterator last, wchar_t const&)
+ {
+ return qi::parse(first, last, create_parser<wchar_t>());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ struct phrase_parse_impl<Expr
+ , typename enable_if<
+ mpl::and_<
+ traits::meta_create_exists<qi::domain, Expr>
+ , mpl::not_<traits::matches<qi::domain, Expr> > >
+ >::type>
+ {
+ template <typename Iterator, typename Skipper>
+ static bool call(Iterator& first, Iterator last, Expr& expr
+ , Skipper const& skipper, BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ return qi::phrase_parse(first, last, create_parser<Expr>()
+ , skipper, post_skip, expr);
+ }
+
+ template <typename Iterator, typename Skipper>
+ static bool call(Iterator& first, Iterator last, Expr const& expr
+ , Skipper const& skipper, BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ return qi::phrase_parse(first, last, create_parser<Expr>()
+ , skipper, post_skip, const_cast<Expr&>(expr));
+ }
+ };
+
+ // the following specializations are needed to explicitly disambiguate
+ // the two possible specializations for phrase_parse_impl<char> and
+ // phrase_parse_impl<wchar_t>
+ template <>
+ struct phrase_parse_impl<char>
+ {
+ template <typename Iterator, typename Skipper>
+ static bool call(Iterator& first, Iterator last, char& expr
+ , Skipper const& skipper, BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ return qi::phrase_parse(first, last, create_parser<char>()
+ , skipper, post_skip, expr);
+ }
+
+ template <typename Iterator, typename Skipper>
+ static bool call(Iterator& first, Iterator last, char const&
+ , Skipper const& skipper, BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ return qi::phrase_parse(first, last, create_parser<char>()
+ , skipper, post_skip);
+ }
+ };
+
+ template <>
+ struct phrase_parse_impl<wchar_t>
+ {
+ template <typename Iterator, typename Skipper>
+ static bool call(Iterator& first, Iterator last, wchar_t& expr
+ , Skipper const& skipper, BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ return qi::phrase_parse(first, last, create_parser<wchar_t>()
+ , skipper, post_skip, expr);
+ }
+
+ template <typename Iterator, typename Skipper>
+ static bool call(Iterator& first, Iterator last, wchar_t const&
+ , Skipper const& skipper, BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ return qi::phrase_parse(first, last, create_parser<wchar_t>()
+ , skipper, post_skip);
+ }
+ };
+}}}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr>
+ inline bool
+ parse(
+ Iterator& first
+ , Iterator last
+ , Expr& expr)
+ {
+ // Make sure the iterator is at least a forward_iterator. If you got a
+ // compilation error here, then you are using an input_iterator while
+ // calling this function, you need to supply at least a
+ // forward_iterator instead.
+ BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+ return detail::parse_impl<Expr>::call(first, last, expr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr, typename Skipper>
+ inline bool
+ phrase_parse(
+ Iterator& first
+ , Iterator last
+ , Expr& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip)
+ {
+ // Make sure the iterator is at least a forward_iterator. If you got a
+ // compilation error here, then you are using an input_iterator while
+ // calling this function, you need to supply at least a
+ // forward_iterator instead.
+ BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+ return detail::phrase_parse_impl<Expr>::call(
+ first, last, expr, skipper, post_skip);
+ }
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/qi/detail/pass_container.hpp b/boost/spirit/home/qi/detail/pass_container.hpp
new file mode 100644
index 0000000000..82e153aa3a
--- /dev/null
+++ b/boost/spirit/home/qi/detail/pass_container.hpp
@@ -0,0 +1,362 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_PASS_CONTAINER_JANUARY_06_2009_0802PM)
+#define SPIRIT_PASS_CONTAINER_JANUARY_06_2009_0802PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ // Helper meta-function allowing to evaluate weak substitutability and
+ // negate the result if the predicate (Sequence) is not true
+ template <typename Sequence, typename Attribute, typename ValueType>
+ struct negate_weak_substitute_if_not
+ : mpl::if_<
+ Sequence
+ , typename traits::is_weak_substitute<Attribute, ValueType>::type
+ , typename mpl::not_<
+ traits::is_weak_substitute<Attribute, ValueType>
+ >::type>
+ {};
+
+ // pass_through_container: utility to check decide whether a provided
+ // container attribute needs to be passed through to the current component
+ // or of we need to split the container by passing along instances of its
+ // value type
+
+ // if the expected attribute of the current component is neither a Fusion
+ // sequence nor a container, we will pass through the provided container
+ // only if its value type is not compatible with the component
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence, typename Enable = void>
+ struct pass_through_container_base
+ : negate_weak_substitute_if_not<Sequence, Attribute, ValueType>
+ {};
+
+ // Specialization for fusion sequences, in this case we check whether all
+ // the types in the sequence are convertible to the lhs attribute.
+ //
+ // We return false if the rhs attribute itself is a fusion sequence, which
+ // is compatible with the LHS sequence (we want to pass through this
+ // attribute without it being split apart).
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence = mpl::true_>
+ struct not_compatible_element
+ : mpl::and_<
+ negate_weak_substitute_if_not<Sequence, Attribute, Container>
+ , negate_weak_substitute_if_not<Sequence, Attribute, ValueType> >
+ {};
+
+ // If the value type of the container is not a Fusion sequence, we pass
+ // through the container if each of the elements of the Attribute
+ // sequence is compatible with either the container or its value type.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence
+ , bool IsSequence = fusion::traits::is_sequence<ValueType>::value>
+ struct pass_through_container_fusion_sequence
+ {
+ typedef typename mpl::find_if<
+ Attribute, not_compatible_element<Container, ValueType, mpl::_1>
+ >::type iter;
+ typedef typename mpl::end<Attribute>::type end;
+
+ typedef typename is_same<iter, end>::type type;
+ };
+
+ // If both, the Attribute and the value type of the provided container
+ // are Fusion sequences, we pass the container only if the two
+ // sequences are not compatible.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container_fusion_sequence<
+ Container, ValueType, Attribute, Sequence, true>
+ {
+ typedef typename mpl::find_if<
+ Attribute
+ , not_compatible_element<Container, ValueType, mpl::_1, Sequence>
+ >::type iter;
+ typedef typename mpl::end<Attribute>::type end;
+
+ typedef typename is_same<iter, end>::type type;
+ };
+
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container_base<Container, ValueType, Attribute
+ , Sequence
+ , typename enable_if<fusion::traits::is_sequence<Attribute> >::type>
+ : pass_through_container_fusion_sequence<
+ Container, ValueType, Attribute, Sequence>
+ {};
+
+ // Specialization for containers
+ //
+ // If the value type of the attribute of the current component is not
+ // a Fusion sequence, we have to pass through the provided container if
+ // both are compatible.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence, typename AttributeValueType
+ , bool IsSequence = fusion::traits::is_sequence<AttributeValueType>::value>
+ struct pass_through_container_container
+ : mpl::or_<
+ traits::is_weak_substitute<Attribute, Container>
+ , traits::is_weak_substitute<AttributeValueType, Container> >
+ {};
+
+ // If the value type of the exposed container attribute is a Fusion
+ // sequence, we use the already existing logic for those.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence, typename AttributeValueType>
+ struct pass_through_container_container<
+ Container, ValueType, Attribute, Sequence, AttributeValueType, true>
+ : pass_through_container_fusion_sequence<
+ Container, ValueType, AttributeValueType, Sequence>
+ {};
+
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container_base<
+ Container, ValueType, Attribute, Sequence
+ , typename enable_if<traits::is_container<Attribute> >::type>
+ : detail::pass_through_container_container<
+ Container, ValueType, Attribute, Sequence
+ , typename traits::container_value<Attribute>::type>
+ {};
+
+ // Specialization for exposed optional attributes
+ //
+ // If the type embedded in the exposed optional is not a Fusion
+ // sequence we pass through the container attribute if it is compatible
+ // either to the optionals embedded type or to the containers value
+ // type.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence
+ , bool IsSequence = fusion::traits::is_sequence<Attribute>::value>
+ struct pass_through_container_optional
+ : mpl::or_<
+ traits::is_weak_substitute<Attribute, Container>
+ , traits::is_weak_substitute<Attribute, ValueType> >
+ {};
+
+ // If the embedded type of the exposed optional attribute is a Fusion
+ // sequence, we use the already existing logic for those.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container_optional<
+ Container, ValueType, Attribute, Sequence, true>
+ : pass_through_container_fusion_sequence<
+ Container, ValueType, Attribute, Sequence>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container
+ : pass_through_container_base<Container, ValueType, Attribute, Sequence>
+ {};
+
+ // Handle optional attributes
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container<
+ Container, ValueType, boost::optional<Attribute>, Sequence>
+ : pass_through_container_optional<
+ Container, ValueType, Attribute, Sequence>
+ {};
+
+ // If both, the containers value type and the exposed attribute type are
+ // optionals we are allowed to pass through the the container only if the
+ // embedded types of those optionals are not compatible.
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container<
+ Container, boost::optional<ValueType>, boost::optional<Attribute>
+ , Sequence>
+ : mpl::not_<traits::is_weak_substitute<Attribute, ValueType> >
+ {};
+
+ // Specialization for exposed variant attributes
+ //
+ // We pass through the container attribute if at least one of the embedded
+ // types in the variant requires to pass through the attribute
+
+#define BOOST_SPIRIT_PASS_THROUGH_CONTAINER(z, N, _) \
+ pass_through_container<Container, ValueType, \
+ BOOST_PP_CAT(T, N), Sequence>::type::value || \
+ /***/
+
+ // make sure unused variant parameters do not affect the outcome
+ template <typename Container, typename ValueType, typename Sequence>
+ struct pass_through_container<Container, ValueType
+ , boost::detail::variant::void_, Sequence>
+ : mpl::false_
+ {};
+
+ template <typename Container, typename ValueType, typename Sequence
+ , BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct pass_through_container<Container, ValueType
+ , boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Sequence>
+ : mpl::bool_<BOOST_PP_REPEAT(BOOST_VARIANT_LIMIT_TYPES
+ , BOOST_SPIRIT_PASS_THROUGH_CONTAINER, _) false>
+ {};
+
+#undef BOOST_SPIRIT_PASS_THROUGH_CONTAINER
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // forwarding customization point for domain qi::domain
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence>
+ struct pass_through_container<
+ Container, ValueType, Attribute, Sequence, qi::domain>
+ : qi::detail::pass_through_container<
+ Container, ValueType, Attribute, Sequence>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This function handles the case where the attribute (Attr) given
+ // the sequence is an STL container. This is a wrapper around F.
+ // The function F does the actual parsing.
+ template <typename F, typename Attr, typename Sequence>
+ struct pass_container
+ {
+ typedef typename F::context_type context_type;
+ typedef typename F::iterator_type iterator_type;
+
+ pass_container(F const& f, Attr& attr)
+ : f(f), attr(attr) {}
+
+ // this is for the case when the current element exposes an attribute
+ // which is pushed back onto the container
+ template <typename Component>
+ bool dispatch_container(Component const& component, mpl::false_) const
+ {
+ // synthesized attribute needs to be default constructed
+ typename traits::container_value<Attr>::type val =
+ typename traits::container_value<Attr>::type();
+
+ iterator_type save = f.first;
+ bool r = f(component, val);
+ if (!r)
+ {
+ // push the parsed value into our attribute
+ r = !traits::push_back(attr, val);
+ if (r)
+ f.first = save;
+ }
+ return r;
+ }
+
+ // this is for the case when the current element is able to handle an
+ // attribute which is a container itself, this element will push its
+ // data directly into the attribute container
+ template <typename Component>
+ bool dispatch_container(Component const& component, mpl::true_) const
+ {
+ return f(component, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // this is for the case when the current element doesn't expect an
+ // attribute
+ template <typename Component>
+ bool dispatch_attribute(Component const& component, mpl::false_) const
+ {
+ return f(component, unused);
+ }
+
+ // the current element expects an attribute
+ template <typename Component>
+ bool dispatch_attribute(Component const& component, mpl::true_) const
+ {
+ typedef typename traits::container_value<Attr>::type value_type;
+ typedef typename traits::attribute_of<
+ Component, context_type, iterator_type>::type
+ rhs_attribute;
+
+ // this predicate detects, whether the attribute of the current
+ // element is a substitute for the value type of the container
+ // attribute
+ typedef mpl::and_<
+ traits::handles_container<
+ Component, Attr, context_type, iterator_type>
+ , traits::pass_through_container<
+ Attr, value_type, rhs_attribute, Sequence, qi::domain>
+ > predicate;
+
+ return dispatch_container(component, predicate());
+ }
+
+ // Dispatches to dispatch_main depending on the attribute type
+ // of the Component
+ template <typename Component>
+ bool operator()(Component const& component) const
+ {
+ // we need to dispatch depending on the type of the attribute
+ // of the current element (component). If this is has no attribute
+ // we shouldn't pass an attribute at all.
+ typedef typename traits::not_is_unused<
+ typename traits::attribute_of<
+ Component, context_type, iterator_type
+ >::type
+ >::type predicate;
+
+ // ensure the attribute is actually a container type
+ traits::make_container(attr);
+
+ return dispatch_attribute(component, predicate());
+ }
+
+ F f;
+ Attr& attr;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ pass_container& operator= (pass_container const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Utility function to make a pass_container for container components
+ // (kleene, list, plus, repeat)
+ template <typename F, typename Attr>
+ inline pass_container<F, Attr, mpl::false_>
+ make_pass_container(F const& f, Attr& attr)
+ {
+ return pass_container<F, Attr, mpl::false_>(f, attr);
+ }
+
+ // Utility function to make a pass_container for sequences
+ template <typename F, typename Attr>
+ inline pass_container<F, Attr, mpl::true_>
+ make_sequence_pass_container(F const& f, Attr& attr)
+ {
+ return pass_container<F, Attr, mpl::true_>(f, attr);
+ }
+}}}}
+
+#endif
+
diff --git a/boost/spirit/home/qi/detail/pass_function.hpp b/boost/spirit/home/qi/detail/pass_function.hpp
new file mode 100644
index 0000000000..2d9e6bab26
--- /dev/null
+++ b/boost/spirit/home/qi/detail/pass_function.hpp
@@ -0,0 +1,70 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_PASS_FUNCTION_FEBRUARY_05_2007_1138AM)
+#define SPIRIT_PASS_FUNCTION_FEBRUARY_05_2007_1138AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/optional.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ template <typename Iterator, typename Context, typename Skipper>
+ struct pass_function
+ {
+ pass_function(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper)
+ : first(first)
+ , last(last)
+ , context(context)
+ , skipper(skipper)
+ {
+ }
+
+ template <typename Component, typename Attribute>
+ bool operator()(Component const& component, Attribute& attr)
+ {
+ // return true if the parser succeeds
+ return component.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Component, typename Attribute>
+ bool operator()(Component const& component, boost::optional<Attribute>& attr)
+ {
+ // return true if the parser succeeds
+ Attribute val;
+ if (component.parse(first, last, context, skipper, val))
+ {
+ attr = val;
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Component>
+ bool operator()(Component const& component)
+ {
+ // return true if the parser succeeds
+ return component.parse(first, last, context, skipper, unused);
+ }
+
+ Iterator& first;
+ Iterator const& last;
+ Context& context;
+ Skipper const& skipper;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ pass_function& operator= (pass_function const&);
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/permute_function.hpp b/boost/spirit/home/qi/detail/permute_function.hpp
new file mode 100644
index 0000000000..13c1b8c123
--- /dev/null
+++ b/boost/spirit/home/qi/detail/permute_function.hpp
@@ -0,0 +1,88 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_PERMUTE_FUNCTION_MARCH_13_2007_1129AM)
+#define SPIRIT_PERMUTE_FUNCTION_MARCH_13_2007_1129AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/optional.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ template <typename Iterator, typename Context, typename Skipper>
+ struct permute_function
+ {
+ permute_function(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper)
+ : first(first)
+ , last(last)
+ , context(context)
+ , skipper(skipper)
+ {
+ }
+
+ template <typename Component, typename Attribute>
+ bool operator()(Component const& component, Attribute& attr)
+ {
+ // return true if the parser succeeds and the slot is not yet taken
+ if (!*taken && component.parse(first, last, context, skipper, attr))
+ {
+ *taken = true;
+ ++taken;
+ return true;
+ }
+ ++taken;
+ return false;
+ }
+
+ template <typename Component, typename Attribute>
+ bool operator()(Component const& component, boost::optional<Attribute>& attr)
+ {
+ // return true if the parser succeeds and the slot is not yet taken
+ Attribute val;
+ if (!*taken && component.parse(first, last, context, skipper, val))
+ {
+ attr = val;
+ *taken = true;
+ ++taken;
+ return true;
+ }
+ ++taken;
+ return false;
+ }
+
+ template <typename Component>
+ bool operator()(Component const& component)
+ {
+ // return true if the parser succeeds and the slot is not yet taken
+ if (!*taken && component.parse(first, last, context, skipper, unused))
+ {
+ *taken = true;
+ ++taken;
+ return true;
+ }
+ ++taken;
+ return false;
+ }
+
+ Iterator& first;
+ Iterator const& last;
+ Context& context;
+ Skipper const& skipper;
+ bool* taken;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ permute_function& operator= (permute_function const&);
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/string_parse.hpp b/boost/spirit/home/qi/detail/string_parse.hpp
new file mode 100644
index 0000000000..4025df550d
--- /dev/null
+++ b/boost/spirit/home/qi/detail/string_parse.hpp
@@ -0,0 +1,89 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_STRING_PARSE_APR_18_2006_1125PM)
+#define BOOST_SPIRIT_STRING_PARSE_APR_18_2006_1125PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ template <typename Char, typename Iterator, typename Attribute>
+ inline bool string_parse(
+ Char const* str
+ , Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ Iterator i = first;
+ Char ch = *str;
+
+ for (; !!ch; ++i)
+ {
+ if (i == last || (ch != *i))
+ return false;
+ ch = *++str;
+ }
+
+ spirit::traits::assign_to(first, i, attr);
+ first = i;
+ return true;
+ }
+
+ template <typename String, typename Iterator, typename Attribute>
+ inline bool string_parse(
+ String const& str
+ , Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ Iterator i = first;
+ typename String::const_iterator stri = str.begin();
+ typename String::const_iterator str_last = str.end();
+
+ for (; stri != str_last; ++stri, ++i)
+ if (i == last || (*stri != *i))
+ return false;
+ spirit::traits::assign_to(first, i, attr);
+ first = i;
+ return true;
+ }
+
+ template <typename Char, typename Iterator, typename Attribute>
+ inline bool string_parse(
+ Char const* uc_i, Char const* lc_i
+ , Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ Iterator i = first;
+
+ for (; *uc_i && *lc_i; ++uc_i, ++lc_i, ++i)
+ if (i == last || ((*uc_i != *i) && (*lc_i != *i)))
+ return false;
+ spirit::traits::assign_to(first, i, attr);
+ first = i;
+ return true;
+ }
+
+ template <typename String, typename Iterator, typename Attribute>
+ inline bool string_parse(
+ String const& ucstr, String const& lcstr
+ , Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ typename String::const_iterator uc_i = ucstr.begin();
+ typename String::const_iterator uc_last = ucstr.end();
+ typename String::const_iterator lc_i = lcstr.begin();
+ Iterator i = first;
+
+ for (; uc_i != uc_last; ++uc_i, ++lc_i, ++i)
+ if (i == last || ((*uc_i != *i) && (*lc_i != *i)))
+ return false;
+ spirit::traits::assign_to(first, i, attr);
+ first = i;
+ return true;
+ }
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/detail/unused_skipper.hpp b/boost/spirit/home/qi/detail/unused_skipper.hpp
new file mode 100644
index 0000000000..c1405d67c7
--- /dev/null
+++ b/boost/spirit/home/qi/detail/unused_skipper.hpp
@@ -0,0 +1,50 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_QI_UNUSED_SKIPPER_JUL_25_2009_0921AM)
+#define BOOST_SPIRIT_QI_UNUSED_SKIPPER_JUL_25_2009_0921AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ template <typename Skipper>
+ struct unused_skipper : unused_type
+ {
+ unused_skipper(Skipper const& skipper)
+ : skipper(skipper) {}
+ Skipper const& skipper;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ unused_skipper& operator= (unused_skipper const&);
+ };
+
+ // If a surrounding lexeme[] directive was specified, the current
+ // skipper is of the type unused_skipper. In this case we
+ // re-activate the skipper which was active before the skip[]
+ // directive.
+ template <typename Skipper>
+ inline Skipper const&
+ get_skipper(unused_skipper<Skipper> const& u)
+ {
+ return u.skipper;
+ }
+
+ // If no surrounding lexeme[] directive was specified we keep what we got.
+ template <typename Skipper>
+ inline Skipper const&
+ get_skipper(Skipper const& u)
+ {
+ return u;
+ }
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive.hpp b/boost/spirit/home/qi/directive.hpp
new file mode 100644
index 0000000000..6d97ce491d
--- /dev/null
+++ b/boost/spirit/home/qi/directive.hpp
@@ -0,0 +1,26 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_DIRECTIVE_FEBRUARY_05_2007_0313PM)
+#define BOOST_SPIRIT_DIRECTIVE_FEBRUARY_05_2007_0313PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/as.hpp>
+#include <boost/spirit/home/qi/directive/encoding.hpp>
+#include <boost/spirit/home/qi/directive/hold.hpp>
+#include <boost/spirit/home/qi/directive/lexeme.hpp>
+#include <boost/spirit/home/qi/directive/no_skip.hpp>
+#include <boost/spirit/home/qi/directive/matches.hpp>
+#include <boost/spirit/home/qi/directive/no_case.hpp>
+#include <boost/spirit/home/qi/directive/omit.hpp>
+#include <boost/spirit/home/qi/directive/raw.hpp>
+#include <boost/spirit/home/qi/directive/repeat.hpp>
+#include <boost/spirit/home/qi/directive/skip.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/directive/as.hpp b/boost/spirit/home/qi/directive/as.hpp
new file mode 100644
index 0000000000..9ace587caf
--- /dev/null
+++ b/boost/spirit/home/qi/directive/as.hpp
@@ -0,0 +1,178 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ 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)
+=============================================================================*/
+#if !defined(SPIRIT_AS_DECEMBER_6_2010_1013AM)
+#define SPIRIT_AS_DECEMBER_6_2010_1013AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <string>
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename T>
+ struct as
+ : stateful_tag_type<T, tag::as>
+ {
+ //~ BOOST_SPIRIT_ASSERT_MSG(
+ //~ (traits::is_container<T>::type::value),
+ //~ error_type_must_be_a_container,
+ //~ (T));
+ };
+}}}
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ // enables as_string[...]
+ template <>
+ struct use_directive<qi::domain, tag::as_string>
+ : mpl::true_ {};
+
+ // enables as_wstring[...]
+ template <>
+ struct use_directive<qi::domain, tag::as_wstring>
+ : mpl::true_ {};
+
+ // enables as<T>[...]
+ template <typename T>
+ struct use_directive<qi::domain, tag::stateful_tag<T, tag::as> >
+ : mpl::true_
+ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::as_string;
+ using spirit::as_wstring;
+#endif
+ using spirit::as_string_type;
+ using spirit::as_wstring_type;
+
+ template <typename Subject, typename T>
+ struct as_directive : unary_parser<as_directive<Subject, T> >
+ {
+ typedef Subject subject_type;
+ as_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, Attribute& attr) const
+ {
+ Iterator i = first;
+ T as_attr;
+ if (subject.parse(i, last, context, skipper, as_attr))
+ {
+ spirit::traits::assign_to(as_attr, attr);
+ first = i;
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Iterator, typename Context, typename Skipper>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, T& attr) const
+ {
+ Iterator i = first;
+ if (subject.parse(i, last, context, skipper, attr))
+ {
+ first = i;
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("as", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::as_string, Subject, Modifiers>
+ {
+ typedef as_directive<Subject, std::string> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::as_wstring, Subject, Modifiers>
+ {
+ typedef as_directive<Subject, std::basic_string<wchar_t> > result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<tag::stateful_tag<T, tag::as>, Subject, Modifiers>
+ {
+ typedef as_directive<Subject, T> result_type;
+ result_type operator()(unused_type, Subject const& subject
+ , unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename T>
+ struct has_semantic_action<qi::as_directive<Subject, T> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename T, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::as_directive<Subject, T>, Attribute
+ , Context, Iterator>
+ : mpl::false_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/encoding.hpp b/boost/spirit/home/qi/directive/encoding.hpp
new file mode 100644
index 0000000000..5eaf0f6b50
--- /dev/null
+++ b/boost/spirit/home/qi/directive/encoding.hpp
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_ENCODING_MARCH_05_2010_0528PM)
+#define SPIRIT_ENCODING_MARCH_05_2010_0528PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct use_directive<
+ qi::domain, tag::char_code<tag::encoding, CharEncoding> > // enables encoding
+ : mpl::true_ {};
+
+ template <typename CharEncoding>
+ struct is_modifier_directive<qi::domain, tag::char_code<tag::encoding, CharEncoding> >
+ : mpl::true_ {};
+}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/hold.hpp b/boost/spirit/home/qi/directive/hold.hpp
new file mode 100644
index 0000000000..d5b2ed5601
--- /dev/null
+++ b/boost/spirit/home/qi/directive/hold.hpp
@@ -0,0 +1,109 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_HOLD_FEBRUARY_6_2010_0917AM)
+#define SPIRIT_HOLD_FEBRUARY_6_2010_0917AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<qi::domain, tag::hold> // enables hold
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::hold;
+#endif
+ using spirit::hold_type;
+
+ template <typename Subject>
+ struct hold_directive : unary_parser<hold_directive<Subject> >
+ {
+ typedef Subject subject_type;
+ hold_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::attribute_of<subject_type, Context, Iterator>::type
+ type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, Attribute& attr) const
+ {
+ Attribute copy(attr);
+ if (subject.parse(first, last, context, skipper, copy))
+ {
+ traits::swap_impl(copy, attr);
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("hold", subject.what(context));
+
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::hold, Subject, Modifiers>
+ {
+ typedef hold_directive<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::hold_directive<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::hold_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/lexeme.hpp b/boost/spirit/home/qi/directive/lexeme.hpp
new file mode 100644
index 0000000000..f0b83993ef
--- /dev/null
+++ b/boost/spirit/home/qi/directive/lexeme.hpp
@@ -0,0 +1,106 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_LEXEME_MARCH_24_2007_0802AM)
+#define SPIRIT_LEXEME_MARCH_24_2007_0802AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/unused_skipper.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<qi::domain, tag::lexeme> // enables lexeme
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::lexeme;
+#endif
+ using spirit::lexeme_type;
+
+ template <typename Subject>
+ struct lexeme_directive : unary_parser<lexeme_directive<Subject> >
+ {
+ typedef Subject subject_type;
+ lexeme_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::attribute_of<subject_type, Context, Iterator>::type
+ type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper);
+ return subject.parse(first, last, context
+ , detail::unused_skipper<Skipper>(skipper), attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("lexeme", subject.what(context));
+
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::lexeme, Subject, Modifiers>
+ {
+ typedef lexeme_directive<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::lexeme_directive<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::lexeme_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/matches.hpp b/boost/spirit/home/qi/directive/matches.hpp
new file mode 100644
index 0000000000..b5349272d4
--- /dev/null
+++ b/boost/spirit/home/qi/directive/matches.hpp
@@ -0,0 +1,108 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_MATCHES_JAN_07_2010_0745PM)
+#define SPIRIT_MATCHES_JAN_07_2010_0745PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<qi::domain, tag::matches> // enables matches
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::matches;
+#endif
+ using spirit::matches_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // matches_directive returns whether the embedded parser matched
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct matches_directive : unary_parser<matches_directive<Subject> >
+ {
+ typedef Subject subject_type;
+ matches_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef bool type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, Attribute& attr) const
+ {
+ bool result = subject.parse(first, last, context, skipper, unused);
+ spirit::traits::assign_to(result, attr);
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("matches", subject.what(context));
+ }
+
+ Subject subject;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ matches_directive& operator= (matches_directive const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::matches, Subject, Modifiers>
+ {
+ typedef matches_directive<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::matches_directive<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::matches_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/no_case.hpp b/boost/spirit/home/qi/directive/no_case.hpp
new file mode 100644
index 0000000000..1bd8b62a79
--- /dev/null
+++ b/boost/spirit/home/qi/directive/no_case.hpp
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_NO_CASE_OCTOBER_25_2008_0424PM)
+#define SPIRIT_NO_CASE_OCTOBER_25_2008_0424PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct use_directive<
+ qi::domain, tag::char_code<tag::no_case, CharEncoding> > // enables no_case
+ : mpl::true_ {};
+
+ template <typename CharEncoding>
+ struct is_modifier_directive<qi::domain, tag::char_code<tag::no_case, CharEncoding> >
+ : mpl::true_ {};
+}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/no_skip.hpp b/boost/spirit/home/qi/directive/no_skip.hpp
new file mode 100644
index 0000000000..9764d4a661
--- /dev/null
+++ b/boost/spirit/home/qi/directive/no_skip.hpp
@@ -0,0 +1,108 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_NO_SKIP_JAN_16_2010_0802PM)
+#define SPIRIT_NO_SKIP_JAN_16_2010_0802PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/unused_skipper.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<qi::domain, tag::no_skip> // enables no_skip
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::no_skip;
+#endif
+ using spirit::no_skip_type;
+
+ // same as lexeme[], but does not pre-skip
+ template <typename Subject>
+ struct no_skip_directive : unary_parser<no_skip_directive<Subject> >
+ {
+ typedef Subject subject_type;
+ no_skip_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::attribute_of<subject_type, Context, Iterator>::type
+ type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ return subject.parse(first, last, context
+ , detail::unused_skipper<Skipper>(skipper), attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("no_skip", subject.what(context));
+
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::no_skip, Subject, Modifiers>
+ {
+ typedef no_skip_directive<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::no_skip_directive<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::no_skip_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/omit.hpp b/boost/spirit/home/qi/directive/omit.hpp
new file mode 100644
index 0000000000..b0ed86b0a7
--- /dev/null
+++ b/boost/spirit/home/qi/directive/omit.hpp
@@ -0,0 +1,107 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_OMIT_MARCH_24_2007_0802AM)
+#define SPIRIT_OMIT_MARCH_24_2007_0802AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<qi::domain, tag::omit> // enables omit
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::omit;
+#endif
+ using spirit::omit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // omit_directive forces the attribute of subject parser
+ // to be unused_type
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct omit_directive : unary_parser<omit_directive<Subject> >
+ {
+ typedef Subject subject_type;
+ omit_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, Attribute& attr) const
+ {
+ return subject.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("omit", subject.what(context));
+ }
+
+ Subject subject;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ omit_directive& operator= (omit_directive const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::omit, Subject, Modifiers>
+ {
+ typedef omit_directive<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::omit_directive<Subject> >
+ : mpl::false_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::omit_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/raw.hpp b/boost/spirit/home/qi/directive/raw.hpp
new file mode 100644
index 0000000000..b88458ea28
--- /dev/null
+++ b/boost/spirit/home/qi/directive/raw.hpp
@@ -0,0 +1,111 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_RAW_APRIL_9_2007_0912AM)
+#define SPIRIT_RAW_APRIL_9_2007_0912AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/range/iterator_range.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<qi::domain, tag::raw> // enables raw
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::raw;
+#endif
+ using spirit::raw_type;
+
+ template <typename Subject>
+ struct raw_directive : unary_parser<raw_directive<Subject> >
+ {
+ typedef Subject subject_type;
+ raw_directive(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef iterator_range<Iterator> type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper);
+ Iterator i = first;
+ if (subject.parse(i, last, context, skipper, unused))
+ {
+ spirit::traits::assign_to(first, i, attr);
+ first = i;
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("raw", subject.what(context));
+
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::raw, Subject, Modifiers>
+ {
+ typedef raw_directive<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::raw_directive<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::raw_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/repeat.hpp b/boost/spirit/home/qi/directive/repeat.hpp
new file mode 100644
index 0000000000..252e18f743
--- /dev/null
+++ b/boost/spirit/home/qi/directive/repeat.hpp
@@ -0,0 +1,297 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_REPEAT_NOVEMBER_14_2008_1148AM)
+#define SPIRIT_REPEAT_NOVEMBER_14_2008_1148AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/qi/operator/kleene.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/qi/detail/fail_function.hpp>
+#include <boost/spirit/home/qi/detail/pass_container.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <vector>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<qi::domain, tag::repeat> // enables repeat[p]
+ : mpl::true_ {};
+
+ template <typename T>
+ struct use_directive<qi::domain
+ , terminal_ex<tag::repeat // enables repeat(exact)[p]
+ , fusion::vector1<T> >
+ > : mpl::true_ {};
+
+ template <typename T>
+ struct use_directive<qi::domain
+ , terminal_ex<tag::repeat // enables repeat(min, max)[p]
+ , fusion::vector2<T, T> >
+ > : mpl::true_ {};
+
+ template <typename T>
+ struct use_directive<qi::domain
+ , terminal_ex<tag::repeat // enables repeat(min, inf)[p]
+ , fusion::vector2<T, inf_type> >
+ > : mpl::true_ {};
+
+ template <> // enables *lazy* repeat(exact)[p]
+ struct use_lazy_directive<
+ qi::domain
+ , tag::repeat
+ , 1 // arity
+ > : mpl::true_ {};
+
+ template <> // enables *lazy* repeat(min, max)[p]
+ struct use_lazy_directive< // and repeat(min, inf)[p]
+ qi::domain
+ , tag::repeat
+ , 2 // arity
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::repeat;
+ using spirit::inf;
+#endif
+ using spirit::repeat_type;
+ using spirit::inf_type;
+
+ template <typename T>
+ struct exact_iterator // handles repeat(exact)[p]
+ {
+ exact_iterator(T const exact)
+ : exact(exact) {}
+
+ typedef T type;
+ T start() const { return 0; }
+ bool got_max(T i) const { return i >= exact; }
+ bool got_min(T i) const { return i >= exact; }
+
+ T const exact;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ exact_iterator& operator= (exact_iterator const&);
+ };
+
+ template <typename T>
+ struct finite_iterator // handles repeat(min, max)[p]
+ {
+ finite_iterator(T const min, T const max)
+ : min BOOST_PREVENT_MACRO_SUBSTITUTION (min)
+ , max BOOST_PREVENT_MACRO_SUBSTITUTION (max) {}
+
+ typedef T type;
+ T start() const { return 0; }
+ bool got_max(T i) const { return i >= max; }
+ bool got_min(T i) const { return i >= min; }
+
+ T const min;
+ T const max;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ finite_iterator& operator= (finite_iterator const&);
+ };
+
+ template <typename T>
+ struct infinite_iterator // handles repeat(min, inf)[p]
+ {
+ infinite_iterator(T const min)
+ : min BOOST_PREVENT_MACRO_SUBSTITUTION (min) {}
+
+ typedef T type;
+ T start() const { return 0; }
+ bool got_max(T /*i*/) const { return false; }
+ bool got_min(T i) const { return i >= min; }
+
+ T const min;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ infinite_iterator& operator= (infinite_iterator const&);
+ };
+
+ template <typename Subject, typename LoopIter>
+ struct repeat_parser : unary_parser<repeat_parser<Subject, LoopIter> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Build a std::vector from the subject's attribute. Note
+ // that build_std_vector may return unused_type if the
+ // subject's attribute is an unused_type.
+ typedef typename
+ traits::build_std_vector<
+ typename traits::attribute_of<
+ Subject, Context, Iterator>::type
+ >::type
+ type;
+ };
+
+ repeat_parser(Subject const& subject, LoopIter const& iter)
+ : subject(subject), iter(iter) {}
+
+ template <typename F>
+ bool parse_container(F f) const
+ {
+ typename LoopIter::type i = iter.start();
+ for (/**/; !iter.got_min(i); ++i)
+ {
+ if (f (subject))
+ return false;
+ }
+
+ // parse some more up to the maximum specified
+ typename F::iterator_type save = f.f.first;
+ for (/**/; !iter.got_max(i); ++i)
+ {
+ if (f (subject))
+ break;
+ save = f.f.first;
+ }
+
+ f.f.first = save;
+ return true;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef detail::fail_function<Iterator, Context, Skipper>
+ fail_function;
+
+ // ensure the attribute is actually a container type
+ traits::make_container(attr);
+
+ Iterator iter = first;
+ fail_function f(iter, last, context, skipper);
+ if (!parse_container(detail::make_pass_container(f, attr)))
+ return false;
+
+ first = f.first;
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("repeat", subject.what(context));
+ }
+
+ Subject subject;
+ LoopIter iter;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ repeat_parser& operator= (repeat_parser const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::repeat, Subject, Modifiers>
+ {
+ typedef kleene<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::repeat, fusion::vector1<T> >, Subject, Modifiers>
+ {
+ typedef exact_iterator<T> iterator_type;
+ typedef repeat_parser<Subject, iterator_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args));
+ }
+ };
+
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::repeat, fusion::vector2<T, T> >, Subject, Modifiers>
+ {
+ typedef finite_iterator<T> iterator_type;
+ typedef repeat_parser<Subject, iterator_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject,
+ iterator_type(
+ fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args)
+ )
+ );
+ }
+ };
+
+ template <typename T, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::repeat
+ , fusion::vector2<T, inf_type> >, Subject, Modifiers>
+ {
+ typedef infinite_iterator<T> iterator_type;
+ typedef repeat_parser<Subject, iterator_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename LoopIter>
+ struct has_semantic_action<qi::repeat_parser<Subject, LoopIter> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename LoopIter, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::repeat_parser<Subject, LoopIter>
+ , Attribute, Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/directive/skip.hpp b/boost/spirit/home/qi/directive/skip.hpp
new file mode 100644
index 0000000000..28539da3a0
--- /dev/null
+++ b/boost/spirit/home/qi/directive/skip.hpp
@@ -0,0 +1,190 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_SKIP_JANUARY_26_2008_0422PM)
+#define SPIRIT_SKIP_JANUARY_26_2008_0422PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/qi/operator/kleene.hpp>
+#include <boost/spirit/home/qi/directive/lexeme.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/detail/unused_skipper.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_directive<qi::domain, tag::skip> // enables skip[p]
+ : mpl::true_ {};
+
+ template <typename T>
+ struct use_directive<qi::domain
+ , terminal_ex<tag::skip // enables skip(s)[p]
+ , fusion::vector1<T> >
+ > : boost::spirit::traits::matches<qi::domain, T> {};
+
+ template <> // enables *lazy* skip(s)[p]
+ struct use_lazy_directive<
+ qi::domain
+ , tag::skip
+ , 1 // arity
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::skip;
+#endif
+ using spirit::skip_type;
+
+ template <typename Subject>
+ struct reskip_parser : unary_parser<reskip_parser<Subject> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::attribute_of<Subject, Context, Iterator>::type
+ type;
+ };
+
+ reskip_parser(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& u // --> The skipper is reintroduced
+ , Attribute& attr) const
+ {
+ return subject.parse(first, last, context
+ , detail::get_skipper(u), attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("skip", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ template <typename Subject, typename Skipper>
+ struct skip_parser : unary_parser<skip_parser<Subject, Skipper> >
+ {
+ typedef Subject subject_type;
+ typedef Skipper skipper_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::attribute_of<Subject, Context, Iterator>::type
+ type;
+ };
+
+ skip_parser(Subject const& subject, Skipper const& skipper)
+ : subject(subject), skipper(skipper) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper_, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper_ const& //skipper --> bypass the supplied skipper
+ , Attribute& attr) const
+ {
+ return subject.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("skip", subject.what(context));
+ }
+
+ Subject subject;
+ Skipper skipper;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<tag::skip, Subject, Modifiers>
+ {
+ typedef reskip_parser<Subject> result_type;
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+
+ template <typename Skipper, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<tag::skip, fusion::vector1<Skipper> >, Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<qi::domain, Skipper, Modifiers>::type
+ skipper_type;
+
+ typedef skip_parser<Subject, skipper_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<qi::domain>(fusion::at_c<0>(term.args), modifiers));
+ }
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::reskip_parser<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ template <typename Subject, typename Skipper>
+ struct has_semantic_action<qi::skip_parser<Subject, Skipper> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::reskip_parser<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+
+ template <typename Subject, typename Skipper, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::skip_parser<Subject, Skipper>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/domain.hpp b/boost/spirit/home/qi/domain.hpp
new file mode 100644
index 0000000000..cc6b8c3911
--- /dev/null
+++ b/boost/spirit/home/qi/domain.hpp
@@ -0,0 +1,74 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_DOMAIN_JANUARY_29_2007_0954AM)
+#define BOOST_SPIRIT_DOMAIN_JANUARY_29_2007_0954AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/meta_compiler.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/context.hpp>
+
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ // qi's domain
+ struct domain {};
+
+ // bring in some of spirit parts into spirit::qi
+ using spirit::unused;
+ using spirit::unused_type;
+ using spirit::compile;
+ using spirit::info;
+
+ // You can bring these in with the using directive
+ // without worrying about bringing in too much.
+ namespace labels
+ {
+ BOOST_PP_REPEAT(SPIRIT_ARGUMENTS_LIMIT, SPIRIT_USING_ARGUMENT, _)
+ BOOST_PP_REPEAT(SPIRIT_ATTRIBUTES_LIMIT, SPIRIT_USING_ATTRIBUTE, _)
+
+ using spirit::_pass_type;
+ using spirit::_val_type;
+ using spirit::_a_type;
+ using spirit::_b_type;
+ using spirit::_c_type;
+ using spirit::_d_type;
+ using spirit::_e_type;
+ using spirit::_f_type;
+ using spirit::_g_type;
+ using spirit::_h_type;
+ using spirit::_i_type;
+ using spirit::_j_type;
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+ using spirit::_pass;
+ using spirit::_val;
+ using spirit::_a;
+ using spirit::_b;
+ using spirit::_c;
+ using spirit::_d;
+ using spirit::_e;
+ using spirit::_f;
+ using spirit::_g;
+ using spirit::_h;
+ using spirit::_i;
+ using spirit::_j;
+
+#endif
+ }
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/match.hpp b/boost/spirit/home/qi/match.hpp
new file mode 100644
index 0000000000..2e47d718e0
--- /dev/null
+++ b/boost/spirit/home/qi/match.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_QI_MATCH_DEC_02_2009_0749PM)
+#define BOOST_SPIRIT_QI_MATCH_DEC_02_2009_0749PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/stream/match_manip.hpp>
+#include <boost/spirit/home/qi/stream/match_manip_attr.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/match_auto.hpp b/boost/spirit/home/qi/match_auto.hpp
new file mode 100644
index 0000000000..a50c9d69dd
--- /dev/null
+++ b/boost/spirit/home/qi/match_auto.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_QI_MATCH_AUTO_DEC_02_2009_0750PM)
+#define BOOST_SPIRIT_QI_MATCH_AUTO_DEC_02_2009_0750PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/stream/match_manip.hpp>
+#include <boost/spirit/home/qi/stream/detail/match_manip_auto.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/meta_compiler.hpp b/boost/spirit/home/qi/meta_compiler.hpp
new file mode 100644
index 0000000000..68649c0f04
--- /dev/null
+++ b/boost/spirit/home/qi/meta_compiler.hpp
@@ -0,0 +1,177 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_META_COMPILER_OCTOBER_16_2008_0347PM)
+#define BOOST_SPIRIT_META_COMPILER_OCTOBER_16_2008_0347PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/meta_compiler.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/fusion/include/at.hpp>
+
+namespace boost { namespace spirit
+{
+ template <typename T>
+ struct use_terminal<qi::domain, T
+ , typename enable_if<traits::is_parser<T> >::type> // enables parsers
+ : mpl::true_ {};
+
+ namespace qi
+ {
+ template <typename T, typename Modifiers, typename Enable = void>
+ struct make_primitive // by default, return it as-is
+ {
+ typedef T result_type;
+
+ template <typename T_>
+ T_& operator()(T_& val, unused_type) const
+ {
+ return val;
+ }
+
+ template <typename T_>
+ T_ const& operator()(T_ const& val, unused_type) const
+ {
+ return val;
+ }
+ };
+
+ template <typename Tag, typename Elements
+ , typename Modifiers, typename Enable = void>
+ struct make_composite;
+
+ template <typename Directive, typename Body
+ , typename Modifiers, typename Enable = void>
+ struct make_directive
+ {
+ typedef Body result_type;
+ result_type operator()(unused_type, Body const& body, unused_type) const
+ {
+ return body; // By default, a directive simply returns its subject
+ }
+ };
+ }
+
+ // Qi primitive meta-compiler
+ template <>
+ struct make_component<qi::domain, proto::tag::terminal>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename qi::make_primitive<
+ typename remove_const<typename Elements::car_type>::type,
+ typename remove_reference<Modifiers>::type>::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ typedef typename remove_const<typename Elements::car_type>::type term;
+ return qi::make_primitive<term, Modifiers>()(elements.car, modifiers);
+ }
+ };
+
+ // Qi composite meta-compiler
+ template <typename Tag>
+ struct make_component<qi::domain, Tag>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ qi::make_composite<Tag, Elements,
+ typename remove_reference<Modifiers>::type>::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ return qi::make_composite<Tag, Elements, Modifiers>()(
+ elements, modifiers);
+ }
+ };
+
+ // Qi function meta-compiler
+ template <>
+ struct make_component<qi::domain, proto::tag::function>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ qi::make_composite<
+ typename remove_const<typename Elements::car_type>::type,
+ typename Elements::cdr_type,
+ typename remove_reference<Modifiers>::type
+ >::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ return qi::make_composite<
+ typename remove_const<typename Elements::car_type>::type,
+ typename Elements::cdr_type,
+ Modifiers>()(elements.cdr, modifiers);
+ }
+ };
+
+ // Qi directive meta-compiler
+ template <>
+ struct make_component<qi::domain, tag::directive>
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>
+ {
+ typedef typename
+ qi::make_directive<
+ typename remove_const<typename Elements::car_type>::type,
+ typename remove_const<typename Elements::cdr_type::car_type>::type,
+ typename remove_reference<Modifiers>::type
+ >::result_type
+ type;
+ };
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const
+ {
+ return qi::make_directive<
+ typename remove_const<typename Elements::car_type>::type,
+ typename remove_const<typename Elements::cdr_type::car_type>::type,
+ Modifiers>()(elements.car, elements.cdr.car, modifiers);
+ }
+ };
+
+}}
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal.hpp b/boost/spirit/home/qi/nonterminal.hpp
new file mode 100644
index 0000000000..e96fbf5fb4
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal.hpp
@@ -0,0 +1,21 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_NONTERMINAL_FEBRUARY_12_2007_1018AM)
+#define BOOST_SPIRIT_NONTERMINAL_FEBRUARY_12_2007_1018AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/nonterminal/rule.hpp>
+#include <boost/spirit/home/qi/nonterminal/grammar.hpp>
+#include <boost/spirit/home/qi/nonterminal/error_handler.hpp>
+#include <boost/spirit/home/qi/nonterminal/debug_handler.hpp>
+#include <boost/spirit/home/qi/nonterminal/simple_trace.hpp>
+#include <boost/spirit/home/qi/nonterminal/success_handler.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/debug_handler.hpp b/boost/spirit/home/qi/nonterminal/debug_handler.hpp
new file mode 100644
index 0000000000..33287327cc
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/debug_handler.hpp
@@ -0,0 +1,145 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_DEBUG_HANDLER_DECEMBER_05_2008_0734PM)
+#define BOOST_SPIRIT_DEBUG_HANDLER_DECEMBER_05_2008_0734PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/nonterminal/rule.hpp>
+#include <boost/spirit/home/qi/nonterminal/debug_handler_state.hpp>
+#include <boost/spirit/home/qi/operator/expect.hpp>
+#include <boost/function.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/out.hpp>
+#include <iostream>
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <
+ typename Iterator, typename Context
+ , typename Skipper, typename F>
+ struct debug_handler
+ {
+ typedef function<
+ bool(Iterator& first, Iterator const& last
+ , Context& context
+ , Skipper const& skipper
+ )>
+ function_type;
+
+ debug_handler(
+ function_type subject
+ , F f
+ , std::string const& rule_name)
+ : subject(subject)
+ , f(f)
+ , rule_name(rule_name)
+ {
+ }
+
+ bool operator()(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper) const
+ {
+ f(first, last, context, pre_parse, rule_name);
+ try // subject might throw an exception
+ {
+ if (subject(first, last, context, skipper))
+ {
+ f(first, last, context, successful_parse, rule_name);
+ return true;
+ }
+ f(first, last, context, failed_parse, rule_name);
+ }
+ catch (expectation_failure<Iterator> const& e)
+ {
+ f(first, last, context, failed_parse, rule_name);
+ boost::throw_exception(e);
+ }
+ return false;
+ }
+
+ function_type subject;
+ F f;
+ std::string rule_name;
+ };
+
+ template <typename Iterator
+ , typename T1, typename T2, typename T3, typename T4, typename F>
+ void debug(rule<Iterator, T1, T2, T3, T4>& r, F f)
+ {
+ typedef rule<Iterator, T1, T2, T3, T4> rule_type;
+
+ typedef
+ debug_handler<
+ Iterator
+ , typename rule_type::context_type
+ , typename rule_type::skipper_type
+ , F>
+ debug_handler;
+ r.f = debug_handler(r.f, f, r.name());
+ }
+
+ struct simple_trace;
+
+ namespace detail
+ {
+ // This class provides an extra level of indirection through a
+ // template to produce the simple_trace type. This way, the use
+ // of simple_trace below is hidden behind a dependent type, so
+ // that compilers eagerly type-checking template definitions
+ // won't complain that simple_trace is incomplete.
+ template<typename T>
+ struct get_simple_trace
+ {
+ typedef simple_trace type;
+ };
+ }
+
+ template <typename Iterator
+ , typename T1, typename T2, typename T3, typename T4>
+ void debug(rule<Iterator, T1, T2, T3, T4>& r)
+ {
+ typedef rule<Iterator, T1, T2, T3, T4> rule_type;
+
+ typedef
+ debug_handler<
+ Iterator
+ , typename rule_type::context_type
+ , typename rule_type::skipper_type
+ , simple_trace>
+ debug_handler;
+
+ typedef typename qi::detail::get_simple_trace<Iterator>::type trace;
+ r.f = debug_handler(r.f, trace(), r.name());
+ }
+
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// Utility macro for easy enabling of rule and grammar debugging
+#if !defined(BOOST_SPIRIT_DEBUG_NODE)
+ #if defined(BOOST_SPIRIT_DEBUG) || defined(BOOST_SPIRIT_QI_DEBUG)
+ #define BOOST_SPIRIT_DEBUG_NODE(r) r.name(#r); debug(r)
+ #else
+ #define BOOST_SPIRIT_DEBUG_NODE(r) r.name(#r)
+ #endif
+#endif
+
+#define BOOST_SPIRIT_DEBUG_NODE_A(r, _, name) \
+ BOOST_SPIRIT_DEBUG_NODE(name); \
+ /***/
+
+#define BOOST_SPIRIT_DEBUG_NODES(seq) \
+ BOOST_PP_SEQ_FOR_EACH(BOOST_SPIRIT_DEBUG_NODE_A, _, seq) \
+ /***/
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/debug_handler_state.hpp b/boost/spirit/home/qi/nonterminal/debug_handler_state.hpp
new file mode 100644
index 0000000000..cb24c01f47
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/debug_handler_state.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_DEBUG_HANDLER_STATE_APR_21_2010_0733PM)
+#define BOOST_SPIRIT_DEBUG_HANDLER_STATE_APR_21_2010_0733PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+namespace boost { namespace spirit { namespace qi
+{
+ enum debug_handler_state
+ {
+ pre_parse
+ , successful_parse
+ , failed_parse
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/detail/fcall.hpp b/boost/spirit/home/qi/nonterminal/detail/fcall.hpp
new file mode 100644
index 0000000000..e4fa17f985
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/detail/fcall.hpp
@@ -0,0 +1,53 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 \
+ <boost/spirit/home/qi/nonterminal/detail/fcall.hpp>
+#define BOOST_PP_ITERATION_LIMITS (1, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename A)>
+ typename lazy_enable_if_c<
+ (params_size == N)
+ , proto::terminal<
+ spirit::qi::parameterized_nonterminal<
+ parameterized_subject_type
+ , fusion::vector<BOOST_PP_ENUM_PARAMS(N, A)> >
+ >
+ >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& f)) const
+ {
+ typedef fusion::vector<BOOST_PP_ENUM_PARAMS(N, A)> vector_type;
+ typedef spirit::qi::parameterized_nonterminal<
+ parameterized_subject_type, vector_type> parameterized_type;
+ typedef typename proto::terminal<parameterized_type>::type result_type;
+
+ return result_type::make(
+ parameterized_type(
+ this->get_parameterized_subject()
+ , fusion::make_vector(BOOST_PP_ENUM_PARAMS(N, f)))
+ );
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
+
diff --git a/boost/spirit/home/qi/nonterminal/detail/parameterized.hpp b/boost/spirit/home/qi/nonterminal/detail/parameterized.hpp
new file mode 100644
index 0000000000..0300a06b7e
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/detail/parameterized.hpp
@@ -0,0 +1,75 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2009 Francois Barel
+
+ Distributed under the 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_SPIRIT_PARAMETERIZED_AUGUST_09_2009_0539AM)
+#define BOOST_SPIRIT_PARAMETERIZED_AUGUST_09_2009_0539AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/ref.hpp>
+
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // parameterized_nonterminal: parser representing the invocation of a
+ // nonterminal, passing inherited attributes
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Params>
+ struct parameterized_nonterminal
+ : parser<parameterized_nonterminal<Subject, Params> >
+ {
+ parameterized_nonterminal(Subject const& subject, Params const& params)
+ : ref(subject), params(params)
+ {
+ }
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ // Forward to subject.
+ : Subject::template attribute<Context, Iterator> {};
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ // Forward to subject, passing the additional
+ // params argument to parse.
+ return ref.get().parse(first, last, context, skipper, attr, params);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ // Forward to subject.
+ return ref.get().what(context);
+ }
+
+ boost::reference_wrapper<Subject const> ref;
+ Params params;
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Params, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::parameterized_nonterminal<Subject, Params>
+ , Attribute, Context, Iterator>
+ : handles_container<typename remove_const<Subject>::type
+ , Attribute, Context, Iterator>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp b/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp
new file mode 100644
index 0000000000..91bceba88e
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp
@@ -0,0 +1,87 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_PARSER_BINDER_DECEMBER_05_2008_0516_PM)
+#define BOOST_SPIRIT_PARSER_BINDER_DECEMBER_05_2008_0516_PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ // parser_binder for plain rules
+ template <typename Parser, typename Auto>
+ struct parser_binder
+ {
+ parser_binder(Parser const& p)
+ : p(p) {}
+
+ template <typename Iterator, typename Skipper, typename Context>
+ bool call(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, mpl::true_) const
+ {
+ // If DeducedAuto is false (semantic actions is present), the
+ // component's attribute is unused.
+ return p.parse(first, last, context, skipper, unused);
+ }
+
+ template <typename Iterator, typename Skipper, typename Context>
+ bool call(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, mpl::false_) const
+ {
+ // If DeducedAuto is true (no semantic action), we pass the rule's
+ // attribute on to the component.
+ return p.parse(first, last, context, skipper
+ , fusion::at_c<0>(context.attributes));
+ }
+
+ template <typename Iterator, typename Skipper, typename Context>
+ bool operator()(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper) const
+ {
+ // If Auto is false, we need to deduce whether to apply auto rule
+ typedef typename traits::has_semantic_action<Parser>::type auto_rule;
+ return call(first, last, context, skipper, auto_rule());
+ }
+
+ Parser p;
+ };
+
+ // parser_binder for auto rules
+ template <typename Parser>
+ struct parser_binder<Parser, mpl::true_>
+ {
+ parser_binder(Parser const& p)
+ : p(p) {}
+
+ template <typename Iterator, typename Skipper, typename Context>
+ bool operator()(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper) const
+ {
+ // If Auto is true, we pass the rule's attribute on to the component.
+ return p.parse(first, last, context, skipper
+ , fusion::at_c<0>(context.attributes));
+ }
+
+ Parser p;
+ };
+
+ template <typename Auto, typename Parser>
+ inline parser_binder<Parser, Auto>
+ bind_parser(Parser const& p)
+ {
+ return parser_binder<Parser, Auto>(p);
+ }
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/error_handler.hpp b/boost/spirit/home/qi/nonterminal/error_handler.hpp
new file mode 100644
index 0000000000..6dd4f08123
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/error_handler.hpp
@@ -0,0 +1,176 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_ERROR_HANDLER_APRIL_29_2007_1042PM)
+#define BOOST_SPIRIT_ERROR_HANDLER_APRIL_29_2007_1042PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/expect.hpp>
+#include <boost/spirit/home/qi/nonterminal/rule.hpp>
+#include <boost/spirit/home/support/multi_pass_wrapper.hpp>
+#include <boost/function.hpp>
+#include <boost/assert.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ enum error_handler_result
+ {
+ fail
+ , retry
+ , accept
+ , rethrow
+ };
+
+ namespace detail
+ {
+ // Helper template allowing to manage the inhibit clear queue flag in
+ // a multi_pass iterator. This is the usual specialization used for
+ // anything but a multi_pass iterator.
+ template <typename Iterator, bool active>
+ struct reset_on_exit
+ {
+ reset_on_exit(Iterator&) {}
+ };
+
+ // For 'retry' or 'fail' error handlers we need to inhibit the flushing
+ // of the internal multi_pass buffers which otherwise might happen at
+ // deterministic expectation points inside the encapsulated right hand
+ // side of rule.
+ template <typename Iterator>
+ struct reset_on_exit<Iterator, true>
+ {
+ reset_on_exit(Iterator& it)
+ : it_(it)
+ , inhibit_clear_queue_(spirit::traits::inhibit_clear_queue(it))
+ {
+ spirit::traits::inhibit_clear_queue(it_, true);
+ }
+
+ ~reset_on_exit()
+ {
+ // reset inhibit flag in multi_pass on exit
+ spirit::traits::inhibit_clear_queue(it_, inhibit_clear_queue_);
+ }
+
+ Iterator& it_;
+ bool inhibit_clear_queue_;
+ };
+ }
+
+ template <
+ typename Iterator, typename Context
+ , typename Skipper, typename F, error_handler_result action
+ >
+ struct error_handler
+ {
+ typedef function<
+ bool(Iterator& first, Iterator const& last
+ , Context& context
+ , Skipper const& skipper
+ )>
+ function_type;
+
+ error_handler(function_type subject, F f)
+ : subject(subject)
+ , f(f)
+ {
+ }
+
+ bool operator()(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper) const
+ {
+ typedef qi::detail::reset_on_exit<Iterator
+ , traits::is_multi_pass<Iterator>::value &&
+ (action == retry || action == fail)> on_exit_type;
+
+ on_exit_type on_exit(first);
+ for(;;)
+ {
+ try
+ {
+ Iterator i = first;
+ bool r = subject(i, last, context, skipper);
+ if (r)
+ first = i;
+ return r;
+ }
+ catch (expectation_failure<Iterator> const& x)
+ {
+ typedef
+ fusion::vector<
+ Iterator&
+ , Iterator const&
+ , Iterator const&
+ , info const&>
+ params;
+ error_handler_result r = action;
+ params args(first, last, x.first, x.what_);
+ f(args, context, r);
+
+ // The assertions below will fire if you are using a
+ // multi_pass as the underlying iterator, one of your error
+ // handlers forced its guarded rule to 'fail' or 'retry',
+ // and the error handler has not been instantiated using
+ // either 'fail' or 'retry' in the first place. Please see
+ // the multi_pass docs for more information.
+ switch (r)
+ {
+ case fail:
+ BOOST_ASSERT(
+ !traits::is_multi_pass<Iterator>::value ||
+ action == retry || action == fail);
+ return false;
+ case retry:
+ BOOST_ASSERT(
+ !traits::is_multi_pass<Iterator>::value ||
+ action == retry || action == fail);
+ continue;
+ case accept: return true;
+ case rethrow: boost::throw_exception(x);
+ }
+ }
+ }
+ return false;
+ }
+
+ function_type subject;
+ F f;
+ };
+
+ template <
+ error_handler_result action
+ , typename Iterator, typename T0, typename T1, typename T2
+ , typename F>
+ void on_error(rule<Iterator, T0, T1, T2>& r, F f)
+ {
+ typedef rule<Iterator, T0, T1, T2> rule_type;
+
+ typedef
+ error_handler<
+ Iterator
+ , typename rule_type::context_type
+ , typename rule_type::skipper_type
+ , F
+ , action>
+ error_handler;
+ r.f = error_handler(r.f, f);
+ }
+
+ // Error handling support when <action> is not
+ // specified. We will default to <fail>.
+ template <typename Iterator, typename T0, typename T1
+ , typename T2, typename F>
+ void on_error(rule<Iterator, T0, T1, T2>& r, F f)
+ {
+ on_error<fail>(r, f);
+ }
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/grammar.hpp b/boost/spirit/home/qi/nonterminal/grammar.hpp
new file mode 100644
index 0000000000..982e49b91e
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/grammar.hpp
@@ -0,0 +1,132 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_GRAMMAR_FEBRUARY_19_2007_0236PM)
+#define BOOST_SPIRIT_GRAMMAR_FEBRUARY_19_2007_0236PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/nonterminal/rule.hpp>
+#include <boost/spirit/home/qi/nonterminal/nonterminal_fwd.hpp>
+#include <boost/spirit/home/qi/reference.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <
+ typename Iterator, typename T1, typename T2, typename T3
+ , typename T4>
+ struct grammar
+ : proto::extends<
+ typename proto::terminal<
+ reference<rule<Iterator, T1, T2, T3, T4> const>
+ >::type
+ , grammar<Iterator, T1, T2, T3, T4>
+ >
+ , parser<grammar<Iterator, T1, T2, T3, T4> >
+ , noncopyable
+ {
+ typedef Iterator iterator_type;
+ typedef rule<Iterator, T1, T2, T3, T4> start_type;
+ typedef typename start_type::sig_type sig_type;
+ typedef typename start_type::locals_type locals_type;
+ typedef typename start_type::skipper_type skipper_type;
+ typedef typename start_type::encoding_type encoding_type;
+ typedef grammar<Iterator, T1, T2, T3, T4> base_type;
+ typedef reference<start_type const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+
+ static size_t const params_size = start_type::params_size;
+
+ template <typename Context, typename Iterator_>
+ struct attribute
+ {
+ typedef typename start_type::attr_type type;
+ };
+
+ grammar(
+ start_type const& start
+ , std::string const& name_ = "unnamed-grammar")
+ : proto::extends<terminal, base_type>(terminal::make(reference_(start)))
+ , name_(name_)
+ {}
+
+ // This constructor is used to catch if the start rule is not
+ // compatible with the grammar.
+ template <typename Iterator_,
+ typename T1_, typename T2_, typename T3_, typename T4_>
+ grammar(
+ rule<Iterator_, T1_, T2_, T3_, T4_> const&
+ , std::string const& = "unnamed-grammar")
+ {
+ // If you see the assertion below failing then the start rule
+ // passed to the constructor of the grammar is not compatible with
+ // the grammar (i.e. it uses different template parameters).
+ BOOST_SPIRIT_ASSERT_MSG(
+ (is_same<start_type, rule<Iterator_, T1_, T2_, T3_, T4_> >::value)
+ , incompatible_start_rule, (rule<Iterator_, T1_, T2_, T3_, T4_>));
+ }
+
+ std::string name() const
+ {
+ return name_;
+ }
+
+ void name(std::string const& str)
+ {
+ name_ = str;
+ }
+
+ template <typename Context, typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ return this->proto_base().child0.parse(
+ first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context&) const
+ {
+ return info(name_);
+ }
+
+ // bring in the operator() overloads
+ start_type const& get_parameterized_subject() const
+ { return this->proto_base().child0.ref.get(); }
+ typedef start_type parameterized_subject_type;
+ #include <boost/spirit/home/qi/nonterminal/detail/fcall.hpp>
+
+ std::string name_;
+
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename IteratorA, typename IteratorB, typename Attribute
+ , typename Context, typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<
+ qi::grammar<IteratorA, T1, T2, T3, T4>, Attribute, Context, IteratorB>
+ : traits::is_container<
+ typename attribute_of<
+ qi::grammar<IteratorA, T1, T2, T3, T4>, Context, IteratorB
+ >::type
+ >
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/nonterminal_fwd.hpp b/boost/spirit/home/qi/nonterminal/nonterminal_fwd.hpp
new file mode 100644
index 0000000000..9e393452ac
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/nonterminal_fwd.hpp
@@ -0,0 +1,31 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_QI_NONTERMINAL_FWD_DEC_24_2010_1105PM)
+#define BOOST_SPIRIT_QI_NONTERMINAL_FWD_DEC_24_2010_1105PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ // forward declaration only
+ template <
+ typename Iterator, typename T1 = unused_type
+ , typename T2 = unused_type, typename T3 = unused_type
+ , typename T4 = unused_type>
+ struct rule;
+
+ template <
+ typename Iterator, typename T1 = unused_type
+ , typename T2 = unused_type, typename T3 = unused_type
+ , typename T4 = unused_type>
+ struct grammar;
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/rule.hpp b/boost/spirit/home/qi/nonterminal/rule.hpp
new file mode 100644
index 0000000000..23d25595a0
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/rule.hpp
@@ -0,0 +1,439 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_RULE_FEBRUARY_12_2007_1020AM)
+#define BOOST_SPIRIT_RULE_FEBRUARY_12_2007_1020AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/function.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/make_vector.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/fusion/include/as_list.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/context.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/nonterminal/extract_param.hpp>
+#include <boost/spirit/home/support/nonterminal/locals.hpp>
+#include <boost/spirit/home/qi/reference.hpp>
+#include <boost/spirit/home/qi/nonterminal/detail/parameterized.hpp>
+#include <boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp>
+#include <boost/spirit/home/qi/nonterminal/nonterminal_fwd.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning
+#endif
+
+namespace boost { namespace spirit { namespace qi
+{
+ BOOST_PP_REPEAT(SPIRIT_ATTRIBUTES_LIMIT, SPIRIT_USING_ATTRIBUTE, _)
+
+ using spirit::_pass_type;
+ using spirit::_val_type;
+ using spirit::_a_type;
+ using spirit::_b_type;
+ using spirit::_c_type;
+ using spirit::_d_type;
+ using spirit::_e_type;
+ using spirit::_f_type;
+ using spirit::_g_type;
+ using spirit::_h_type;
+ using spirit::_i_type;
+ using spirit::_j_type;
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+ using spirit::_pass;
+ using spirit::_val;
+ using spirit::_a;
+ using spirit::_b;
+ using spirit::_c;
+ using spirit::_d;
+ using spirit::_e;
+ using spirit::_f;
+ using spirit::_g;
+ using spirit::_h;
+ using spirit::_i;
+ using spirit::_j;
+
+#endif
+
+ using spirit::info;
+ using spirit::locals;
+
+ template <
+ typename Iterator, typename T1, typename T2, typename T3
+ , typename T4>
+ struct rule
+ : proto::extends<
+ typename proto::terminal<
+ reference<rule<Iterator, T1, T2, T3, T4> const>
+ >::type
+ , rule<Iterator, T1, T2, T3, T4>
+ >
+ , parser<rule<Iterator, T1, T2, T3, T4> >
+ {
+ typedef Iterator iterator_type;
+ typedef rule<Iterator, T1, T2, T3, T4> this_type;
+ typedef reference<this_type const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, this_type> base_type;
+ typedef mpl::vector<T1, T2, T3, T4> template_params;
+
+ // The rule's locals_type: a sequence of types to be used as local variables
+ typedef typename
+ spirit::detail::extract_locals<template_params>::type
+ locals_type;
+
+ // The rule's skip-parser type
+ typedef typename
+ spirit::detail::extract_component<
+ qi::domain, template_params>::type
+ skipper_type;
+
+ // The rule's signature
+ typedef typename
+ spirit::detail::extract_sig<template_params>::type
+ sig_type;
+
+ // The rule's encoding type
+ typedef typename
+ spirit::detail::extract_encoding<template_params>::type
+ encoding_type;
+
+ // This is the rule's attribute type
+ typedef typename
+ spirit::detail::attr_from_sig<sig_type>::type
+ attr_type;
+ typedef typename add_reference<attr_type>::type attr_reference_type;
+
+ // parameter_types is a sequence of types passed as parameters to the rule
+ typedef typename
+ spirit::detail::params_from_sig<sig_type>::type
+ parameter_types;
+
+ static size_t const params_size =
+ fusion::result_of::size<parameter_types>::type::value;
+
+ typedef context<
+ fusion::cons<attr_reference_type, parameter_types>
+ , locals_type>
+ context_type;
+
+ typedef function<
+ bool(Iterator& first, Iterator const& last
+ , context_type& context
+ , skipper_type const& skipper
+ )>
+ function_type;
+
+ typedef typename
+ mpl::if_<
+ is_same<encoding_type, unused_type>
+ , unused_type
+ , tag::char_code<tag::encoding, encoding_type>
+ >::type
+ encoding_modifier_type;
+
+ explicit rule(std::string const& name_ = "unnamed-rule")
+ : base_type(terminal::make(reference_(*this)))
+ , name_(name_)
+ {
+ }
+
+ rule(rule const& rhs)
+ : base_type(terminal::make(reference_(*this)))
+ , name_(rhs.name_)
+ , f(rhs.f)
+ {
+ }
+
+ template <typename Auto, typename Expr>
+ static void define(rule& lhs, Expr const& expr, mpl::false_)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ }
+
+ template <typename Auto, typename Expr>
+ static void define(rule& lhs, Expr const& expr, mpl::true_)
+ {
+ lhs.f = detail::bind_parser<Auto>(
+ compile<qi::domain>(expr, encoding_modifier_type()));
+ }
+
+ template <typename Expr>
+ rule(Expr const& expr, std::string const& name_ = "unnamed-rule")
+ : base_type(terminal::make(reference_(*this)))
+ , name_(name_)
+ {
+ define<mpl::false_>(*this, expr, traits::matches<qi::domain, Expr>());
+ }
+
+ rule& operator=(rule const& rhs)
+ {
+ // The following assertion fires when you try to initialize a rule
+ // from an uninitialized one. Did you mean to refer to the right
+ // hand side rule instead of assigning from it? In this case you
+ // should write lhs = rhs.alias();
+ BOOST_ASSERT(rhs.f && "Did you mean rhs.alias() instead of rhs?");
+
+ f = rhs.f;
+ name_ = rhs.name_;
+ return *this;
+ }
+
+ std::string const& name() const
+ {
+ return name_;
+ }
+
+ void name(std::string const& str)
+ {
+ name_ = str;
+ }
+
+ template <typename Expr>
+ rule& operator=(Expr const& expr)
+ {
+ define<mpl::false_>(*this, expr, traits::matches<qi::domain, Expr>());
+ return *this;
+ }
+
+// VC7.1 has problems to resolve 'rule' without explicit template parameters
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+ // g++ 3.3 barfs if this is a member function :(
+ template <typename Expr>
+ friend rule& operator%=(rule& r, Expr const& expr)
+ {
+ define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
+ return r;
+ }
+
+#if defined(BOOST_NO_RVALUE_REFERENCES)
+ // non-const version needed to suppress proto's %= kicking in
+ template <typename Expr>
+ friend rule& operator%=(rule& r, Expr& expr)
+ {
+ return r %= static_cast<Expr const&>(expr);
+ }
+#else
+ // for rvalue references
+ template <typename Expr>
+ friend rule& operator%=(rule& r, Expr&& expr)
+ {
+ define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
+ return r;
+ }
+#endif
+
+#else
+ // both friend functions have to be defined out of class as VC7.1
+ // will complain otherwise
+ template <typename OutputIterator_, typename T1_, typename T2_
+ , typename T3_, typename T4_, typename Expr>
+ friend rule<OutputIterator_, T1_, T2_, T3_, T4_>& operator%=(
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>& r, Expr const& expr);
+
+ // non-const version needed to suppress proto's %= kicking in
+ template <typename OutputIterator_, typename T1_, typename T2_
+ , typename T3_, typename T4_, typename Expr>
+ friend rule<OutputIterator_, T1_, T2_, T3_, T4_>& operator%=(
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>& r, Expr& expr);
+#endif
+
+ template <typename Context, typename Iterator_>
+ struct attribute
+ {
+ typedef attr_type type;
+ };
+
+ template <typename Context, typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ if (f)
+ {
+ // do a preskip if this is an implied lexeme
+ if (is_same<skipper_type, unused_type>::value)
+ qi::skip_over(first, last, skipper);
+
+ typedef traits::make_attribute<attr_type, Attribute> make_attribute;
+
+ // do down-stream transformation, provides attribute for
+ // rhs parser
+ typedef traits::transform_attribute<
+ typename make_attribute::type, attr_type, domain>
+ transform;
+
+ typename make_attribute::type made_attr = make_attribute::call(attr);
+ typename transform::type attr_ = transform::pre(made_attr);
+
+ // If you are seeing a compilation error here, you are probably
+ // trying to use a rule or a grammar which has inherited
+ // attributes, without passing values for them.
+ context_type context(attr_);
+
+ // If you are seeing a compilation error here stating that the
+ // fourth parameter can't be converted to a required target type
+ // then you are probably trying to use a rule or a grammar with
+ // an incompatible skipper type.
+ if (f(first, last, context, skipper))
+ {
+ // do up-stream transformation, this integrates the results
+ // back into the original attribute value, if appropriate
+ traits::post_transform(attr, attr_);
+ return true;
+ }
+
+ // inform attribute transformation of failed rhs
+ traits::fail_transform(attr, attr_);
+ }
+ return false;
+ }
+
+ template <typename Context, typename Skipper
+ , typename Attribute, typename Params>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& caller_context, Skipper const& skipper
+ , Attribute& attr, Params const& params) const
+ {
+ if (f)
+ {
+ // do a preskip if this is an implied lexeme
+ if (is_same<skipper_type, unused_type>::value)
+ qi::skip_over(first, last, skipper);
+
+ typedef traits::make_attribute<attr_type, Attribute> make_attribute;
+
+ // do down-stream transformation, provides attribute for
+ // rhs parser
+ typedef traits::transform_attribute<
+ typename make_attribute::type, attr_type, domain>
+ transform;
+
+ typename make_attribute::type made_attr = make_attribute::call(attr);
+ typename transform::type attr_ = transform::pre(made_attr);
+
+ // If you are seeing a compilation error here, you are probably
+ // trying to use a rule or a grammar which has inherited
+ // attributes, passing values of incompatible types for them.
+ context_type context(attr_, params, caller_context);
+
+ // If you are seeing a compilation error here stating that the
+ // fourth parameter can't be converted to a required target type
+ // then you are probably trying to use a rule or a grammar with
+ // an incompatible skipper type.
+ if (f(first, last, context, skipper))
+ {
+ // do up-stream transformation, this integrates the results
+ // back into the original attribute value, if appropriate
+ traits::post_transform(attr, attr_);
+ return true;
+ }
+
+ // inform attribute transformation of failed rhs
+ traits::fail_transform(attr, attr_);
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info(name_);
+ }
+
+ reference_ alias() const
+ {
+ return reference_(*this);
+ }
+
+ typename proto::terminal<this_type>::type copy() const
+ {
+ typename proto::terminal<this_type>::type result = {*this};
+ return result;
+ }
+
+ // bring in the operator() overloads
+ rule const& get_parameterized_subject() const { return *this; }
+ typedef rule parameterized_subject_type;
+ #include <boost/spirit/home/qi/nonterminal/detail/fcall.hpp>
+
+ std::string name_;
+ function_type f;
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+ template <typename OutputIterator_, typename T1_, typename T2_
+ , typename T3_, typename T4_, typename Expr>
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>& operator%=(
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>& r, Expr const& expr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+
+ typedef typename
+ rule<OutputIterator_, T1_, T2_, T3_, T4_>::encoding_modifier_type
+ encoding_modifier_type;
+
+ r.f = detail::bind_parser<mpl::true_>(
+ compile<qi::domain>(expr, encoding_modifier_type()));
+ return r;
+ }
+
+ template <typename Iterator_, typename T1_, typename T2_
+ , typename T3_, typename T4_, typename Expr>
+ rule<Iterator_, T1_, T2_, T3_, T4_>& operator%=(
+ rule<Iterator_, T1_, T2_, T3_, T4_>& r, Expr& expr)
+ {
+ return r %= static_cast<Expr const&>(expr);
+ }
+#endif
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename IteratorA, typename IteratorB, typename Attribute
+ , typename Context, typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<
+ qi::rule<IteratorA, T1, T2, T3, T4>, Attribute, Context, IteratorB>
+ : traits::is_container<
+ typename attribute_of<
+ qi::rule<IteratorA, T1, T2, T3, T4>, Context, IteratorB
+ >::type
+ >
+ {};
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/simple_trace.hpp b/boost/spirit/home/qi/nonterminal/simple_trace.hpp
new file mode 100644
index 0000000000..74382f556e
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/simple_trace.hpp
@@ -0,0 +1,135 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_SIMPLE_TRACE_DECEMBER_06_2008_1102AM)
+#define BOOST_SPIRIT_SIMPLE_TRACE_DECEMBER_06_2008_1102AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/nonterminal/debug_handler_state.hpp>
+#include <boost/fusion/include/out.hpp>
+#include <iostream>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+
+// The stream to use for debug output
+#if !defined(BOOST_SPIRIT_DEBUG_OUT)
+#define BOOST_SPIRIT_DEBUG_OUT std::cerr
+#endif
+
+// number of tokens to print while debugging
+#if !defined(BOOST_SPIRIT_DEBUG_PRINT_SOME)
+#define BOOST_SPIRIT_DEBUG_PRINT_SOME 20
+#endif
+
+// number of spaces to indent
+#if !defined(BOOST_SPIRIT_DEBUG_INDENT)
+#define BOOST_SPIRIT_DEBUG_INDENT 2
+#endif
+
+namespace boost { namespace spirit { namespace qi
+{
+ namespace detail
+ {
+ template<typename Char>
+ inline void token_printer(std::ostream& o, Char c)
+ {
+ // allow to customize the token printer routine
+ spirit::traits::print_token(o, c);
+ }
+ }
+
+ struct simple_trace
+ {
+ int& get_indent() const
+ {
+ static int indent = 0;
+ return indent;
+ }
+
+ void print_indent(int n) const
+ {
+ n *= BOOST_SPIRIT_DEBUG_INDENT;
+ for (int i = 0; i != n; ++i)
+ BOOST_SPIRIT_DEBUG_OUT << ' ';
+ }
+
+ template <typename Iterator>
+ void print_some(
+ char const* tag
+ , int /*indent*/
+ , Iterator first, Iterator const& last) const
+ {
+ print_indent(get_indent());
+ BOOST_SPIRIT_DEBUG_OUT << '<' << tag << '>';
+ int const n = BOOST_SPIRIT_DEBUG_PRINT_SOME;
+ for (int i = 0; first != last && i != n && *first; ++i, ++first)
+ detail::token_printer(BOOST_SPIRIT_DEBUG_OUT, *first);
+ BOOST_SPIRIT_DEBUG_OUT << "</" << tag << '>' << std::endl;
+
+ // $$$ FIXME convert invalid xml characters (e.g. '<') to valid
+ // character entities. $$$
+ }
+
+ template <typename Iterator, typename Context, typename State>
+ void operator()(
+ Iterator const& first
+ , Iterator const& last
+ , Context const& context
+ , State state
+ , std::string const& rule_name) const
+ {
+ switch (state)
+ {
+ case pre_parse:
+ print_indent(get_indent()++);
+ BOOST_SPIRIT_DEBUG_OUT
+ << '<' << rule_name << '>'
+ << std::endl;
+ print_some("try", get_indent(), first, last);
+ break;
+ case successful_parse:
+ print_some("success", get_indent(), first, last);
+ print_indent(get_indent());
+ BOOST_SPIRIT_DEBUG_OUT
+ << "<attributes>";
+ traits::print_attribute(
+ BOOST_SPIRIT_DEBUG_OUT,
+ context.attributes
+ );
+ BOOST_SPIRIT_DEBUG_OUT
+ << "</attributes>";
+ if (!fusion::empty(context.locals))
+ BOOST_SPIRIT_DEBUG_OUT
+ << "<locals>"
+ << context.locals
+ << "</locals>";
+ BOOST_SPIRIT_DEBUG_OUT << std::endl;
+ print_indent(--get_indent());
+ BOOST_SPIRIT_DEBUG_OUT
+ << "</" << rule_name << '>'
+ << std::endl;
+ break;
+ case failed_parse:
+ print_indent(get_indent());
+ BOOST_SPIRIT_DEBUG_OUT << "<fail/>" << std::endl;
+ print_indent(--get_indent());
+ BOOST_SPIRIT_DEBUG_OUT
+ << "</" << rule_name << '>'
+ << std::endl;
+ break;
+ }
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/nonterminal/success_handler.hpp b/boost/spirit/home/qi/nonterminal/success_handler.hpp
new file mode 100644
index 0000000000..3b3133c7fb
--- /dev/null
+++ b/boost/spirit/home/qi/nonterminal/success_handler.hpp
@@ -0,0 +1,83 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_SUCCESS_HANDLER_FEBRUARY_25_2011_1051AM)
+#define BOOST_SPIRIT_SUCCESS_HANDLER_FEBRUARY_25_2011_1051AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/nonterminal/rule.hpp>
+#include <boost/function.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <
+ typename Iterator, typename Context
+ , typename Skipper, typename F
+ >
+ struct success_handler
+ {
+ typedef function<
+ bool(Iterator& first, Iterator const& last
+ , Context& context
+ , Skipper const& skipper
+ )>
+ function_type;
+
+ success_handler(function_type subject, F f)
+ : subject(subject)
+ , f(f)
+ {
+ }
+
+ bool operator()(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper) const
+ {
+ Iterator i = first;
+ bool r = subject(i, last, context, skipper);
+ if (r)
+ {
+ typedef
+ fusion::vector<
+ Iterator&
+ , Iterator const&
+ , Iterator const&>
+ params;
+ skip_over(first, last, skipper);
+ params args(first, last, i);
+ f(args, context);
+
+ first = i;
+ }
+ return r;
+ }
+
+ function_type subject;
+ F f;
+ };
+
+ template <
+ typename Iterator, typename T0, typename T1, typename T2
+ , typename F>
+ void on_success(rule<Iterator, T0, T1, T2>& r, F f)
+ {
+ typedef rule<Iterator, T0, T1, T2> rule_type;
+
+ typedef
+ success_handler<
+ Iterator
+ , typename rule_type::context_type
+ , typename rule_type::skipper_type
+ , F>
+ success_handler;
+ r.f = success_handler(r.f, f);
+ }
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric.hpp b/boost/spirit/home/qi/numeric.hpp
new file mode 100644
index 0000000000..7e1ef2691a
--- /dev/null
+++ b/boost/spirit/home/qi/numeric.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_NUMERIC_FEBRUARY_05_2007_1231PM)
+#define BOOST_SPIRIT_NUMERIC_FEBRUARY_05_2007_1231PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/numeric/bool.hpp>
+#include <boost/spirit/home/qi/numeric/int.hpp>
+#include <boost/spirit/home/qi/numeric/uint.hpp>
+#include <boost/spirit/home/qi/numeric/real.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/bool.hpp b/boost/spirit/home/qi/numeric/bool.hpp
new file mode 100644
index 0000000000..4041fc388d
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/bool.hpp
@@ -0,0 +1,338 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 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)
+==============================================================================*/
+#if !defined(SPIRIT_QI_BOOL_SEP_29_2009_0709AM)
+#define SPIRIT_QI_BOOL_SEP_29_2009_0709AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/detail/enable_lit.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/numeric/bool_policies.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit
+{
+ namespace qi
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // forward declaration only
+ template <typename T>
+ struct bool_policies;
+
+ ///////////////////////////////////////////////////////////////////////
+ // This is the class that the user can instantiate directly in
+ // order to create a customized bool parser
+ template <typename T, typename BoolPolicies = bool_policies<T> >
+ struct bool_parser
+ : spirit::terminal<tag::stateful_tag<BoolPolicies, tag::bool_, T> >
+ {
+ typedef tag::stateful_tag<BoolPolicies, tag::bool_, T> tag_type;
+
+ bool_parser() {}
+ bool_parser(BoolPolicies const& data)
+ : spirit::terminal<tag_type>(data) {}
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables bool_
+ struct use_terminal<qi::domain, tag::bool_>
+ : mpl::true_ {};
+
+ template <> // enables true_
+ struct use_terminal<qi::domain, tag::true_>
+ : mpl::true_ {};
+
+ template <> // enables false_
+ struct use_terminal<qi::domain, tag::false_>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A0> // enables lit(...)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, bool> >::type>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A0> // enables bool_(...)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::bool_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <> // enables *lazy* bool_(...)
+ struct use_lazy_terminal<qi::domain, tag::bool_, 1>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // enables any custom bool_parser
+ template <typename T, typename BoolPolicies>
+ struct use_terminal<qi::domain
+ , tag::stateful_tag<BoolPolicies, tag::bool_, T> >
+ : mpl::true_ {};
+
+ // enables any custom bool_parser(...)
+ template <typename T, typename BoolPolicies, typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::stateful_tag<BoolPolicies, tag::bool_, T>
+ , fusion::vector1<A0> > >
+ : mpl::true_ {};
+
+ // enables *lazy* custom bool_parser(...)
+ template <typename T, typename BoolPolicies>
+ struct use_lazy_terminal<
+ qi::domain
+ , tag::stateful_tag<BoolPolicies, tag::bool_, T>
+ , 1 // arity
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::bool_;
+ using spirit::true_;
+ using spirit::false_;
+ using spirit::lit; // lit(true) is equivalent to true
+#endif
+ using spirit::bool_type;
+ using spirit::true_type;
+ using spirit::false_type;
+ using spirit::lit_type;
+
+ namespace detail
+ {
+ template <typename T, typename BoolPolicies>
+ struct bool_impl
+ {
+ template <typename Iterator, typename Attribute>
+ static bool parse(Iterator& first, Iterator const& last
+ , Attribute& attr, BoolPolicies const& p, bool allow_true = true
+ , bool disallow_false = false)
+ {
+ if (first == last)
+ return false;
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ p; // suppresses warning: C4100: 'p' : unreferenced formal parameter
+#endif
+ return (allow_true && p.parse_true(first, last, attr)) ||
+ (!disallow_false && p.parse_false(first, last, attr));
+ }
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This actual boolean parser
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename BoolPolicies = bool_policies<T> >
+ struct any_bool_parser
+ : primitive_parser<any_bool_parser<T, BoolPolicies> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef detail::bool_impl<T, BoolPolicies> extract;
+ qi::skip_over(first, last, skipper);
+ return extract::parse(first, last, attr, BoolPolicies());
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("boolean");
+ }
+ };
+
+ template <typename T, typename BoolPolicies = bool_policies<T>
+ , bool no_attribute = true>
+ struct literal_bool_parser
+ : primitive_parser<literal_bool_parser<T, BoolPolicies, no_attribute> >
+ {
+ template <typename Value>
+ literal_bool_parser(Value const& n) : n_(n) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, T>
+ {};
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef detail::bool_impl<T, BoolPolicies> extract;
+ qi::skip_over(first, last, skipper);
+ return extract::parse(first, last, attr, BoolPolicies(), n_, n_);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("boolean");
+ }
+
+ T n_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Modifiers
+ , typename Policies = bool_policies<T> >
+ struct make_bool
+ {
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> >
+ no_case;
+
+ typedef typename mpl::if_<
+ mpl::and_<
+ no_case
+ , is_same<bool_policies<T>, Policies>
+ >
+ , any_bool_parser<T, no_case_bool_policies<T> >
+ , any_bool_parser<T, Policies> >::type
+ result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ template <typename T, typename Modifiers
+ , typename Policies = bool_policies<T> >
+ struct make_direct_bool
+ {
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> >
+ no_case;
+
+ typedef typename mpl::if_<
+ mpl::and_<
+ no_case
+ , is_same<bool_policies<T>, Policies>
+ >
+ , literal_bool_parser<T, no_case_bool_policies<T>, false>
+ , literal_bool_parser<T, Policies, false> >::type
+ result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ template <typename T, typename Modifiers, bool b
+ , typename Policies = bool_policies<T> >
+ struct make_predefined_direct_bool
+ {
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> >
+ no_case;
+
+ typedef typename mpl::if_<
+ mpl::and_<
+ no_case
+ , is_same<bool_policies<T>, Policies>
+ >
+ , literal_bool_parser<T, no_case_bool_policies<T>, false>
+ , literal_bool_parser<T, Policies, false> >::type
+ result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type(b);
+ }
+ };
+
+ template <typename T, typename Modifiers
+ , typename Policies = bool_policies<T> >
+ struct make_literal_bool
+ {
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> >
+ no_case;
+
+ typedef typename mpl::if_<
+ mpl::and_<
+ no_case
+ , is_same<bool_policies<T>, Policies>
+ >
+ , literal_bool_parser<T, no_case_bool_policies<T> >
+ , literal_bool_parser<T, Policies> >::type
+ result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, bool> >::type>
+ : make_literal_bool<bool, Modifiers> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::false_, Modifiers>
+ : make_predefined_direct_bool<bool, Modifiers, false>
+ {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::true_, Modifiers>
+ : make_predefined_direct_bool<bool, Modifiers, true>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Policies, typename Modifiers>
+ struct make_primitive<
+ tag::stateful_tag<Policies, tag::bool_, T>, Modifiers>
+ : make_bool<T, Modifiers, Policies> {};
+
+ template <typename T, typename Policies, typename A0, typename Modifiers>
+ struct make_primitive<
+ terminal_ex<tag::stateful_tag<Policies, tag::bool_, T>
+ , fusion::vector1<A0> >, Modifiers>
+ : make_direct_bool<T, Modifiers, Policies> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::bool_, Modifiers>
+ : make_bool<bool, Modifiers> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::bool_
+ , fusion::vector1<A0> >, Modifiers>
+ : make_direct_bool<bool, Modifiers> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/bool_policies.hpp b/boost/spirit/home/qi/numeric/bool_policies.hpp
new file mode 100644
index 0000000000..1e7c6e5164
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/bool_policies.hpp
@@ -0,0 +1,81 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_QI_BOOL_POLICIES_SEP_29_2009_0710AM)
+#define SPIRIT_QI_BOOL_POLICIES_SEP_29_2009_0710AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/detail/string_parse.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Default boolean policies
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T = bool>
+ struct bool_policies
+ {
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_true(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ if (detail::string_parse("true", first, last, unused))
+ {
+ spirit::traits::assign_to(T(true), attr); // result is true
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_false(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ if (detail::string_parse("false", first, last, unused))
+ {
+ spirit::traits::assign_to(T(false), attr); // result is false
+ return true;
+ }
+ return false;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T = bool>
+ struct no_case_bool_policies
+ {
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_true(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ if (detail::string_parse("true", "TRUE", first, last, unused))
+ {
+ spirit::traits::assign_to(T(true), attr); // result is true
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_false(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ if (detail::string_parse("false", "FALSE", first, last, unused))
+ {
+ spirit::traits::assign_to(T(false), attr); // result is false
+ return true;
+ }
+ return false;
+ }
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/detail/numeric_utils.hpp b/boost/spirit/home/qi/numeric/detail/numeric_utils.hpp
new file mode 100644
index 0000000000..f57c4d7214
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/detail/numeric_utils.hpp
@@ -0,0 +1,505 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Jan Frederick Eick
+ Copyright (c) 2011 Christopher Jefferson
+ Copyright (c) 2006 Stephen Nutt
+
+ Distributed under the 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(SPIRIT_NUMERIC_UTILS_APRIL_17_2006_0816AM)
+#define SPIRIT_NUMERIC_UTILS_APRIL_17_2006_0816AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/detail/iterator.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/char_encoding/ascii.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/limits.hpp>
+
+#if !defined(SPIRIT_NUMERICS_LOOP_UNROLL)
+# define SPIRIT_NUMERICS_LOOP_UNROLL 3
+#endif
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // The maximum radix digits that can be represented without
+ // overflow:
+ //
+ // template<typename T, unsigned Radix>
+ // struct digits_traits::value;
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, unsigned Radix>
+ struct digits_traits;
+
+// lookup table for log2(x) : 2 <= x <= 36
+#define BOOST_SPIRIT_LOG2 (#error)(#error) \
+ (1000000)(1584960)(2000000)(2321920)(2584960)(2807350) \
+ (3000000)(3169920)(3321920)(3459430)(3584960)(3700430) \
+ (3807350)(3906890)(4000000)(4087460)(4169920)(4247920) \
+ (4321920)(4392310)(4459430)(4523560)(4584960)(4643850) \
+ (4700430)(4754880)(4807350)(4857980)(4906890)(4954190) \
+ (5000000)(5044390)(5087460)(5129280)(5169925) \
+ /***/
+
+#define BOOST_PP_LOCAL_MACRO(Radix) \
+ template <typename T> struct digits_traits<T, Radix> \
+ { \
+ typedef std::numeric_limits<T> numeric_limits_type; \
+ BOOST_STATIC_CONSTANT(int, value = static_cast<int>( \
+ (numeric_limits_type::digits * 1000000) / \
+ BOOST_PP_SEQ_ELEM(Radix, BOOST_SPIRIT_LOG2))); \
+ }; \
+ /***/
+
+#define BOOST_PP_LOCAL_LIMITS (2, 36)
+#include BOOST_PP_LOCAL_ITERATE()
+
+#undef BOOST_SPIRIT_LOG2
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // Traits class for radix specific number conversion
+ //
+ // Test the validity of a single character:
+ //
+ // template<typename Char> static bool is_valid(Char ch);
+ //
+ // Convert a digit from character representation to binary
+ // representation:
+ //
+ // template<typename Char> static int digit(Char ch);
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <unsigned Radix>
+ struct radix_traits
+ {
+ template <typename Char>
+ inline static bool is_valid(Char ch)
+ {
+ if (Radix <= 10)
+ return (ch >= '0' && ch <= static_cast<Char>('0' + Radix -1));
+ return (ch >= '0' && ch <= '9')
+ || (ch >= 'a' && ch <= static_cast<Char>('a' + Radix -10 -1))
+ || (ch >= 'A' && ch <= static_cast<Char>('A' + Radix -10 -1));
+ }
+
+ template <typename Char>
+ inline static unsigned digit(Char ch)
+ {
+ if (Radix <= 10 || (ch >= '0' && ch <= '9'))
+ return ch - '0';
+ return spirit::char_encoding::ascii::tolower(ch) - 'a' + 10;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // positive_accumulator/negative_accumulator: Accumulator policies for
+ // extracting integers. Use positive_accumulator if number is positive.
+ // Use negative_accumulator if number is negative.
+ ///////////////////////////////////////////////////////////////////////////
+ template <unsigned Radix>
+ struct positive_accumulator
+ {
+ template <typename T, typename Char>
+ inline static void add(T& n, Char ch, mpl::false_) // unchecked add
+ {
+ const int digit = radix_traits<Radix>::digit(ch);
+ n = n * T(Radix) + T(digit);
+ }
+
+ template <typename T, typename Char>
+ inline static bool add(T& n, Char ch, mpl::true_) // checked add
+ {
+ // Ensure n *= Radix will not overflow
+ static T const max = (std::numeric_limits<T>::max)();
+ static T const val = max / Radix;
+ if (n > val)
+ return false;
+
+ n *= Radix;
+
+ // Ensure n += digit will not overflow
+ const int digit = radix_traits<Radix>::digit(ch);
+ if (n > max - digit)
+ return false;
+
+ n += static_cast<T>(digit);
+ return true;
+ }
+ };
+
+ template <unsigned Radix>
+ struct negative_accumulator
+ {
+ template <typename T, typename Char>
+ inline static void add(T& n, Char ch, mpl::false_) // unchecked subtract
+ {
+ const int digit = radix_traits<Radix>::digit(ch);
+ n = n * T(Radix) - T(digit);
+ }
+
+ template <typename T, typename Char>
+ inline static bool add(T& n, Char ch, mpl::true_) // checked subtract
+ {
+ // Ensure n *= Radix will not underflow
+ static T const min = (std::numeric_limits<T>::min)();
+ static T const val = (min + 1) / T(Radix);
+ if (n < val)
+ return false;
+
+ n *= Radix;
+
+ // Ensure n -= digit will not underflow
+ int const digit = radix_traits<Radix>::digit(ch);
+ if (n < min + digit)
+ return false;
+
+ n -= static_cast<T>(digit);
+ return true;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Common code for extract_int::parse specializations
+ ///////////////////////////////////////////////////////////////////////////
+ template <unsigned Radix, typename Accumulator, int MaxDigits>
+ struct int_extractor
+ {
+ template <typename Char, typename T>
+ inline static bool
+ call(Char ch, std::size_t count, T& n, mpl::true_)
+ {
+ static std::size_t const
+ overflow_free = digits_traits<T, Radix>::value - 1;
+
+ if (count < overflow_free)
+ {
+ Accumulator::add(n, ch, mpl::false_());
+ }
+ else
+ {
+ if (!Accumulator::add(n, ch, mpl::true_()))
+ return false; // over/underflow!
+ }
+ return true;
+ }
+
+ template <typename Char, typename T>
+ inline static bool
+ call(Char ch, std::size_t /*count*/, T& n, mpl::false_)
+ {
+ // no need to check for overflow
+ Accumulator::add(n, ch, mpl::false_());
+ return true;
+ }
+
+ template <typename Char>
+ inline static bool
+ call(Char /*ch*/, std::size_t /*count*/, unused_type, mpl::false_)
+ {
+ return true;
+ }
+
+ template <typename Char, typename T>
+ inline static bool
+ call(Char ch, std::size_t count, T& n)
+ {
+ return call(ch, count, n
+ , mpl::bool_<
+ ( (MaxDigits < 0)
+ || (MaxDigits > digits_traits<T, Radix>::value)
+ )
+ && std::numeric_limits<T>::is_modulo
+ >()
+ );
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // End of loop checking: check if the number of digits
+ // being parsed exceeds MaxDigits. Note: if MaxDigits == -1
+ // we don't do any checking.
+ ///////////////////////////////////////////////////////////////////////////
+ template <int MaxDigits>
+ struct check_max_digits
+ {
+ inline static bool
+ call(std::size_t count)
+ {
+ return count < MaxDigits; // bounded
+ }
+ };
+
+ template <>
+ struct check_max_digits<-1>
+ {
+ inline static bool
+ call(std::size_t /*count*/)
+ {
+ return true; // unbounded
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // extract_int: main code for extracting integers
+ ///////////////////////////////////////////////////////////////////////////
+#define SPIRIT_NUMERIC_INNER_LOOP(z, x, data) \
+ if (!check_max_digits<MaxDigits>::call(count + leading_zeros) \
+ || it == last) \
+ break; \
+ ch = *it; \
+ if (!radix_check::is_valid(ch) || !extractor::call(ch, count, val)) \
+ break; \
+ ++it; \
+ ++count; \
+ /**/
+
+ template <
+ typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
+ , typename Accumulator = positive_accumulator<Radix>
+ , bool Accumulate = false
+ >
+ struct extract_int
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4127) // conditional expression is constant
+#endif
+ template <typename Iterator, typename Attribute>
+ inline static bool
+ parse_main(
+ Iterator& first
+ , Iterator const& last
+ , Attribute& attr)
+ {
+ typedef radix_traits<Radix> radix_check;
+ typedef int_extractor<Radix, Accumulator, MaxDigits> extractor;
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+
+ Iterator it = first;
+ std::size_t leading_zeros = 0;
+ if (!Accumulate)
+ {
+ // skip leading zeros
+ while (it != last && *it == '0' && leading_zeros < MaxDigits)
+ {
+ ++it;
+ ++leading_zeros;
+ }
+ }
+
+ typedef typename
+ traits::attribute_type<Attribute>::type
+ attribute_type;
+
+ attribute_type val = Accumulate ? attr : attribute_type(0);
+ std::size_t count = 0;
+ char_type ch;
+
+ while (true)
+ {
+ BOOST_PP_REPEAT(
+ SPIRIT_NUMERICS_LOOP_UNROLL
+ , SPIRIT_NUMERIC_INNER_LOOP, _)
+ }
+
+ if (count + leading_zeros >= MinDigits)
+ {
+ traits::assign_to(val, attr);
+ first = it;
+ return true;
+ }
+ return false;
+ }
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+ template <typename Iterator>
+ inline static bool
+ parse(
+ Iterator& first
+ , Iterator const& last
+ , unused_type)
+ {
+ T n = 0; // must calculate value to detect over/underflow
+ return parse_main(first, last, n);
+ }
+
+ template <typename Iterator, typename Attribute>
+ inline static bool
+ parse(
+ Iterator& first
+ , Iterator const& last
+ , Attribute& attr)
+ {
+ return parse_main(first, last, attr);
+ }
+ };
+#undef SPIRIT_NUMERIC_INNER_LOOP
+
+ ///////////////////////////////////////////////////////////////////////////
+ // extract_int: main code for extracting integers
+ // common case where MinDigits == 1 and MaxDigits = -1
+ ///////////////////////////////////////////////////////////////////////////
+#define SPIRIT_NUMERIC_INNER_LOOP(z, x, data) \
+ if (it == last) \
+ break; \
+ ch = *it; \
+ if (!radix_check::is_valid(ch)) \
+ break; \
+ if (!extractor::call(ch, count, val)) \
+ return false; \
+ ++it; \
+ ++count; \
+ /**/
+
+ template <typename T, unsigned Radix, typename Accumulator, bool Accumulate>
+ struct extract_int<T, Radix, 1, -1, Accumulator, Accumulate>
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4127) // conditional expression is constant
+#endif
+ template <typename Iterator, typename Attribute>
+ inline static bool
+ parse_main(
+ Iterator& first
+ , Iterator const& last
+ , Attribute& attr)
+ {
+ typedef radix_traits<Radix> radix_check;
+ typedef int_extractor<Radix, Accumulator, -1> extractor;
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+
+ Iterator it = first;
+ std::size_t count = 0;
+ if (!Accumulate)
+ {
+ // skip leading zeros
+ while (it != last && *it == '0')
+ {
+ ++it;
+ ++count;
+ }
+
+ if (it == last)
+ {
+ if (count == 0) // must have at least one digit
+ return false;
+ traits::assign_to(0, attr);
+ first = it;
+ return true;
+ }
+ }
+
+ typedef typename
+ traits::attribute_type<Attribute>::type
+ attribute_type;
+
+ attribute_type val = Accumulate ? attr : attribute_type(0);
+ char_type ch = *it;
+
+ if (!radix_check::is_valid(ch) || !extractor::call(ch, 0, val))
+ {
+ if (count == 0) // must have at least one digit
+ return false;
+ traits::assign_to(val, attr);
+ first = it;
+ return true;
+ }
+
+ count = 0;
+ ++it;
+ while (true)
+ {
+ BOOST_PP_REPEAT(
+ SPIRIT_NUMERICS_LOOP_UNROLL
+ , SPIRIT_NUMERIC_INNER_LOOP, _)
+ }
+
+ traits::assign_to(val, attr);
+ first = it;
+ return true;
+ }
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+ template <typename Iterator>
+ inline static bool
+ parse(
+ Iterator& first
+ , Iterator const& last
+ , unused_type)
+ {
+ T n = 0; // must calculate value to detect over/underflow
+ return parse_main(first, last, n);
+ }
+
+ template <typename Iterator, typename Attribute>
+ inline static bool
+ parse(
+ Iterator& first
+ , Iterator const& last
+ , Attribute& attr)
+ {
+ return parse_main(first, last, attr);
+ }
+ };
+
+#undef SPIRIT_NUMERIC_INNER_LOOP
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Cast an signed integer to an unsigned integer
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T,
+ bool force_unsigned
+ = mpl::and_<is_integral<T>, is_signed<T> >::value>
+ struct cast_unsigned;
+
+ template <typename T>
+ struct cast_unsigned<T, true>
+ {
+ typedef typename make_unsigned<T>::type unsigned_type;
+ typedef typename make_unsigned<T>::type& unsigned_type_ref;
+
+ inline static unsigned_type_ref call(T& n)
+ {
+ return unsigned_type_ref(n);
+ }
+ };
+
+ template <typename T>
+ struct cast_unsigned<T, false>
+ {
+ inline static T& call(T& n)
+ {
+ return n;
+ }
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/detail/real_impl.hpp b/boost/spirit/home/qi/numeric/detail/real_impl.hpp
new file mode 100644
index 0000000000..a4bd8789b6
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/detail/real_impl.hpp
@@ -0,0 +1,271 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(SPIRIT_REAL_IMPL_APRIL_18_2006_0901AM)
+#define SPIRIT_REAL_IMPL_APRIL_18_2006_0901AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <cmath>
+#include <boost/limits.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/detail/pow10.hpp>
+#include <boost/spirit/home/support/detail/sign.hpp>
+#include <boost/assert.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4100) // 'p': unreferenced formal parameter
+# pragma warning(disable: 4127) // conditional expression is constant
+#endif
+
+namespace boost { namespace spirit { namespace traits
+{
+ using spirit::traits::pow10;
+
+ template <typename T>
+ inline void
+ scale(int exp, T& n)
+ {
+ if (exp >= 0)
+ {
+ // $$$ Why is this failing for boost.math.concepts ? $$$
+ //~ int nn = std::numeric_limits<T>::max_exponent10;
+ //~ BOOST_ASSERT(exp <= std::numeric_limits<T>::max_exponent10);
+ n *= pow10<T>(exp);
+ }
+ else
+ {
+ if (exp < std::numeric_limits<T>::min_exponent10)
+ {
+ n /= pow10<T>(-std::numeric_limits<T>::min_exponent10);
+ n /= pow10<T>(-exp + std::numeric_limits<T>::min_exponent10);
+ }
+ else
+ {
+ n /= pow10<T>(-exp);
+ }
+ }
+ }
+
+ inline void
+ scale(int /*exp*/, unused_type /*n*/)
+ {
+ // no-op for unused_type
+ }
+
+ template <typename T>
+ inline void
+ scale(int exp, int frac, T& n)
+ {
+ scale(exp - frac, n);
+ }
+
+ inline void
+ scale(int /*exp*/, int /*frac*/, unused_type /*n*/)
+ {
+ // no-op for unused_type
+ }
+
+ inline float
+ negate(bool neg, float n)
+ {
+ return neg ? spirit::detail::changesign(n) : n;
+ }
+
+ inline double
+ negate(bool neg, double n)
+ {
+ return neg ? spirit::detail::changesign(n) : n;
+ }
+
+ inline long double
+ negate(bool neg, long double n)
+ {
+ return neg ? spirit::detail::changesign(n) : n;
+ }
+
+ template <typename T>
+ inline T
+ negate(bool neg, T const& n)
+ {
+ return neg ? -n : n;
+ }
+
+ inline unused_type
+ negate(bool /*neg*/, unused_type n)
+ {
+ // no-op for unused_type
+ return n;
+ }
+
+ template <typename T>
+ inline bool
+ is_equal_to_one(T const& value)
+ {
+ return value == 1.0;
+ }
+
+ inline bool
+ is_equal_to_one(unused_type)
+ {
+ // no-op for unused_type
+ return false;
+ }
+}}}
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ template <typename T, typename RealPolicies>
+ struct real_impl
+ {
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse(Iterator& first, Iterator const& last, Attribute& attr,
+ RealPolicies const& p)
+ {
+ if (first == last)
+ return false;
+ Iterator save = first;
+
+ // Start by parsing the sign. neg will be true if
+ // we got a "-" sign, false otherwise.
+ bool neg = p.parse_sign(first, last);
+
+ // Now attempt to parse an integer
+ T n = 0;
+ bool got_a_number = p.parse_n(first, last, n);
+
+ // If we did not get a number it might be a NaN, Inf or a leading
+ // dot.
+ if (!got_a_number)
+ {
+ // Check whether the number to parse is a NaN or Inf
+ if (p.parse_nan(first, last, n) ||
+ p.parse_inf(first, last, n))
+ {
+ // If we got a negative sign, negate the number
+ traits::assign_to(traits::negate(neg, n), attr);
+ return true; // got a NaN or Inf, return early
+ }
+
+ // If we did not get a number and our policies do not
+ // allow a leading dot, fail and return early (no-match)
+ if (!p.allow_leading_dot)
+ {
+ first = save;
+ return false;
+ }
+ }
+
+ bool e_hit = false;
+ int frac_digits = 0;
+
+ // Try to parse the dot ('.' decimal point)
+ if (p.parse_dot(first, last))
+ {
+ // We got the decimal point. Now we will try to parse
+ // the fraction if it is there. If not, it defaults
+ // to zero (0) only if we already got a number.
+ Iterator savef = first;
+ if (p.parse_frac_n(first, last, n))
+ {
+ // Optimization note: don't compute frac_digits if T is
+ // an unused_type. This should be optimized away by the compiler.
+ if (!is_same<T, unused_type>::value)
+ frac_digits =
+ static_cast<int>(std::distance(savef, first));
+ }
+ else if (!got_a_number || !p.allow_trailing_dot)
+ {
+ // We did not get a fraction. If we still haven't got a
+ // number and our policies do not allow a trailing dot,
+ // return no-match.
+ first = save;
+ return false;
+ }
+
+ // Now, let's see if we can parse the exponent prefix
+ e_hit = p.parse_exp(first, last);
+ }
+ else
+ {
+ // No dot and no number! Return no-match.
+ if (!got_a_number)
+ {
+ first = save;
+ return false;
+ }
+
+ // If we must expect a dot and we didn't see an exponent
+ // prefix, return no-match.
+ e_hit = p.parse_exp(first, last);
+ if (p.expect_dot && !e_hit)
+ {
+ first = save;
+ return false;
+ }
+ }
+
+ if (e_hit)
+ {
+ // We got the exponent prefix. Now we will try to parse the
+ // actual exponent. It is an error if it is not there.
+ int exp = 0;
+ if (p.parse_exp_n(first, last, exp))
+ {
+ // Got the exponent value. Scale the number by
+ // exp-frac_digits.
+ traits::scale(exp, frac_digits, n);
+ }
+ else
+ {
+ // Oops, no exponent, return no-match.
+ first = save;
+ return false;
+ }
+ }
+ else if (frac_digits)
+ {
+ // No exponent found. Scale the number by -frac_digits.
+ traits::scale(-frac_digits, n);
+ }
+ else if (traits::is_equal_to_one(n))
+ {
+ // There is a chance of having to parse one of the 1.0#...
+ // styles some implementations use for representing NaN or Inf.
+
+ // Check whether the number to parse is a NaN or Inf
+ if (p.parse_nan(first, last, n) ||
+ p.parse_inf(first, last, n))
+ {
+ // If we got a negative sign, negate the number
+ traits::assign_to(traits::negate(neg, n), attr);
+ return true; // got a NaN or Inf, return immediately
+ }
+ }
+
+ // If we got a negative sign, negate the number
+ traits::assign_to(traits::negate(neg, n), attr);
+
+ // Success!!!
+ return true;
+ }
+ };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/int.hpp b/boost/spirit/home/qi/numeric/int.hpp
new file mode 100644
index 0000000000..a30bb3f15d
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/int.hpp
@@ -0,0 +1,407 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 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)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_INT_APR_17_2006_0830AM)
+#define BOOST_SPIRIT_INT_APR_17_2006_0830AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/detail/enable_lit.hpp>
+#include <boost/spirit/home/qi/numeric/numeric_utils.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit
+{
+ namespace tag
+ {
+ template <typename T, unsigned Radix, unsigned MinDigits
+ , int MaxDigits>
+ struct int_parser {};
+ }
+
+ namespace qi
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // This one is the class that the user can instantiate directly in
+ // order to create a customized int parser
+ template <typename T = int, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct int_parser
+ : spirit::terminal<tag::int_parser<T, Radix, MinDigits, MaxDigits> >
+ {};
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ //[primitive_parsers_enable_short
+ template <> // enables short_
+ struct use_terminal<qi::domain, tag::short_> : mpl::true_ {};
+ //]
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, signed short> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables short_(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::short_, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* short_(n)
+ struct use_lazy_terminal<qi::domain, tag::short_, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //[primitive_parsers_enable_int
+ template <> // enables int_
+ struct use_terminal<qi::domain, tag::int_> : mpl::true_ {};
+ //]
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, signed> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables int_(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::int_, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* int_(n)
+ struct use_lazy_terminal<qi::domain, tag::int_, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //[primitive_parsers_enable_long
+ template <> // enables long_
+ struct use_terminal<qi::domain, tag::long_> : mpl::true_ {};
+ //]
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, signed long> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables long_(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::long_, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* long_(n)
+ struct use_lazy_terminal<qi::domain, tag::long_, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+#ifdef BOOST_HAS_LONG_LONG
+ //[primitive_parsers_enable_long_long
+ template <> // enables long_long
+ struct use_terminal<qi::domain, tag::long_long> : mpl::true_ {};
+ //]
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, boost::long_long_type> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables long_long(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::long_long, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* long_long(n)
+ struct use_lazy_terminal<qi::domain, tag::long_long, 1> : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // enables any custom int_parser
+ template <typename T, unsigned Radix, unsigned MinDigits
+ , int MaxDigits>
+ struct use_terminal<qi::domain
+ , tag::int_parser<T, Radix, MinDigits, MaxDigits> >
+ : mpl::true_ {};
+
+ // enables any custom int_parser(n)
+ template <typename T, unsigned Radix, unsigned MinDigits
+ , int MaxDigits, typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::int_parser<T, Radix, MinDigits, MaxDigits>
+ , fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ // enables *lazy* custom int_parser(n)
+ template <typename T, unsigned Radix, unsigned MinDigits
+ , int MaxDigits>
+ struct use_lazy_terminal<qi::domain
+ , tag::int_parser<T, Radix, MinDigits, MaxDigits>, 1
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::short_;
+ using spirit::int_;
+ using spirit::long_;
+#ifdef BOOST_HAS_LONG_LONG
+ using spirit::long_long;
+#endif
+ using spirit::lit; // lit(1) is equivalent to 1
+#endif
+ using spirit::short_type;
+ using spirit::int_type;
+ using spirit::long_type;
+ using spirit::lit_type;
+#ifdef BOOST_HAS_LONG_LONG
+ using spirit::long_long_type;
+#endif
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This is the actual int parser
+ ///////////////////////////////////////////////////////////////////////////
+ //[primitive_parsers_int_parser
+ template <
+ typename T
+ , unsigned Radix = 10
+ , unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct any_int_parser
+ : primitive_parser<any_int_parser<T, Radix, MinDigits, MaxDigits> >
+ {
+ // check template parameter 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16,
+ not_supported_radix, ());
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef extract_int<T, Radix, MinDigits, MaxDigits> extract;
+ qi::skip_over(first, last, skipper);
+ return extract::call(first, last, attr);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("integer");
+ }
+ };
+ //]
+
+ template <typename T, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1, bool no_attribute = true>
+ struct literal_int_parser
+ : primitive_parser<literal_int_parser<T, Radix, MinDigits, MaxDigits
+ , no_attribute> >
+ {
+ // check template parameter 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16,
+ not_supported_radix, ());
+
+ template <typename Value>
+ literal_int_parser(Value const& n) : n_(n) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, T>
+ {};
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef extract_int<T, Radix, MinDigits, MaxDigits> extract;
+ qi::skip_over(first, last, skipper);
+
+ Iterator save = first;
+ T attr_;
+
+ if (extract::call(first, last, attr_) && (attr_ == n_))
+ {
+ traits::assign_to(attr_, attr);
+ return true;
+ }
+
+ first = save;
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("integer");
+ }
+
+ T n_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ //[primitive_parsers_make_int
+ template <
+ typename T
+ , unsigned Radix = 10
+ , unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct make_int
+ {
+ typedef any_int_parser<T, Radix, MinDigits, MaxDigits> result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+ //]
+
+ template <typename T, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct make_direct_int
+ {
+ typedef literal_int_parser<T, Radix, MinDigits, MaxDigits, false>
+ result_type;
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ template <typename T, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct make_literal_int
+ {
+ typedef literal_int_parser<T, Radix, MinDigits, MaxDigits> result_type;
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, signed short> >::type>
+ : make_literal_int<signed short> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, signed> >::type>
+ : make_literal_int<signed> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, signed long> >::type>
+ : make_literal_int<signed long> {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, boost::long_long_type> >::type>
+ : make_literal_int<boost::long_long_type> {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
+ , typename Modifiers>
+ struct make_primitive<
+ tag::int_parser<T, Radix, MinDigits, MaxDigits>
+ , Modifiers>
+ : make_int<T, Radix, MinDigits, MaxDigits> {};
+
+ template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
+ , typename A0, typename Modifiers>
+ struct make_primitive<
+ terminal_ex<tag::int_parser<T, Radix, MinDigits, MaxDigits>
+ , fusion::vector1<A0> >, Modifiers>
+ : make_direct_int<T, Radix, MinDigits, MaxDigits> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //[primitive_parsers_short_primitive
+ template <typename Modifiers>
+ struct make_primitive<tag::short_, Modifiers>
+ : make_int<short> {};
+ //]
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::short_
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_int<short> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //[primitive_parsers_int_primitive
+ template <typename Modifiers>
+ struct make_primitive<tag::int_, Modifiers>
+ : make_int<int> {};
+ //]
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::int_
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_int<int> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ //[primitive_parsers_long_primitive
+ template <typename Modifiers>
+ struct make_primitive<tag::long_, Modifiers>
+ : make_int<long> {};
+ //]
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::long_
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_int<long> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+#ifdef BOOST_HAS_LONG_LONG
+ //[primitive_parsers_long_long_primitive
+ template <typename Modifiers>
+ struct make_primitive<tag::long_long, Modifiers>
+ : make_int<boost::long_long_type> {};
+ //]
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::long_long
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_int<boost::long_long_type> {};
+#endif
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/numeric_utils.hpp b/boost/spirit/home/qi/numeric/numeric_utils.hpp
new file mode 100644
index 0000000000..72a54d8fd4
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/numeric_utils.hpp
@@ -0,0 +1,149 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2011 Jan Frederick Eick
+
+ Distributed under the 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_SPIRIT_NUMERIC_UTILS_APRIL_17_2006_0830AM)
+#define BOOST_SPIRIT_NUMERIC_UTILS_APRIL_17_2006_0830AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/qi/numeric/detail/numeric_utils.hpp>
+#include <boost/assert.hpp>
+#include <boost/mpl/assert.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Extract the prefix sign (- or +), return true if a '-' was found
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator>
+ inline bool
+ extract_sign(Iterator& first, Iterator const& last)
+ {
+ (void)last; // silence unused warnings
+ BOOST_ASSERT(first != last); // precondition
+
+ // Extract the sign
+ bool neg = *first == '-';
+ if (neg || (*first == '+'))
+ {
+ ++first;
+ return neg;
+ }
+ return false;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Low level unsigned integer parser
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
+ , bool Accumulate = false>
+ struct extract_uint
+ {
+ // check template parameter 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix >= 2 && Radix <= 36,
+ not_supported_radix, ());
+
+ template <typename Iterator>
+ inline static bool call(Iterator& first, Iterator const& last, T& attr)
+ {
+ if (first == last)
+ return false;
+
+ typedef detail::extract_int<
+ T
+ , Radix
+ , MinDigits
+ , MaxDigits
+ , detail::positive_accumulator<Radix>
+ , Accumulate>
+ extract_type;
+
+ Iterator save = first;
+ if (!extract_type::parse(first, last,
+ detail::cast_unsigned<T>::call(attr)))
+ {
+ first = save;
+ return false;
+ }
+ return true;
+ }
+
+ template <typename Iterator, typename Attribute>
+ inline static bool call(Iterator& first, Iterator const& last, Attribute& attr_)
+ {
+ // this case is called when Attribute is not T
+ T attr;
+ if (call(first, last, attr))
+ {
+ traits::assign_to(attr, attr_);
+ return true;
+ }
+ return false;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Low level signed integer parser
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>
+ struct extract_int
+ {
+ // check template parameter 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16,
+ not_supported_radix, ());
+
+ template <typename Iterator>
+ inline static bool call(Iterator& first, Iterator const& last, T& attr)
+ {
+ if (first == last)
+ return false;
+
+ typedef detail::extract_int<
+ T, Radix, MinDigits, MaxDigits>
+ extract_pos_type;
+
+ typedef detail::extract_int<
+ T, Radix, MinDigits, MaxDigits, detail::negative_accumulator<Radix> >
+ extract_neg_type;
+
+ Iterator save = first;
+ bool hit = extract_sign(first, last);
+ if (hit)
+ hit = extract_neg_type::parse(first, last, attr);
+ else
+ hit = extract_pos_type::parse(first, last, attr);
+
+ if (!hit)
+ {
+ first = save;
+ return false;
+ }
+ return true;
+ }
+
+ template <typename Iterator, typename Attribute>
+ inline static bool call(Iterator& first, Iterator const& last, Attribute& attr_)
+ {
+ // this case is called when Attribute is not T
+ T attr;
+ if (call(first, last, attr))
+ {
+ traits::assign_to(attr, attr_);
+ return true;
+ }
+ return false;
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/real.hpp b/boost/spirit/home/qi/numeric/real.hpp
new file mode 100644
index 0000000000..325acd5ad7
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/real.hpp
@@ -0,0 +1,342 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 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)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_REAL_APRIL_18_2006_0850AM)
+#define BOOST_SPIRIT_REAL_APRIL_18_2006_0850AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/detail/enable_lit.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/numeric/real_policies.hpp>
+#include <boost/spirit/home/qi/numeric/numeric_utils.hpp>
+#include <boost/spirit/home/qi/numeric/detail/real_impl.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit
+{
+ namespace qi
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // forward declaration only
+ template <typename T>
+ struct real_policies;
+
+ ///////////////////////////////////////////////////////////////////////
+ // This is the class that the user can instantiate directly in
+ // order to create a customized real parser
+ template <typename T = double, typename Policies = real_policies<T> >
+ struct real_parser
+ : spirit::terminal<tag::stateful_tag<Policies, tag::double_, T> >
+ {
+ typedef tag::stateful_tag<Policies, tag::double_, T> tag_type;
+
+ real_parser() {}
+ real_parser(Policies const& p)
+ : spirit::terminal<tag_type>(p) {}
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables float_
+ struct use_terminal<qi::domain, tag::float_>
+ : mpl::true_ {};
+
+ template <> // enables double_
+ struct use_terminal<qi::domain, tag::double_>
+ : mpl::true_ {};
+
+ template <> // enables long_double
+ struct use_terminal<qi::domain, tag::long_double>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, float> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, double> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, long double> >::type>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A0> // enables float_(...)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::float_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0> // enables double_(...)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::double_, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <typename A0> // enables long_double(...)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::long_double, fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ template <> // enables *lazy* float_(...)
+ struct use_lazy_terminal<qi::domain, tag::float_, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* double_(...)
+ struct use_lazy_terminal<qi::domain, tag::double_, 1>
+ : mpl::true_ {};
+
+ template <> // enables *lazy* long_double_(...)
+ struct use_lazy_terminal<qi::domain, tag::long_double, 1>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // enables custom real_parser
+ template <typename T, typename Policies>
+ struct use_terminal<qi::domain
+ , tag::stateful_tag<Policies, tag::double_, T> >
+ : mpl::true_ {};
+
+ // enables custom real_parser(...)
+ template <typename T, typename Policies, typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::stateful_tag<Policies, tag::double_, T>
+ , fusion::vector1<A0> > >
+ : mpl::true_ {};
+
+ // enables *lazy* custom real_parser(...)
+ template <typename T, typename Policies>
+ struct use_lazy_terminal<
+ qi::domain
+ , tag::stateful_tag<Policies, tag::double_, T>
+ , 1 // arity
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::float_;
+ using spirit::double_;
+ using spirit::long_double;
+ using spirit::lit; // lit(1.0) is equivalent to 1.0
+#endif
+
+ using spirit::float_type;
+ using spirit::double_type;
+ using spirit::long_double_type;
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This is the actual real number parser
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename RealPolicies = real_policies<T> >
+ struct any_real_parser
+ : primitive_parser<any_real_parser<T, RealPolicies> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ template <typename Iterator, typename Context, typename Skipper>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , T& attr) const
+ {
+ typedef detail::real_impl<T, RealPolicies> extract;
+ qi::skip_over(first, last, skipper);
+ return extract::parse(first, last, attr, RealPolicies());
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ // this case is called when Attribute is not T
+ T attr_;
+ if (parse(first, last, context, skipper, attr_))
+ {
+ traits::assign_to(attr_, attr);
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("real");
+ }
+ };
+
+ template <typename T, typename RealPolicies = real_policies<T>
+ , bool no_attribute = true>
+ struct literal_real_parser
+ : primitive_parser<literal_real_parser<T, RealPolicies, no_attribute> >
+ {
+ template <typename Value>
+ literal_real_parser(Value const& n) : n_(n) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, T>
+ {};
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef detail::real_impl<T, RealPolicies> extract;
+ qi::skip_over(first, last, skipper);
+
+ Iterator save = first;
+ T attr_;
+
+ if (extract::parse(first, last, attr_, RealPolicies()) &&
+ (attr_ == n_))
+ {
+ traits::assign_to(attr_, attr);
+ return true;
+ }
+
+ first = save;
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("real");
+ }
+
+ T n_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Policies = real_policies<T> >
+ struct make_real
+ {
+ typedef any_real_parser<T, Policies> result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ template <typename T, typename Policies = real_policies<T> >
+ struct make_direct_real
+ {
+ typedef literal_real_parser<T, Policies, false> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(T(fusion::at_c<0>(term.args)));
+ }
+ };
+
+ template <typename T, typename Policies = real_policies<T> >
+ struct make_literal_real
+ {
+ typedef literal_real_parser<T, Policies> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, float> >::type>
+ : make_literal_real<float> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, double> >::type>
+ : make_literal_real<double> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, long double> >::type>
+ : make_literal_real<long double> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Policies, typename Modifiers>
+ struct make_primitive<
+ tag::stateful_tag<Policies, tag::double_, T>, Modifiers>
+ : make_real<T, Policies> {};
+
+ template <typename T, typename Policies, typename A0, typename Modifiers>
+ struct make_primitive<
+ terminal_ex<tag::stateful_tag<Policies, tag::double_, T>
+ , fusion::vector1<A0> >, Modifiers>
+ : make_direct_real<T, Policies> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::float_, Modifiers>
+ : make_real<float> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::float_
+ , fusion::vector1<A0> >, Modifiers>
+ : make_direct_real<float> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::double_, Modifiers>
+ : make_real<double> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::double_
+ , fusion::vector1<A0> >, Modifiers>
+ : make_direct_real<double> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::long_double, Modifiers>
+ : make_real<long double> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::long_double
+ , fusion::vector1<A0> >, Modifiers>
+ : make_direct_real<long double> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/real_policies.hpp b/boost/spirit/home/qi/numeric/real_policies.hpp
new file mode 100644
index 0000000000..6512d6f3f7
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/real_policies.hpp
@@ -0,0 +1,186 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_REAL_POLICIES_APRIL_17_2006_1158PM)
+#define SPIRIT_REAL_POLICIES_APRIL_17_2006_1158PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/numeric/numeric_utils.hpp>
+#include <boost/spirit/home/qi/detail/string_parse.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Default (unsigned) real number policies
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct ureal_policies
+ {
+ // trailing dot policy suggested by Gustavo Guerra
+ static bool const allow_leading_dot = true;
+ static bool const allow_trailing_dot = true;
+ static bool const expect_dot = false;
+
+ template <typename Iterator>
+ static bool
+ parse_sign(Iterator& /*first*/, Iterator const& /*last*/)
+ {
+ return false;
+ }
+
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_n(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ return extract_uint<T, 10, 1, -1>::call(first, last, attr);
+ }
+
+ template <typename Iterator>
+ static bool
+ parse_dot(Iterator& first, Iterator const& last)
+ {
+ if (first == last || *first != '.')
+ return false;
+ ++first;
+ return true;
+ }
+
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_frac_n(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ return extract_uint<T, 10, 1, -1, true>::call(first, last, attr);
+ }
+
+ template <typename Iterator>
+ static bool
+ parse_exp(Iterator& first, Iterator const& last)
+ {
+ if (first == last || (*first != 'e' && *first != 'E'))
+ return false;
+ ++first;
+ return true;
+ }
+
+ template <typename Iterator>
+ static bool
+ parse_exp_n(Iterator& first, Iterator const& last, int& attr)
+ {
+ return extract_int<int, 10, 1, -1>::call(first, last, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // The parse_nan() and parse_inf() functions get called whenever:
+ //
+ // - a number to parse does not start with a digit (after having
+ // successfully parsed an optional sign)
+ //
+ // or
+ //
+ // - after a floating point number of the value 1 (having no
+ // exponential part and a fractional part value of 0) has been
+ // parsed.
+ //
+ // The first call allows to recognize representations of NaN or Inf
+ // starting with a non-digit character (such as NaN, Inf, QNaN etc.).
+ //
+ // The second call allows to recognize representation formats starting
+ // with a 1.0 (such as 1.0#NAN or 1.0#INF etc.).
+ //
+ // The functions should return true if a Nan or Inf has been found. In
+ // this case the attr should be set to the matched value (NaN or
+ // Inf). The optional sign will be automatically applied afterwards.
+ //
+ // The default implementation below recognizes representations of NaN
+ // and Inf as mandated by the C99 Standard and as proposed for
+ // inclusion into the C++0x Standard: nan, nan(...), inf and infinity
+ // (the matching is performed case-insensitively).
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_nan(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ if (first == last)
+ return false; // end of input reached
+
+ if (*first != 'n' && *first != 'N')
+ return false; // not "nan"
+
+ // nan[(...)] ?
+ if (detail::string_parse("nan", "NAN", first, last, unused))
+ {
+ if (*first == '(')
+ {
+ // skip trailing (...) part
+ Iterator i = first;
+
+ while (++i != last && *i != ')')
+ ;
+ if (i == last)
+ return false; // no trailing ')' found, give up
+
+ first = ++i;
+ }
+ attr = std::numeric_limits<T>::quiet_NaN();
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_inf(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ if (first == last)
+ return false; // end of input reached
+
+ if (*first != 'i' && *first != 'I')
+ return false; // not "inf"
+
+ // inf or infinity ?
+ if (detail::string_parse("inf", "INF", first, last, unused))
+ {
+ // skip allowed 'inity' part of infinity
+ detail::string_parse("inity", "INITY", first, last, unused);
+ attr = std::numeric_limits<T>::infinity();
+ return true;
+ }
+ return false;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Default (signed) real number policies
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct real_policies : ureal_policies<T>
+ {
+ template <typename Iterator>
+ static bool
+ parse_sign(Iterator& first, Iterator const& last)
+ {
+ return extract_sign(first, last);
+ }
+ };
+
+ template <typename T>
+ struct strict_ureal_policies : ureal_policies<T>
+ {
+ static bool const expect_dot = true;
+ };
+
+ template <typename T>
+ struct strict_real_policies : real_policies<T>
+ {
+ static bool const expect_dot = true;
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/numeric/uint.hpp b/boost/spirit/home/qi/numeric/uint.hpp
new file mode 100644
index 0000000000..ea763d356c
--- /dev/null
+++ b/boost/spirit/home/qi/numeric/uint.hpp
@@ -0,0 +1,464 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2011 Bryce Lelbach
+ Copyright (c) 2011 Jan Frederick Eick
+
+ Distributed under the 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(SPIRIT_UINT_APR_17_2006_0901AM)
+#define SPIRIT_UINT_APR_17_2006_0901AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/detail/enable_lit.hpp>
+#include <boost/spirit/home/qi/numeric/numeric_utils.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/detail/is_spirit_tag.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit
+{
+ namespace tag
+ {
+ template <typename T, unsigned Radix, unsigned MinDigits
+ , int MaxDigits>
+ struct uint_parser
+ {
+ BOOST_SPIRIT_IS_TAG()
+ };
+ }
+
+ namespace qi
+ {
+ ///////////////////////////////////////////////////////////////////////
+ // This one is the class that the user can instantiate directly in
+ // order to create a customized int parser
+ template <typename T = int, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct uint_parser
+ : spirit::terminal<tag::uint_parser<T, Radix, MinDigits, MaxDigits> >
+ {};
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables ushort_
+ struct use_terminal<qi::domain, tag::ushort_> : mpl::true_ {};
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, unsigned short> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables ushort_(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::ushort_, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* ushort_(n)
+ struct use_lazy_terminal<qi::domain, tag::ushort_, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables uint_
+ struct use_terminal<qi::domain, tag::uint_> : mpl::true_ {};
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, unsigned> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables uint_(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::uint_, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* uint_(n)
+ struct use_lazy_terminal<qi::domain, tag::uint_, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables ulong_
+ struct use_terminal<qi::domain, tag::ulong_> : mpl::true_ {};
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, unsigned long> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables ulong_(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::ulong_, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* ulong_(n)
+ struct use_lazy_terminal<qi::domain, tag::ulong_, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+#ifdef BOOST_HAS_LONG_LONG
+ template <> // enables ulong_long
+ struct use_terminal<qi::domain, tag::ulong_long> : mpl::true_ {};
+
+ template <typename A0> // enables lit(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<is_same<A0, boost::ulong_long_type> >::type>
+ : mpl::true_ {};
+
+ template <typename A0> // enables ulong_long(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::ulong_long, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* ulong_long(n)
+ struct use_lazy_terminal<qi::domain, tag::ulong_long, 1> : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables bin
+ struct use_terminal<qi::domain, tag::bin> : mpl::true_ {};
+
+ template <typename A0> // enables bin(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::bin, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* bin(n)
+ struct use_lazy_terminal<qi::domain, tag::bin, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables oct
+ struct use_terminal<qi::domain, tag::oct> : mpl::true_ {};
+
+ template <typename A0> // enables oct(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::oct, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* oct(n)
+ struct use_lazy_terminal<qi::domain, tag::oct, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <> // enables hex
+ struct use_terminal<qi::domain, tag::hex> : mpl::true_ {};
+
+ template <typename A0> // enables hex(n)
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::hex, fusion::vector1<A0> > >
+ : is_arithmetic<A0> {};
+
+ template <> // enables *lazy* hex(n)
+ struct use_lazy_terminal<qi::domain, tag::hex, 1> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // enables any custom uint_parser
+ template <typename T, unsigned Radix, unsigned MinDigits
+ , int MaxDigits>
+ struct use_terminal<qi::domain
+ , tag::uint_parser<T, Radix, MinDigits, MaxDigits> >
+ : mpl::true_ {};
+
+ // enables any custom uint_parser(n)
+ template <typename T, unsigned Radix, unsigned MinDigits
+ , int MaxDigits, typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::uint_parser<T, Radix, MinDigits, MaxDigits>
+ , fusion::vector1<A0> >
+ > : mpl::true_ {};
+
+ // enables *lazy* custom uint_parser(n)
+ template <typename T, unsigned Radix, unsigned MinDigits
+ , int MaxDigits>
+ struct use_lazy_terminal<qi::domain
+ , tag::uint_parser<T, Radix, MinDigits, MaxDigits>, 1
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::bin;
+ using spirit::oct;
+ using spirit::hex;
+
+ using spirit::ushort_;
+ using spirit::uint_;
+ using spirit::ulong_;
+#ifdef BOOST_HAS_LONG_LONG
+ using spirit::ulong_long;
+#endif
+ using spirit::lit; // lit(1) is equivalent to 1
+#endif
+
+ using spirit::bin_type;
+ using spirit::oct_type;
+ using spirit::hex_type;
+
+ using spirit::ushort_type;
+ using spirit::uint_type;
+ using spirit::ulong_type;
+#ifdef BOOST_HAS_LONG_LONG
+ using spirit::ulong_long_type;
+#endif
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This is the actual uint parser
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct any_uint_parser
+ : primitive_parser<any_uint_parser<T, Radix, MinDigits, MaxDigits> >
+ {
+ // check template parameter 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix >= 2 && Radix <= 36,
+ not_supported_radix, ());
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef extract_uint<T, Radix, MinDigits, MaxDigits> extract;
+ qi::skip_over(first, last, skipper);
+ return extract::call(first, last, attr);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("unsigned-integer");
+ }
+ };
+ //]
+
+ template <typename T, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1, bool no_attribute = true>
+ struct literal_uint_parser
+ : primitive_parser<literal_uint_parser<T, Radix, MinDigits, MaxDigits
+ , no_attribute> >
+ {
+ // check template parameter 'Radix' for validity
+ BOOST_SPIRIT_ASSERT_MSG(
+ Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16,
+ not_supported_radix, ());
+
+ template <typename Value>
+ literal_uint_parser(Value const& n) : n_(n) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : mpl::if_c<no_attribute, unused_type, T>
+ {};
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef extract_uint<T, Radix, MinDigits, MaxDigits> extract;
+ qi::skip_over(first, last, skipper);
+
+ Iterator save = first;
+ T attr_;
+
+ if (extract::call(first, last, attr_) && (attr_ == n_))
+ {
+ traits::assign_to(attr_, attr);
+ return true;
+ }
+
+ first = save;
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("unsigned-integer");
+ }
+
+ T n_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct make_uint
+ {
+ typedef any_uint_parser<T, Radix, MinDigits, MaxDigits> result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ template <typename T, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct make_direct_uint
+ {
+ typedef literal_uint_parser<T, Radix, MinDigits, MaxDigits, false>
+ result_type;
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ template <typename T, unsigned Radix = 10, unsigned MinDigits = 1
+ , int MaxDigits = -1>
+ struct make_literal_uint
+ {
+ typedef literal_uint_parser<T, Radix, MinDigits, MaxDigits> result_type;
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, unsigned short> >::type>
+ : make_literal_uint<unsigned short> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, unsigned> >::type>
+ : make_literal_uint<unsigned> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, unsigned long> >::type>
+ : make_literal_uint<unsigned long> {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers, typename enable_if<is_same<A0, boost::ulong_long_type> >::type>
+ : make_literal_uint<boost::ulong_long_type> {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
+ , typename Modifiers>
+ struct make_primitive<
+ tag::uint_parser<T, Radix, MinDigits, MaxDigits>
+ , Modifiers>
+ : make_uint<T, Radix, MinDigits, MaxDigits> {};
+
+ template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
+ , typename A0, typename Modifiers>
+ struct make_primitive<
+ terminal_ex<tag::uint_parser<T, Radix, MinDigits, MaxDigits>
+ , fusion::vector1<A0> >, Modifiers>
+ : make_direct_uint<T, Radix, MinDigits, MaxDigits> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::bin, Modifiers>
+ : make_uint<unsigned, 2> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::bin
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_uint<unsigned, 2> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::oct, Modifiers>
+ : make_uint<unsigned, 8> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::oct
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_uint<unsigned, 8> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::hex, Modifiers>
+ : make_uint<unsigned, 16> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::hex
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_uint<unsigned, 16> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::ushort_, Modifiers>
+ : make_uint<unsigned short> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::ushort_
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_uint<unsigned short> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::uint_, Modifiers>
+ : make_uint<unsigned> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::uint_
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_uint<unsigned> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<tag::ulong_, Modifiers>
+ : make_uint<unsigned long> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::ulong_
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_uint<unsigned long> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+#ifdef BOOST_HAS_LONG_LONG
+ template <typename Modifiers>
+ struct make_primitive<tag::ulong_long, Modifiers>
+ : make_uint<boost::ulong_long_type> {};
+
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::ulong_long
+ , fusion::vector1<A0> > , Modifiers>
+ : make_direct_uint<boost::ulong_long_type> {};
+#endif
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator.hpp b/boost/spirit/home/qi/operator.hpp
new file mode 100644
index 0000000000..de44f5eef3
--- /dev/null
+++ b/boost/spirit/home/qi/operator.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_OPERATOR_FEBRUARY_02_2007_0558PM)
+#define BOOST_SPIRIT_OPERATOR_FEBRUARY_02_2007_0558PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/sequence.hpp>
+#include <boost/spirit/home/qi/operator/expect.hpp>
+#include <boost/spirit/home/qi/operator/alternative.hpp>
+#include <boost/spirit/home/qi/operator/sequential_or.hpp>
+#include <boost/spirit/home/qi/operator/permutation.hpp>
+#include <boost/spirit/home/qi/operator/difference.hpp>
+#include <boost/spirit/home/qi/operator/list.hpp>
+#include <boost/spirit/home/qi/operator/optional.hpp>
+#include <boost/spirit/home/qi/operator/kleene.hpp>
+#include <boost/spirit/home/qi/operator/plus.hpp>
+#include <boost/spirit/home/qi/operator/and_predicate.hpp>
+#include <boost/spirit/home/qi/operator/not_predicate.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/operator/alternative.hpp b/boost/spirit/home/qi/operator/alternative.hpp
new file mode 100644
index 0000000000..9785d45101
--- /dev/null
+++ b/boost/spirit/home/qi/operator/alternative.hpp
@@ -0,0 +1,118 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_ALTERNATIVE_FEBRUARY_05_2007_1153AM)
+#define SPIRIT_ALTERNATIVE_FEBRUARY_05_2007_1153AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/detail/alternative_function.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/detail/what_function.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/fusion/include/any.hpp>
+#include <boost/fusion/include/mpl.hpp>
+#include <boost/fusion/include/for_each.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::bitwise_or> // enables |
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<qi::domain, proto::tag::bitwise_or> // flattens |
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Elements>
+ struct alternative : nary_parser<alternative<Elements> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Put all the element attributes in a tuple
+ typedef typename traits::build_attribute_sequence<
+ Elements, Context, traits::alternative_attribute_transform
+ , Iterator, qi::domain
+ >::type all_attributes;
+
+ // Ok, now make a variant over the attribute sequence. Note that
+ // build_variant makes sure that 1) all attributes in the variant
+ // are unique 2) puts the unused attribute, if there is any, to
+ // the front and 3) collapses single element variants, variant<T>
+ // to T.
+ typedef typename
+ traits::build_variant<all_attributes>::type
+ type;
+ };
+
+ alternative(Elements const& elements)
+ : elements(elements) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ detail::alternative_function<Iterator, Context, Skipper, Attribute>
+ f(first, last, context, skipper, attr);
+
+ // return true if *any* of the parsers succeed
+ return fusion::any(elements, f);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ info result("alternative");
+ fusion::for_each(elements,
+ spirit::detail::what_function<Context>(result, context));
+ return result;
+ }
+
+ Elements elements;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::bitwise_or, Elements, Modifiers>
+ : make_nary_composite<Elements, alternative>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements>
+ struct has_semantic_action<qi::alternative<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::alternative<Elements>, Attribute, Context
+ , Iterator>
+ : nary_handles_container<Elements, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/and_predicate.hpp b/boost/spirit/home/qi/operator/and_predicate.hpp
new file mode 100644
index 0000000000..031ce1df01
--- /dev/null
+++ b/boost/spirit/home/qi/operator/and_predicate.hpp
@@ -0,0 +1,92 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_AND_PREDICATE_MARCH_23_2007_0617PM)
+#define SPIRIT_AND_PREDICATE_MARCH_23_2007_0617PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/fusion/include/at.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::address_of> // enables &p
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Subject>
+ struct and_predicate : unary_parser<and_predicate<Subject> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ and_predicate(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& /*attr*/) const
+ {
+ Iterator i = first;
+ return subject.parse(i, last, context, skipper, unused);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("and-predicate", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::address_of, Elements, Modifiers>
+ : make_unary_composite<Elements, and_predicate>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::and_predicate<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::and_predicate<Subject>, Attribute, Context
+ , Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/difference.hpp b/boost/spirit/home/qi/operator/difference.hpp
new file mode 100644
index 0000000000..5f8c4c90cc
--- /dev/null
+++ b/boost/spirit/home/qi/operator/difference.hpp
@@ -0,0 +1,112 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_DIFFERENCE_FEBRUARY_11_2007_1250PM)
+#define SPIRIT_DIFFERENCE_FEBRUARY_11_2007_1250PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/fusion/include/at.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::minus> // enables -
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Left, typename Right>
+ struct difference : binary_parser<difference<Left, Right> >
+ {
+ typedef Left left_type;
+ typedef Right right_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::attribute_of<left_type, Context, Iterator>::type
+ type;
+ };
+
+ difference(Left const& left, Right const& right)
+ : left(left), right(right) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ // Unlike classic Spirit, with this version of difference, the rule
+ // lit("policeman") - "police" will always fail to match.
+
+ // Spirit2 does not count the matching chars while parsing and
+ // there is no reliable and fast way to check if the LHS matches
+ // more than the RHS.
+
+ // Try RHS first
+ Iterator start = first;
+ if (right.parse(first, last, context, skipper, unused))
+ {
+ // RHS succeeds, we fail.
+ first = start;
+ return false;
+ }
+ // RHS fails, now try LHS
+ return left.parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("difference",
+ std::make_pair(left.what(context), right.what(context)));
+ }
+
+ Left left;
+ Right right;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::minus, Elements, Modifiers>
+ : make_binary_composite<Elements, difference>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Left, typename Right>
+ struct has_semantic_action<qi::difference<Left, Right> >
+ : binary_has_semantic_action<Left, Right> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Left, typename Right, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::difference<Left, Right>, Attribute, Context
+ , Iterator>
+ : binary_handles_container<Left, Right, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/expect.hpp b/boost/spirit/home/qi/operator/expect.hpp
new file mode 100644
index 0000000000..c42b2defc9
--- /dev/null
+++ b/boost/spirit/home/qi/operator/expect.hpp
@@ -0,0 +1,103 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_EXPECT_APRIL_29_2007_0445PM)
+#define SPIRIT_EXPECT_APRIL_29_2007_0445PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/sequence_base.hpp>
+#include <boost/spirit/home/qi/detail/expect_function.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <stdexcept>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::greater> // enables >
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<qi::domain, proto::tag::greater> // flattens >
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Iterator>
+ struct expectation_failure : std::runtime_error
+ {
+ expectation_failure(Iterator first, Iterator last, info const& what)
+ : std::runtime_error("boost::spirit::qi::expectation_failure")
+ , first(first), last(last), what_(what)
+ {}
+ ~expectation_failure() throw() {}
+
+ Iterator first;
+ Iterator last;
+ info what_;
+ };
+
+ template <typename Elements>
+ struct expect : sequence_base<expect<Elements>, Elements>
+ {
+ friend struct sequence_base<expect<Elements>, Elements>;
+
+ expect(Elements const& elements)
+ : sequence_base<expect<Elements>, Elements>(elements) {}
+
+ private:
+
+ template <typename Iterator, typename Context, typename Skipper>
+ static detail::expect_function<
+ Iterator, Context, Skipper
+ , expectation_failure<Iterator> >
+ fail_function(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper)
+ {
+ return detail::expect_function<
+ Iterator, Context, Skipper, expectation_failure<Iterator> >
+ (first, last, context, skipper);
+ }
+
+ std::string id() const { return "expect"; }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::greater, Elements, Modifiers>
+ : make_nary_composite<Elements, expect>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements>
+ struct has_semantic_action<qi::expect<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::expect<Elements>, Attribute, Context
+ , Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/kleene.hpp b/boost/spirit/home/qi/operator/kleene.hpp
new file mode 100644
index 0000000000..ae778f0bf7
--- /dev/null
+++ b/boost/spirit/home/qi/operator/kleene.hpp
@@ -0,0 +1,134 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_KLEENE_JANUARY_07_2007_0818AM)
+#define SPIRIT_KLEENE_JANUARY_07_2007_0818AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/qi/detail/fail_function.hpp>
+#include <boost/spirit/home/qi/detail/pass_container.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/info.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ //[composite_parsers_kleene_enable_
+ template <>
+ struct use_operator<qi::domain, proto::tag::dereference> // enables *p
+ : mpl::true_ {};
+ //]
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ //[composite_parsers_kleene
+ template <typename Subject>
+ struct kleene : unary_parser<kleene<Subject> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Build a std::vector from the subject's attribute. Note
+ // that build_std_vector may return unused_type if the
+ // subject's attribute is an unused_type.
+ typedef typename
+ traits::build_std_vector<
+ typename traits::
+ attribute_of<Subject, Context, Iterator>::type
+ >::type
+ type;
+ };
+
+ kleene(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename F>
+ bool parse_container(F f) const
+ {
+ while (!f (subject))
+ ;
+ return true;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ // ensure the attribute is actually a container type
+ traits::make_container(attr);
+
+ typedef detail::fail_function<Iterator, Context, Skipper>
+ fail_function;
+
+ Iterator iter = first;
+ fail_function f(iter, last, context, skipper);
+ parse_container(detail::make_pass_container(f, attr));
+
+ first = f.first;
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("kleene", subject.what(context));
+ }
+
+ Subject subject;
+ };
+ //]
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ //[composite_parsers_kleene_generator
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::dereference, Elements, Modifiers>
+ : make_unary_composite<Elements, kleene>
+ {};
+ //]
+
+// ///////////////////////////////////////////////////////////////////////////
+// // Define what attributes are compatible with a kleene
+// template <typename Attribute, typename Subject, typename Context, typename Iterator>
+// struct is_attribute_compatible<Attribute, kleene<Subject>, Context, Iterator>
+// : traits::is_container_compatible<qi::domain, Attribute
+// , kleene<Subject>, Context, Iterator>
+// {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::kleene<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::kleene<Subject>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/list.hpp b/boost/spirit/home/qi/operator/list.hpp
new file mode 100644
index 0000000000..cc067cd342
--- /dev/null
+++ b/boost/spirit/home/qi/operator/list.hpp
@@ -0,0 +1,135 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_LIST_MARCH_24_2007_1031AM)
+#define SPIRIT_LIST_MARCH_24_2007_1031AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/qi/detail/fail_function.hpp>
+#include <boost/spirit/home/qi/detail/pass_container.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <vector>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::modulus> // enables p % d
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Left, typename Right>
+ struct list : binary_parser<list<Left, Right> >
+ {
+ typedef Left left_type;
+ typedef Right right_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Build a std::vector from the LHS's attribute. Note
+ // that build_std_vector may return unused_type if the
+ // subject's attribute is an unused_type.
+ typedef typename
+ traits::build_std_vector<
+ typename traits::
+ attribute_of<Left, Context, Iterator>::type
+ >::type
+ type;
+ };
+
+ list(Left const& left, Right const& right)
+ : left(left), right(right) {}
+
+ template <typename F>
+ bool parse_container(F f) const
+ {
+ // in order to succeed we need to match at least one element
+ if (f (left))
+ return false;
+
+ typename F::iterator_type save = f.f.first;
+ while (right.parse(f.f.first, f.f.last, f.f.context, f.f.skipper, unused)
+ && !f (left))
+ {
+ save = f.f.first;
+ }
+
+ f.f.first = save;
+ return true;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef detail::fail_function<Iterator, Context, Skipper>
+ fail_function;
+
+ // ensure the attribute is actually a container type
+ traits::make_container(attr);
+
+ Iterator iter = first;
+ fail_function f(iter, last, context, skipper);
+ if (!parse_container(detail::make_pass_container(f, attr)))
+ return false;
+
+ first = f.first;
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("list",
+ std::make_pair(left.what(context), right.what(context)));
+ }
+
+ Left left;
+ Right right;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::modulus, Elements, Modifiers>
+ : make_binary_composite<Elements, list>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Left, typename Right>
+ struct has_semantic_action<qi::list<Left, Right> >
+ : binary_has_semantic_action<Left, Right> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Left, typename Right, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::list<Left, Right>, Attribute, Context
+ , Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/not_predicate.hpp b/boost/spirit/home/qi/operator/not_predicate.hpp
new file mode 100644
index 0000000000..57cbb0db4a
--- /dev/null
+++ b/boost/spirit/home/qi/operator/not_predicate.hpp
@@ -0,0 +1,91 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_NOT_PREDICATE_MARCH_23_2007_0618PM)
+#define SPIRIT_NOT_PREDICATE_MARCH_23_2007_0618PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/info.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::logical_not> // enables !p
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Subject>
+ struct not_predicate : unary_parser<not_predicate<Subject> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ not_predicate(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& /*attr*/) const
+ {
+ Iterator i = first;
+ return !subject.parse(i, last, context, skipper, unused);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("not-predicate", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::logical_not, Elements, Modifiers>
+ : make_unary_composite<Elements, not_predicate>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::not_predicate<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::not_predicate<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/optional.hpp b/boost/spirit/home/qi/operator/optional.hpp
new file mode 100644
index 0000000000..b183ad6f60
--- /dev/null
+++ b/boost/spirit/home/qi/operator/optional.hpp
@@ -0,0 +1,135 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_OPTIONAL_MARCH_23_2007_1117PM)
+#define SPIRIT_OPTIONAL_MARCH_23_2007_1117PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/optional.hpp>
+#include <vector>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::negate> // enables -p
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Subject>
+ struct optional : unary_parser<optional<Subject> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Build a boost::optional from the subject's attribute. Note
+ // that boost::optional may return unused_type if the
+ // subject's attribute is an unused_type.
+ typedef typename
+ traits::build_optional<
+ typename traits::
+ attribute_of<Subject, Context, Iterator>::type
+ >::type
+ type;
+ };
+
+ optional(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_impl(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr, mpl::false_) const
+ {
+ // create a local value if Attribute is not unused_type
+ typename spirit::result_of::optional_value<Attribute>::type val =
+ typename spirit::result_of::optional_value<Attribute>::type();
+
+ if (subject.parse(first, last, context, skipper, val))
+ {
+ // assign the parsed value into our attribute
+ spirit::traits::assign_to(val, attr);
+ }
+ return true;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_impl(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr, mpl::true_) const
+ {
+ subject.parse(first, last, context, skipper, attr);
+ return true;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef typename spirit::result_of::optional_value<Attribute>::type
+ attribute_type;
+
+ return parse_impl(first, last, context, skipper, attr
+ , traits::is_container<attribute_type>());
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("optional", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::negate, Elements, Modifiers>
+ : make_unary_composite<Elements, optional>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::optional<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::optional<Subject>, Attribute
+ , Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/permutation.hpp b/boost/spirit/home/qi/operator/permutation.hpp
new file mode 100644
index 0000000000..1dcad89e10
--- /dev/null
+++ b/boost/spirit/home/qi/operator/permutation.hpp
@@ -0,0 +1,146 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_PERMUTATION_OR_MARCH_13_2007_1145PM)
+#define SPIRIT_PERMUTATION_OR_MARCH_13_2007_1145PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/permute_function.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/algorithm/any_if_ns.hpp>
+#include <boost/spirit/home/support/detail/what_function.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/optional.hpp>
+#include <boost/foreach.hpp>
+#include <boost/array.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::bitwise_xor> // enables ^
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<qi::domain, proto::tag::bitwise_xor> // flattens ^
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Elements>
+ struct permutation : nary_parser<permutation<Elements> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Put all the element attributes in a tuple,
+ // wrapping each element in a boost::optional
+ typedef typename traits::build_attribute_sequence<
+ Elements, Context, traits::permutation_attribute_transform
+ , Iterator, qi::domain
+ >::type all_attributes;
+
+ // Now, build a fusion vector over the attributes. Note
+ // that build_fusion_vector 1) removes all unused attributes
+ // and 2) may return unused_type if all elements have
+ // unused_type(s).
+ typedef typename
+ traits::build_fusion_vector<all_attributes>::type
+ type;
+ };
+
+ permutation(Elements const& elements)
+ : elements(elements) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr_) const
+ {
+ typedef traits::attribute_not_unused<Context, Iterator> predicate;
+ detail::permute_function<Iterator, Context, Skipper>
+ f(first, last, context, skipper);
+
+ boost::array<bool, fusion::result_of::size<Elements>::value> flags;
+ BOOST_FOREACH(bool& taken, flags)
+ {
+ taken = false;
+ }
+
+ // wrap the attribute in a tuple if it is not a tuple
+ typename traits::wrap_if_not_tuple<Attribute>::type attr(attr_);
+
+ // We have a bool array 'flags' with one flag for each parser.
+ // permute_function sets the slot to true when the corresponding
+ // parser successful matches. We loop until there are no more
+ // successful parsers.
+
+ bool result = false;
+ f.taken = flags.begin();
+ while (spirit::any_if_ns(elements, attr, f, predicate()))
+ {
+ f.taken = flags.begin();
+ result = true;
+ }
+ return result;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ info result("permutation");
+ fusion::for_each(elements,
+ spirit::detail::what_function<Context>(result, context));
+ return result;
+ }
+
+ Elements elements;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::bitwise_xor, Elements, Modifiers>
+ : make_nary_composite<Elements, permutation>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // We specialize this for permutation (see support/attributes.hpp).
+ // For permutation, we only wrap the attribute in a tuple IFF
+ // it is not already a fusion tuple.
+ template <typename Elements, typename Attribute>
+ struct pass_attribute<qi::permutation<Elements>, Attribute>
+ : wrap_if_not_tuple<Attribute> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements>
+ struct has_semantic_action<qi::permutation<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::permutation<Elements>, Attribute, Context
+ , Iterator>
+ : nary_handles_container<Elements, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/plus.hpp b/boost/spirit/home/qi/operator/plus.hpp
new file mode 100644
index 0000000000..780403a2ca
--- /dev/null
+++ b/boost/spirit/home/qi/operator/plus.hpp
@@ -0,0 +1,125 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_PLUS_MARCH_13_2007_0127PM)
+#define SPIRIT_PLUS_MARCH_13_2007_0127PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/qi/detail/fail_function.hpp>
+#include <boost/spirit/home/qi/detail/pass_container.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/home/support/info.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::unary_plus> // enables +p
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Subject>
+ struct plus : unary_parser<plus<Subject> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Build a std::vector from the subject's attribute. Note
+ // that build_std_vector may return unused_type if the
+ // subject's attribute is an unused_type.
+ typedef typename
+ traits::build_std_vector<
+ typename traits::attribute_of<
+ Subject, Context, Iterator>::type
+ >::type
+ type;
+ };
+
+ plus(Subject const& subject)
+ : subject(subject) {}
+
+ template <typename F>
+ bool parse_container(F f) const
+ {
+ // in order to succeed we need to match at least one element
+ if (f (subject))
+ return false;
+
+ while (!f (subject))
+ ;
+ return true;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef detail::fail_function<Iterator, Context, Skipper>
+ fail_function;
+
+ // ensure the attribute is actually a container type
+ traits::make_container(attr);
+
+ Iterator iter = first;
+ fail_function f(iter, last, context, skipper);
+ if (!parse_container(detail::make_pass_container(f, attr)))
+ return false;
+
+ first = f.first;
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("plus", subject.what(context));
+ }
+
+ Subject subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::unary_plus, Elements, Modifiers>
+ : make_unary_composite<Elements, plus>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<qi::plus<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::plus<Subject>, Attribute, Context
+ , Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/sequence.hpp b/boost/spirit/home/qi/operator/sequence.hpp
new file mode 100644
index 0000000000..817b7dc7c8
--- /dev/null
+++ b/boost/spirit/home/qi/operator/sequence.hpp
@@ -0,0 +1,96 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_SEQUENCE_APR_22_2006_0811AM)
+#define SPIRIT_SEQUENCE_APR_22_2006_0811AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/sequence_base.hpp>
+#include <boost/spirit/home/qi/detail/fail_function.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::shift_right> // enables >>
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<qi::domain, proto::tag::shift_right> // flattens >>
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Elements>
+ struct sequence : sequence_base<sequence<Elements>, Elements>
+ {
+ friend struct sequence_base<sequence<Elements>, Elements>;
+
+ sequence(Elements const& elements)
+ : sequence_base<sequence<Elements>, Elements>(elements) {}
+
+ private:
+
+ template <typename Iterator, typename Context, typename Skipper>
+ static detail::fail_function<Iterator, Context, Skipper>
+ fail_function(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper)
+ {
+ return detail::fail_function<Iterator, Context, Skipper>
+ (first, last, context, skipper);
+ }
+
+ std::string id() const { return "sequence"; }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::shift_right, Elements, Modifiers>
+ : make_nary_composite<Elements, sequence>
+ {};
+
+// ///////////////////////////////////////////////////////////////////////////
+// // Define what attributes are compatible with a sequence
+// template <typename Attribute, typename Elements, typename Context, typename Iterator>
+// struct is_attribute_compatible<Attribute, sequence<Elements>, Context, Iterator>
+// : mpl::or_<
+// is_convertible<Attribute
+// , typename traits::attribute_of<sequence<Elements>, Context, Iterator>::type>
+// , traits::is_fusion_sequence_compatible<qi::domain, Attribute
+// , sequence<Elements>, Context, Iterator>
+// , traits::is_container_compatible<qi::domain, Attribute
+// , sequence<Elements>, Context, Iterator>
+// >
+// {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements>
+ struct has_semantic_action<qi::sequence<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::sequence<Elements>, Attribute, Context
+ , Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/sequence_base.hpp b/boost/spirit/home/qi/operator/sequence_base.hpp
new file mode 100644
index 0000000000..35f45dfaa3
--- /dev/null
+++ b/boost/spirit/home/qi/operator/sequence_base.hpp
@@ -0,0 +1,140 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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(SPIRIT_SEQUENCE_BASE_APRIL_22_2006_0811AM)
+#define SPIRIT_SEQUENCE_BASE_APRIL_22_2006_0811AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/detail/pass_container.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/algorithm/any_if.hpp>
+#include <boost/spirit/home/support/detail/what_function.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/sequence_base_id.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/for_each.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Derived, typename Elements>
+ struct sequence_base // this class is shared by sequence and expect
+ : nary_parser<Derived>
+ {
+ typedef Elements elements_type;
+ struct sequence_base_id;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Put all the element attributes in a tuple
+ typedef typename traits::build_attribute_sequence<
+ Elements, Context, traits::sequence_attribute_transform
+ , Iterator, qi::domain
+ >::type all_attributes;
+
+ // Now, build a fusion vector over the attributes. Note
+ // that build_fusion_vector 1) removes all unused attributes
+ // and 2) may return unused_type if all elements have
+ // unused_type(s).
+ typedef typename
+ traits::build_fusion_vector<all_attributes>::type
+ type_;
+
+ // Finally, strip single element vectors into its
+ // naked form: vector1<T> --> T
+ typedef typename
+ traits::strip_single_element_vector<type_>::type
+ type;
+ };
+
+ sequence_base(Elements const& elements)
+ : elements(elements) {}
+
+ // standard case. Attribute is a fusion tuple
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_impl(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr_, mpl::false_) const
+ {
+ Iterator iter = first;
+ typedef traits::attribute_not_unused<Context, Iterator> predicate;
+
+ // wrap the attribute in a tuple if it is not a tuple or if the
+ // attribute of this sequence is a single element tuple
+ typedef typename attribute<Context, Iterator>::type_ attr_type_;
+ typename traits::wrap_if_not_tuple<Attribute
+ , typename mpl::and_<
+ traits::one_element_sequence<attr_type_>
+ , mpl::not_<traits::one_element_sequence<Attribute> >
+ >::type
+ >::type attr(attr_);
+
+ // return false if *any* of the parsers fail
+ if (spirit::any_if(elements, attr
+ , Derived::fail_function(iter, last, context, skipper), predicate()))
+ return false;
+ first = iter;
+ return true;
+ }
+
+ // Special case when Attribute is an stl container
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_impl(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr_, mpl::true_) const
+ {
+ // ensure the attribute is actually a container type
+ traits::make_container(attr_);
+
+ Iterator iter = first;
+ // return false if *any* of the parsers fail
+ if (fusion::any(elements
+ , detail::make_sequence_pass_container(
+ Derived::fail_function(iter, last, context, skipper), attr_))
+ )
+ return false;
+ first = iter;
+ return true;
+ }
+
+ // main parse function. Dispatches to parse_impl depending
+ // on the Attribute type.
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ return parse_impl(first, last, context, skipper, attr
+ , traits::is_container<Attribute>());
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ info result(this->derived().id());
+ fusion::for_each(elements,
+ spirit::detail::what_function<Context>(result, context));
+ return result;
+ }
+
+ Elements elements;
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/operator/sequential_or.hpp b/boost/spirit/home/qi/operator/sequential_or.hpp
new file mode 100644
index 0000000000..80b86f38e4
--- /dev/null
+++ b/boost/spirit/home/qi/operator/sequential_or.hpp
@@ -0,0 +1,126 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_SEQUENTIAL_OR_MARCH_12_2007_1130PM)
+#define SPIRIT_SEQUENTIAL_OR_MARCH_12_2007_1130PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/pass_function.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/detail/what_function.hpp>
+#include <boost/spirit/home/support/algorithm/any_if_ns.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/fusion/include/for_each.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::logical_or> // enables ||
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<qi::domain, proto::tag::logical_or> // flattens ||
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Elements>
+ struct sequential_or : nary_parser<sequential_or<Elements> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Put all the element attributes in a tuple,
+ // wrapping each element in a boost::optional
+ typedef typename traits::build_attribute_sequence<
+ Elements, Context, traits::sequential_or_attribute_transform
+ , Iterator, qi::domain
+ >::type all_attributes;
+
+ // Now, build a fusion vector over the attributes. Note
+ // that build_fusion_vector 1) removes all unused attributes
+ // and 2) may return unused_type if all elements have
+ // unused_type(s).
+ typedef typename
+ traits::build_fusion_vector<all_attributes>::type
+ type;
+ };
+
+ sequential_or(Elements const& elements)
+ : elements(elements) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr_) const
+ {
+ typedef traits::attribute_not_unused<Context, Iterator> predicate;
+ detail::pass_function<Iterator, Context, Skipper>
+ f(first, last, context, skipper);
+
+ // wrap the attribute in a tuple if it is not a tuple
+ typename traits::wrap_if_not_tuple<Attribute>::type attr(attr_);
+
+ // return true if *any* of the parsers succeed
+ // (we use the non-short-circuiting version: any_if_ns
+ // to force all elements to be tested)
+ return spirit::any_if_ns(elements, attr, f, predicate());
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ info result("sequential-or");
+ fusion::for_each(elements,
+ spirit::detail::what_function<Context>(result, context));
+ return result;
+ }
+
+ Elements elements;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers>
+ struct make_composite<proto::tag::logical_or, Elements, Modifiers>
+ : make_nary_composite<Elements, sequential_or>
+ {};
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // We specialize this for sequential_or (see support/attributes.hpp).
+ // For sequential_or, we only wrap the attribute in a tuple IFF
+ // it is not already a fusion tuple.
+ template <typename Elements, typename Attribute>
+ struct pass_attribute<qi::sequential_or<Elements>, Attribute>
+ : wrap_if_not_tuple<Attribute> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements>
+ struct has_semantic_action<qi::sequential_or<Elements> >
+ : nary_has_semantic_action<Elements> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::sequential_or<Elements>, Attribute, Context
+ , Iterator>
+ : nary_handles_container<Elements, Attribute, Context, Iterator> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/parse.hpp b/boost/spirit/home/qi/parse.hpp
new file mode 100644
index 0000000000..261df759cc
--- /dev/null
+++ b/boost/spirit/home/qi/parse.hpp
@@ -0,0 +1,215 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_PARSE_APRIL_16_2006_0442PM)
+#define BOOST_SPIRIT_PARSE_APRIL_16_2006_0442PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/context.hpp>
+#include <boost/spirit/home/support/nonterminal/locals.hpp>
+#include <boost/spirit/home/qi/detail/parse.hpp>
+#include <boost/concept_check.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr>
+ inline bool
+ parse(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr)
+ {
+ // Make sure the iterator is at least a forward_iterator. If you got a
+ // compilation error here, then you are using an input_iterator while
+ // calling this function, you need to supply at least a
+ // forward_iterator instead.
+ BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+ return detail::parse_impl<Expr>::call(first, last, expr);
+ }
+
+ template <typename Iterator, typename Expr>
+ inline bool
+ parse(
+ Iterator const& first_
+ , Iterator last
+ , Expr const& expr)
+ {
+ Iterator first = first_;
+ return qi::parse(first, last, expr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T>
+ struct make_context
+ {
+ typedef context<fusion::cons<T&>, locals<> > type;
+ };
+
+ template <>
+ struct make_context<unused_type>
+ {
+ typedef unused_type type;
+ };
+ }
+
+ template <typename Iterator, typename Expr, typename Attr>
+ inline bool
+ parse(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr
+ , Attr& attr)
+ {
+ // Make sure the iterator is at least a forward_iterator. If you got a
+ // compilation error here, then you are using an input_iterator while
+ // calling this function, you need to supply at least a
+ // forward_iterator instead.
+ BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+
+ typename detail::make_context<Attr>::type context(attr);
+ return compile<qi::domain>(expr).parse(first, last, context, unused, attr);
+ }
+
+ template <typename Iterator, typename Expr, typename Attr>
+ inline bool
+ parse(
+ Iterator const& first_
+ , Iterator last
+ , Expr const& expr
+ , Attr& attr)
+ {
+ Iterator first = first_;
+ return qi::parse(first, last, expr, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr, typename Skipper>
+ inline bool
+ phrase_parse(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip)
+ {
+ // Make sure the iterator is at least a forward_iterator. If you got a
+ // compilation error here, then you are using an input_iterator while
+ // calling this function, you need to supply at least a
+ // forward_iterator instead.
+ BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+ return detail::phrase_parse_impl<Expr>::call(
+ first, last, expr, skipper, post_skip);
+ }
+
+ template <typename Iterator, typename Expr, typename Skipper>
+ inline bool
+ phrase_parse(
+ Iterator const& first_
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip)
+ {
+ Iterator first = first_;
+ return qi::phrase_parse(first, last, expr, skipper, post_skip);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr, typename Skipper, typename Attr>
+ inline bool
+ phrase_parse(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip
+ , Attr& attr)
+ {
+ // Make sure the iterator is at least a forward_iterator. If you got a
+ // compilation error here, then you are using an input_iterator while
+ // calling this function, you need to supply at least a
+ // forward_iterator instead.
+ BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+
+ typedef
+ typename result_of::compile<qi::domain, Skipper>::type
+ skipper_type;
+ skipper_type const skipper_ = compile<qi::domain>(skipper);
+
+ typename detail::make_context<Attr>::type context(attr);
+ if (!compile<qi::domain>(expr).parse(
+ first, last, context, skipper_, attr))
+ return false;
+
+ if (post_skip == skip_flag::postskip)
+ qi::skip_over(first, last, skipper_);
+ return true;
+ }
+
+ template <typename Iterator, typename Expr, typename Skipper, typename Attr>
+ inline bool
+ phrase_parse(
+ Iterator const& first_
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip
+ , Attr& attr)
+ {
+ Iterator first = first_;
+ return qi::phrase_parse(first, last, expr, skipper, post_skip, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr, typename Skipper, typename Attr>
+ inline bool
+ phrase_parse(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , Attr& attr)
+ {
+ return qi::phrase_parse(first, last, expr, skipper, skip_flag::postskip, attr);
+ }
+
+ template <typename Iterator, typename Expr, typename Skipper, typename Attr>
+ inline bool
+ phrase_parse(
+ Iterator const& first_
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , Attr& attr)
+ {
+ Iterator first = first_;
+ return qi::phrase_parse(first, last, expr, skipper, skip_flag::postskip, attr);
+ }
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/qi/parse_attr.hpp b/boost/spirit/home/qi/parse_attr.hpp
new file mode 100644
index 0000000000..1933ffb09c
--- /dev/null
+++ b/boost/spirit/home/qi/parse_attr.hpp
@@ -0,0 +1,177 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2009 Carl Barron
+//
+// Distributed under the 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_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_PARSE_ATTR_APRIL_24_2009_1043AM)
+#define BOOST_SPIRIT_PARSE_ATTR_APRIL_24_2009_1043AM
+
+#include <boost/spirit/home/qi/parse.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 <boost/spirit/home/qi/parse_attr.hpp>
+#define BOOST_PP_ITERATION_LIMITS (2, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+#define BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE(z, n, A) BOOST_PP_CAT(A, n)&
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ parse(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ // Make sure the iterator is at least a forward_iterator. If you got an
+ // compilation error here, then you are using an input_iterator while
+ // calling this function, you need to supply at least a
+ // forward_iterator instead.
+ BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return compile<qi::domain>(expr).parse(first, last, unused, unused, attr);
+ }
+
+ template <typename Iterator, typename Expr
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ parse(
+ Iterator const& first_
+ , Iterator last
+ , Expr const& expr
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ Iterator first = first_;
+ return qi::parse(first, last, expr, BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr, typename Skipper
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ phrase_parse(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ // Make sure the iterator is at least a forward_iterator. If you got an
+ // compilation error here, then you are using an input_iterator while
+ // calling this function, you need to supply at least a
+ // forward_iterator instead.
+ BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+
+ typedef
+ typename result_of::compile<qi::domain, Skipper>::type
+ skipper_type;
+ skipper_type const skipper_ = compile<qi::domain>(skipper);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ if (!compile<qi::domain>(expr).parse(
+ first, last, unused, skipper_, attr))
+ return false;
+
+ if (post_skip == skip_flag::postskip)
+ qi::skip_over(first, last, skipper_);
+ return true;
+ }
+
+ template <typename Iterator, typename Expr, typename Skipper
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ phrase_parse(
+ Iterator const& first_
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ Iterator first = first_;
+ return qi::phrase_parse(first, last, expr, skipper, post_skip
+ , BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Expr, typename Skipper
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ phrase_parse(
+ Iterator& first
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ return qi::phrase_parse(first, last, expr, skipper, skip_flag::postskip
+ , BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+
+ template <typename Iterator, typename Expr, typename Skipper
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline bool
+ phrase_parse(
+ Iterator const& first_
+ , Iterator last
+ , Expr const& expr
+ , Skipper const& skipper
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ Iterator first = first_;
+ return qi::phrase_parse(first, last, expr, skipper, skip_flag::postskip
+ , BOOST_PP_ENUM_PARAMS(N, attr));
+ }
+}}}
+
+#undef BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE
+#undef N
+
+#endif
+
diff --git a/boost/spirit/home/qi/parser.hpp b/boost/spirit/home/qi/parser.hpp
new file mode 100644
index 0000000000..ffd8bc913f
--- /dev/null
+++ b/boost/spirit/home/qi/parser.hpp
@@ -0,0 +1,140 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_PARSER_OCTOBER_16_2008_0254PM)
+#define BOOST_SPIRIT_PARSER_OCTOBER_16_2008_0254PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+
+ //[parser_base_parser
+ template <typename Derived>
+ struct parser
+ {
+ struct parser_id;
+ typedef Derived derived_type;
+ typedef qi::domain domain;
+
+ // Requirement: p.parse(f, l, context, skip, attr) -> bool
+ //
+ // p: a parser
+ // f, l: first/last iterator pair
+ // context: enclosing rule context (can be unused_type)
+ // skip: skipper (can be unused_type)
+ // attr: attribute (can be unused_type)
+
+ // Requirement: p.what(context) -> info
+ //
+ // p: a parser
+ // context: enclosing rule context (can be unused_type)
+
+ // Requirement: P::template attribute<Ctx, Iter>::type
+ //
+ // P: a parser type
+ // Ctx: A context type (can be unused_type)
+ // Iter: An iterator type (can be unused_type)
+
+ Derived const& derived() const
+ {
+ return *static_cast<Derived const*>(this);
+ }
+ };
+ //]
+
+ template <typename Derived>
+ struct primitive_parser : parser<Derived>
+ {
+ struct primitive_parser_id;
+ };
+
+ template <typename Derived>
+ struct nary_parser : parser<Derived>
+ {
+ struct nary_parser_id;
+
+ // Requirement: p.elements -> fusion sequence
+ //
+ // p: a composite parser
+
+ // Requirement: P::elements_type -> fusion sequence
+ //
+ // P: a composite parser type
+ };
+
+ template <typename Derived>
+ struct unary_parser : parser<Derived>
+ {
+ struct unary_parser_id;
+
+ // Requirement: p.subject -> subject parser
+ //
+ // p: a unary parser
+
+ // Requirement: P::subject_type -> subject parser type
+ //
+ // P: a unary parser type
+ };
+
+ template <typename Derived>
+ struct binary_parser : parser<Derived>
+ {
+ struct binary_parser_id;
+
+ // Requirement: p.left -> left parser
+ //
+ // p: a binary parser
+
+ // Requirement: P::left_type -> left parser type
+ //
+ // P: a binary parser type
+
+ // Requirement: p.right -> right parser
+ //
+ // p: a binary parser
+
+ // Requirement: P::right_type -> right parser type
+ //
+ // P: a binary parser type
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits // classification
+{
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(parser_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(primitive_parser_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(nary_parser_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(unary_parser_id)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(binary_parser_id)
+ }
+
+ // parser type identification
+ template <typename T>
+ struct is_parser : detail::has_parser_id<T> {};
+
+ template <typename T>
+ struct is_primitive_parser : detail::has_primitive_parser_id<T> {};
+
+ template <typename T>
+ struct is_nary_parser : detail::has_nary_parser_id<T> {};
+
+ template <typename T>
+ struct is_unary_parser : detail::has_unary_parser_id<T> {};
+
+ template <typename T>
+ struct is_binary_parser : detail::has_binary_parser_id<T> {};
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/reference.hpp b/boost/spirit/home/qi/reference.hpp
new file mode 100644
index 0000000000..f6fcabcee1
--- /dev/null
+++ b/boost/spirit/home/qi/reference.hpp
@@ -0,0 +1,69 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_REFERENCE_OCTOBER_31_2008_1218AM)
+#define BOOST_SPIRIT_REFERENCE_OCTOBER_31_2008_1218AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/ref.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // reference is a parser that references another parser (its Subject)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct reference : parser<reference<Subject> >
+ {
+ typedef Subject subject_type;
+
+ reference(Subject& subject)
+ : ref(subject) {}
+
+ template <typename Context, typename Iterator>
+ struct attribute : Subject::template attribute<Context, Iterator> {};
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ return ref.get().parse(first, last, context, skipper, attr);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ // the reference is transparent (does not add any info)
+ return ref.get().what(context);
+ }
+
+ boost::reference_wrapper<Subject> ref;
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<qi::reference<Subject>, Attribute, Context
+ , Iterator>
+ : handles_container<typename remove_const<Subject>::type
+ , Attribute, Context, Iterator>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/skip_flag.hpp b/boost/spirit/home/qi/skip_flag.hpp
new file mode 100644
index 0000000000..28fd856e05
--- /dev/null
+++ b/boost/spirit/home/qi/skip_flag.hpp
@@ -0,0 +1,29 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_SKIP_FLAG_DEC_02_2009_0412PM)
+#define BOOST_SPIRIT_SKIP_FLAG_DEC_02_2009_0412PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/detail/scoped_enum_emulation.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_SCOPED_ENUM_START(skip_flag)
+ {
+ postskip, // force post-skipping in phrase_parse()
+ dont_postskip // inhibit post-skipping in phrase_parse()
+ };
+ BOOST_SCOPED_ENUM_END
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/qi/skip_over.hpp b/boost/spirit/home/qi/skip_over.hpp
new file mode 100644
index 0000000000..f46b304404
--- /dev/null
+++ b/boost/spirit/home/qi/skip_over.hpp
@@ -0,0 +1,44 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_SKIP_APRIL_16_2006_0625PM)
+#define BOOST_SPIRIT_SKIP_APRIL_16_2006_0625PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/detail/unused_skipper.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Move the /first/ iterator to the first non-matching position
+ // given a skip-parser. The function is a no-op if unused_type is
+ // passed as the skip-parser.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename T>
+ inline void skip_over(Iterator& first, Iterator const& last, T const& skipper)
+ {
+ while (first != last && skipper.parse(first, last, unused, unused, unused))
+ /***/;
+ }
+
+ template <typename Iterator>
+ inline void skip_over(Iterator&, Iterator const&, unused_type)
+ {
+ }
+
+ template <typename Iterator, typename Skipper>
+ inline void skip_over(Iterator&, Iterator const&
+ , detail::unused_skipper<Skipper> const&)
+ {
+ }
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/stream.hpp b/boost/spirit/home/qi/stream.hpp
new file mode 100644
index 0000000000..59bc7d4ed4
--- /dev/null
+++ b/boost/spirit/home/qi/stream.hpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_STREAM_MAY_05_2007_1227PM)
+#define BOOST_SPIRIT_STREAM_MAY_05_2007_1227PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/stream/stream.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/stream/detail/iterator_source.hpp b/boost/spirit/home/qi/stream/detail/iterator_source.hpp
new file mode 100644
index 0000000000..8a48eda76d
--- /dev/null
+++ b/boost/spirit/home/qi/stream/detail/iterator_source.hpp
@@ -0,0 +1,80 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_ITERATOR_ISTREAM_MAY_05_2007_0110PM)
+#define BOOST_SPIRIT_ITERATOR_ISTREAM_MAY_05_2007_0110PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/iostreams/stream.hpp>
+#include <boost/detail/iterator.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator>
+ struct iterator_source
+ {
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ char_type;
+ typedef boost::iostreams::seekable_device_tag category;
+
+ iterator_source (Iterator const& first_, Iterator const& last_)
+ : first(first_), last(last_), pos(0)
+ {}
+
+ // Read up to n characters from the input sequence into the buffer s,
+ // returning the number of characters read, or -1 to indicate
+ // end-of-sequence.
+ std::streamsize read (char_type* s, std::streamsize n)
+ {
+ if (first == last)
+ return -1;
+
+ std::streamsize bytes_read = 0;
+ while (n--) {
+ *s = *first;
+ ++s; ++bytes_read;
+ if (++first == last)
+ break;
+ }
+
+ pos += bytes_read;
+ return bytes_read;
+ }
+
+ // Write is implemented only to satisfy the requirements of a
+ // boost::iostreams::seekable_device. We need to have see support to
+ // be able to figure out how many characters have been actually
+ // consumed by the stream.
+ std::streamsize write(const char*, std::streamsize)
+ {
+ BOOST_ASSERT(false); // not supported
+ return -1;
+ }
+
+ std::streampos seek(boost::iostreams::stream_offset, std::ios_base::seekdir way)
+ {
+ BOOST_ASSERT(way == std::ios_base::cur); // only support queries
+ return pos; // return current position
+ }
+
+ Iterator first;
+ Iterator const& last;
+ std::streamsize pos;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ iterator_source& operator= (iterator_source const&);
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/stream/detail/match_manip.hpp b/boost/spirit/home/qi/stream/detail/match_manip.hpp
new file mode 100644
index 0000000000..e74bdcfc91
--- /dev/null
+++ b/boost/spirit/home/qi/stream/detail/match_manip.hpp
@@ -0,0 +1,230 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_MATCH_MANIP_MAY_05_2007_1203PM)
+#define BOOST_SPIRIT_MATCH_MANIP_MAY_05_2007_1203PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/parse.hpp>
+#include <boost/spirit/home/support/iterators/istream_iterator.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/mpl/bool.hpp>
+
+#include <iterator>
+#include <string>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr
+ , typename CopyExpr = mpl::false_, typename CopyAttr = mpl::false_
+ , typename Skipper = unused_type, typename Attribute = unused_type const>
+ struct match_manip
+ {
+ // This assertion makes sure we don't hit the only code path which is
+ // not implemented (because it isn't needed), where both, the
+ // expression and the attribute need to be held as a copy.
+ BOOST_SPIRIT_ASSERT_MSG(!CopyExpr::value || !CopyAttr::value
+ , error_invalid_should_not_happen, ());
+
+ match_manip(Expr const& xpr, Skipper const& s, Attribute& a)
+ : expr(xpr), skipper(s), attr(a), post_skip(skip_flag::postskip) {}
+
+ match_manip(Expr const& xpr, Skipper const& s
+ , BOOST_SCOPED_ENUM(skip_flag) ps, Attribute& a)
+ : expr(xpr), skipper(s), attr(a), post_skip(ps) {}
+
+ Expr const& expr;
+ Skipper const& skipper;
+ Attribute& attr;
+ BOOST_SCOPED_ENUM(skip_flag) const post_skip;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ match_manip& operator= (match_manip const&);
+ };
+
+ template <typename Expr, typename Skipper, typename Attribute>
+ struct match_manip<Expr, mpl::false_, mpl::true_, Skipper, Attribute>
+ {
+ match_manip(Expr const& xpr, Skipper const& s, Attribute& a)
+ : expr(xpr), skipper(s), attr(a), post_skip(skip_flag::postskip) {}
+
+ match_manip(Expr const& xpr, Skipper const& s
+ , BOOST_SCOPED_ENUM(skip_flag) ps, Attribute& a)
+ : expr(xpr), skipper(s), attr(a), post_skip(ps) {}
+
+ Expr const& expr;
+ Skipper const& skipper;
+ Attribute attr;
+ BOOST_SCOPED_ENUM(skip_flag) const post_skip;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ match_manip& operator= (match_manip const&);
+ };
+
+ template <typename Expr, typename Skipper, typename Attribute>
+ struct match_manip<Expr, mpl::true_, mpl::false_, Skipper, Attribute>
+ {
+ match_manip(Expr const& xpr, Skipper const& s, Attribute& a)
+ : expr(xpr), skipper(s), attr(a), post_skip(skip_flag::postskip) {}
+
+ match_manip(Expr const& xpr, Skipper const& s
+ , BOOST_SCOPED_ENUM(skip_flag) ps, Attribute& a)
+ : expr(xpr), skipper(s), attr(a), post_skip(ps) {}
+
+ Expr expr;
+ Skipper const& skipper;
+ Attribute& attr;
+ BOOST_SCOPED_ENUM(skip_flag) const post_skip;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ match_manip& operator= (match_manip const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Enable = void>
+ struct match
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ // Did you intend to use the auto_ facilities while forgetting to
+ // #include <boost/spirit/include/qi_match_auto.hpp>?
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ };
+
+ template <typename Expr>
+ struct match<Expr
+ , typename enable_if<traits::matches<qi::domain, Expr> >::type>
+ {
+ typedef match_manip<Expr> type;
+
+ static type call(Expr const& expr)
+ {
+ return type(expr, unused, unused);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Skipper, typename Enable = void>
+ struct phrase_match
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ // Did you intend to use the auto_ facilities while forgetting to
+ // #include <boost/spirit/include/qi_match_auto.hpp>?
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ };
+
+ template <typename Expr, typename Skipper>
+ struct phrase_match<Expr, Skipper
+ , typename enable_if<traits::matches<qi::domain, Expr> >::type>
+ {
+ typedef match_manip<Expr, mpl::false_, mpl::false_, Skipper> type;
+
+ static type call(
+ Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the delimiter is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+ return type(expr, skipper, post_skip, unused);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Expr
+ , typename CopyExpr, typename CopyAttr>
+ inline std::basic_istream<Char, Traits> &
+ operator>>(std::basic_istream<Char, Traits> &is,
+ match_manip<Expr, CopyExpr, CopyAttr> const& fm)
+ {
+ typedef spirit::basic_istream_iterator<Char, Traits> input_iterator;
+
+ input_iterator f(is);
+ input_iterator l;
+ if (!qi::parse(f, l, fm.expr))
+ {
+ is.setstate(std::ios_base::failbit);
+ }
+ return is;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Expr
+ , typename CopyExpr, typename CopyAttr
+ , typename Attribute>
+ inline std::basic_istream<Char, Traits> &
+ operator>>(std::basic_istream<Char, Traits> &is,
+ match_manip<Expr, CopyExpr, CopyAttr, unused_type, Attribute> const& fm)
+ {
+ typedef spirit::basic_istream_iterator<Char, Traits> input_iterator;
+
+ input_iterator f(is);
+ input_iterator l;
+ if (!qi::parse(f, l, fm.expr, fm.attr))
+ {
+ is.setstate(std::ios_base::failbit);
+ }
+ return is;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Expr
+ , typename CopyExpr, typename CopyAttr
+ , typename Skipper>
+ inline std::basic_istream<Char, Traits> &
+ operator>>(std::basic_istream<Char, Traits> &is,
+ match_manip<Expr, CopyExpr, CopyAttr, Skipper> const& fm)
+ {
+ typedef spirit::basic_istream_iterator<Char, Traits> input_iterator;
+
+ input_iterator f(is);
+ input_iterator l;
+ if (!qi::phrase_parse(
+ f, l, fm.expr, fm.skipper, fm.post_skip))
+ {
+ is.setstate(std::ios_base::failbit);
+ }
+ return is;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Expr
+ , typename CopyExpr, typename CopyAttr
+ , typename Attribute, typename Skipper
+ >
+ inline std::basic_istream<Char, Traits> &
+ operator>>(
+ std::basic_istream<Char, Traits> &is,
+ match_manip<Expr, CopyExpr, CopyAttr, Attribute, Skipper> const& fm)
+ {
+ typedef spirit::basic_istream_iterator<Char, Traits> input_iterator;
+
+ input_iterator f(is);
+ input_iterator l;
+ if (!qi::phrase_parse(
+ f, l, fm.expr, fm.skipper, fm.post_skip, fm.attr))
+ {
+ is.setstate(std::ios_base::failbit);
+ }
+ return is;
+ }
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/stream/detail/match_manip_auto.hpp b/boost/spirit/home/qi/stream/detail/match_manip_auto.hpp
new file mode 100644
index 0000000000..f50eda8a17
--- /dev/null
+++ b/boost/spirit/home/qi/stream/detail/match_manip_auto.hpp
@@ -0,0 +1,63 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_MATCH_MANIP_AUTO_DEC_02_2009_0813PM)
+#define BOOST_SPIRIT_MATCH_MANIP_AUTO_DEC_02_2009_0813PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/stream/detail/match_manip.hpp>
+#include <boost/spirit/home/qi/auto/create_parser.hpp>
+#include <boost/utility/enable_if.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ struct match<Expr
+ , typename enable_if<traits::meta_create_exists<qi::domain, Expr> >::type>
+ {
+ typedef typename result_of::create_parser<Expr>::type expr_type;
+ typedef match_manip<
+ expr_type, mpl::true_, mpl::false_, unused_type, Expr
+ > type;
+
+ static type call(Expr const& expr)
+ {
+ return type(create_parser<Expr>(), unused, const_cast<Expr&>(expr));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Skipper>
+ struct phrase_match<Expr, Skipper
+ , typename enable_if<traits::meta_create_exists<qi::domain, Expr> >::type>
+ {
+ typedef typename result_of::create_parser<Expr>::type expr_type;
+ typedef match_manip<
+ expr_type, mpl::true_, mpl::false_, Skipper, Expr
+ > type;
+
+ static type call(
+ Expr const& expr
+ , Skipper const& skipper
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the delimiter is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+ return type(create_parser<Expr>(), skipper, post_skip
+ , const_cast<Expr&>(expr));
+ }
+ };
+
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/stream/match_manip.hpp b/boost/spirit/home/qi/stream/match_manip.hpp
new file mode 100644
index 0000000000..83c70703de
--- /dev/null
+++ b/boost/spirit/home/qi/stream/match_manip.hpp
@@ -0,0 +1,123 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_MATCH_MANIP_MAY_05_2007_1202PM)
+#define BOOST_SPIRIT_MATCH_MANIP_MAY_05_2007_1202PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/parse.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/stream/detail/match_manip.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr>
+ inline typename detail::match<Expr>::type
+ match(
+ Expr const& expr)
+ {
+ return detail::match<Expr>::call(expr);
+ }
+
+ template <typename Expr, typename Attribute>
+ inline detail::match_manip<
+ Expr, mpl::false_, mpl::false_, unused_type, Attribute
+ >
+ match(
+ Expr const& xpr
+ , Attribute& p)
+ {
+ using qi::detail::match_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ return match_manip<Expr, mpl::false_, mpl::false_, unused_type, Attribute>(
+ xpr, unused, p);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Skipper>
+ inline typename detail::phrase_match<Expr, Skipper>::type
+ phrase_match(
+ Expr const& expr
+ , Skipper const& s
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip)
+ {
+ return detail::phrase_match<Expr, Skipper>::call(expr, s, post_skip);
+ }
+
+ template <typename Expr, typename Skipper, typename Attribute>
+ inline detail::match_manip<
+ Expr, mpl::false_, mpl::false_, Skipper, Attribute
+ >
+ phrase_match(
+ Expr const& xpr
+ , Skipper const& s
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip
+ , Attribute& p)
+ {
+ using qi::detail::match_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+ return match_manip<Expr, mpl::false_, mpl::false_, Skipper, Attribute>(
+ xpr, s, post_skip, p);
+ }
+
+ template <typename Expr, typename Skipper, typename Attribute>
+ inline detail::match_manip<
+ Expr, mpl::false_, mpl::false_, Skipper, Attribute
+ >
+ phrase_match(
+ Expr const& xpr
+ , Skipper const& s
+ , Attribute& p)
+ {
+ using qi::detail::match_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+ return match_manip<Expr, mpl::false_, mpl::false_, Skipper, Attribute>(
+ xpr, s, p);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename Char, typename Traits, typename Derived>
+ inline std::basic_istream<Char, Traits>&
+ operator>>(std::basic_istream<Char, Traits>& is, parser<Derived> const& p)
+ {
+ typedef spirit::basic_istream_iterator<Char, Traits> input_iterator;
+
+ input_iterator f(is);
+ input_iterator l;
+ if (!p.derived().parse(f, l, unused, unused, unused))
+ {
+ is.setstate(std::ios_base::failbit);
+ }
+ return is;
+ }
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/qi/stream/match_manip_attr.hpp b/boost/spirit/home/qi/stream/match_manip_attr.hpp
new file mode 100644
index 0000000000..4f5cd0f373
--- /dev/null
+++ b/boost/spirit/home/qi/stream/match_manip_attr.hpp
@@ -0,0 +1,133 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_MATCH_MANIP_ATTR_MAY_05_2007_1202PM)
+#define BOOST_SPIRIT_MATCH_MANIP_ATTR_MAY_05_2007_1202PM
+
+#include <boost/spirit/home/qi/stream/match_manip.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 \
+ <boost/spirit/home/qi/stream/match_manip_attr.hpp>
+#define BOOST_PP_ITERATION_LIMITS (2, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+#define BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE(z, n, A) BOOST_PP_CAT(A, n) &
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline detail::match_manip<Expr, mpl::false_, mpl::true_, unused_type
+ , fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > >
+ match(
+ Expr const& xpr
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ using qi::detail::match_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return match_manip<Expr, mpl::false_, mpl::true_, unused_type, vector_type>(
+ xpr, unused, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Expr, typename Skipper
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline detail::match_manip<Expr, mpl::false_, mpl::true_, Skipper
+ , fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > >
+ phrase_match(
+ Expr const& xpr
+ , Skipper const& s
+ , BOOST_SCOPED_ENUM(skip_flag) post_skip
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ using qi::detail::match_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return match_manip<Expr, mpl::false_, mpl::true_, Skipper, vector_type>(
+ xpr, s, post_skip, attr);
+ }
+
+ template <typename Expr, typename Skipper
+ , BOOST_PP_ENUM_PARAMS(N, typename A)>
+ inline detail::match_manip<Expr, mpl::false_, mpl::true_, Skipper
+ , fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > >
+ phrase_match(
+ Expr const& xpr
+ , Skipper const& s
+ , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
+ {
+ using qi::detail::match_manip;
+
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then either the expression (expr) or skipper is not a valid
+ // spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
+
+ typedef fusion::vector<
+ BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
+ > vector_type;
+
+ vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
+ return match_manip<Expr, mpl::false_, mpl::true_, Skipper, vector_type>(
+ xpr, s, attr);
+ }
+
+}}}
+
+#undef BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE
+#undef N
+
+#endif
+
diff --git a/boost/spirit/home/qi/stream/stream.hpp b/boost/spirit/home/qi/stream/stream.hpp
new file mode 100644
index 0000000000..952f2f976d
--- /dev/null
+++ b/boost/spirit/home/qi/stream/stream.hpp
@@ -0,0 +1,113 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_STREAM_MAY_05_2007_1228PM)
+#define BOOST_SPIRIT_STREAM_MAY_05_2007_1228PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/detail/string_parse.hpp>
+#include <boost/spirit/home/qi/stream/detail/match_manip.hpp>
+#include <boost/spirit/home/qi/stream/detail/iterator_source.hpp>
+#include <boost/spirit/home/support/detail/hold_any.hpp>
+
+#include <iosfwd>
+#include <sstream>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_terminal<qi::domain, tag::stream> // enables stream
+ : mpl::true_ {};
+
+ template <>
+ struct use_terminal<qi::domain, tag::wstream> // enables wstream
+ : mpl::true_ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::stream;
+ using spirit::wstream;
+#endif
+ using spirit::stream_type;
+ using spirit::wstream_type;
+
+ template <typename Char = char, typename T = spirit::basic_hold_any<char> >
+ struct stream_parser
+ : primitive_parser<stream_parser<Char, T> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef T type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef qi::detail::iterator_source<Iterator> source_device;
+ typedef boost::iostreams::stream<source_device> instream;
+
+ qi::skip_over(first, last, skipper);
+
+ instream in(first, last); // copies 'first'
+ in >> attr; // use existing operator>>()
+
+ // advance the iterator if everything is ok
+ if (in.good()) {
+ std::streamsize pos = in.tellg();
+ std::advance(first, pos);
+ }
+
+ return in.good() || in.eof();
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("stream");
+ }
+ };
+
+ template <typename T, typename Char = char>
+ struct typed_stream
+ : proto::terminal<stream_parser<Char, T> >::type
+ {
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ struct make_stream
+ {
+ typedef stream_parser<Char> result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+ template <typename Modifiers>
+ struct make_primitive<tag::stream, Modifiers> : make_stream<char> {};
+
+ template <typename Modifiers>
+ struct make_primitive<tag::wstream, Modifiers> : make_stream<wchar_t> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/string.hpp b/boost/spirit/home/qi/string.hpp
new file mode 100644
index 0000000000..70de51bdc5
--- /dev/null
+++ b/boost/spirit/home/qi/string.hpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_STRING_FEBRUARY_03_2007_0355PM)
+#define BOOST_SPIRIT_STRING_FEBRUARY_03_2007_0355PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/string/lit.hpp>
+#include <boost/spirit/home/qi/string/symbols.hpp>
+
+#endif
diff --git a/boost/spirit/home/qi/string/detail/tst.hpp b/boost/spirit/home/qi/string/detail/tst.hpp
new file mode 100644
index 0000000000..989477d27b
--- /dev/null
+++ b/boost/spirit/home/qi/string/detail/tst.hpp
@@ -0,0 +1,213 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_TST_MARCH_09_2007_0905AM)
+#define BOOST_SPIRIT_TST_MARCH_09_2007_0905AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/call_traits.hpp>
+#include <boost/detail/iterator.hpp>
+#include <boost/foreach.hpp>
+#include <boost/assert.hpp>
+
+namespace boost { namespace spirit { namespace qi { namespace detail
+{
+ // This file contains low level TST routines, not for
+ // public consumption.
+
+ template <typename Char, typename T>
+ struct tst_node
+ {
+ tst_node(Char id)
+ : id(id), data(0), lt(0), eq(0), gt(0)
+ {
+ }
+
+ template <typename Alloc>
+ static void
+ destruct_node(tst_node* p, Alloc* alloc)
+ {
+ if (p)
+ {
+ if (p->data)
+ alloc->delete_data(p->data);
+ destruct_node(p->lt, alloc);
+ destruct_node(p->eq, alloc);
+ destruct_node(p->gt, alloc);
+ alloc->delete_node(p);
+ }
+ }
+
+ template <typename Alloc>
+ static tst_node*
+ clone_node(tst_node* p, Alloc* alloc)
+ {
+ if (p)
+ {
+ tst_node* clone = alloc->new_node(p->id);
+ if (p->data)
+ clone->data = alloc->new_data(*p->data);
+ clone->lt = clone_node(p->lt, alloc);
+ clone->eq = clone_node(p->eq, alloc);
+ clone->gt = clone_node(p->gt, alloc);
+ return clone;
+ }
+ return 0;
+ }
+
+ template <typename Iterator, typename Filter>
+ static T*
+ find(tst_node* start, Iterator& first, Iterator last, Filter filter)
+ {
+ if (first == last)
+ return 0;
+
+ Iterator i = first;
+ Iterator latest = first;
+ tst_node* p = start;
+ T* found = 0;
+
+ while (p && i != last)
+ {
+ typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ c = filter(*i); // filter only the input
+
+ if (c == p->id)
+ {
+ if (p->data)
+ {
+ found = p->data;
+ latest = i;
+ }
+ p = p->eq;
+ i++;
+ }
+ else if (c < p->id)
+ {
+ p = p->lt;
+ }
+ else
+ {
+ p = p->gt;
+ }
+ }
+
+ if (found)
+ first = ++latest; // one past the last matching char
+ return found;
+ }
+
+ template <typename Iterator, typename Alloc>
+ static T*
+ add(
+ tst_node*& start
+ , Iterator first
+ , Iterator last
+ , typename boost::call_traits<T>::param_type val
+ , Alloc* alloc)
+ {
+ if (first == last)
+ return 0;
+
+ tst_node** pp = &start;
+ for(;;)
+ {
+ typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ c = *first;
+
+ if (*pp == 0)
+ *pp = alloc->new_node(c);
+ tst_node* p = *pp;
+
+ if (c == p->id)
+ {
+ if (++first == last)
+ {
+ if (p->data == 0)
+ p->data = alloc->new_data(val);
+ return p->data;
+ }
+ pp = &p->eq;
+ }
+ else if (c < p->id)
+ {
+ pp = &p->lt;
+ }
+ else
+ {
+ pp = &p->gt;
+ }
+ }
+ }
+
+ template <typename Iterator, typename Alloc>
+ static void
+ remove(tst_node*& p, Iterator first, Iterator last, Alloc* alloc)
+ {
+ if (p == 0 || first == last)
+ return;
+
+ typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ c = *first;
+
+ if (c == p->id)
+ {
+ if (++first == last)
+ {
+ if (p->data)
+ {
+ alloc->delete_data(p->data);
+ p->data = 0;
+ }
+ }
+ remove(p->eq, first, last, alloc);
+ }
+ else if (c < p->id)
+ {
+ remove(p->lt, first, last, alloc);
+ }
+ else
+ {
+ remove(p->gt, first, last, alloc);
+ }
+
+ if (p->data == 0 && p->lt == 0 && p->eq == 0 && p->gt == 0)
+ {
+ alloc->delete_node(p);
+ p = 0;
+ }
+ }
+
+ template <typename F>
+ static void
+ for_each(tst_node* p, std::basic_string<Char> prefix, F f)
+ {
+ if (p)
+ {
+ for_each(p->lt, prefix, f);
+ std::basic_string<Char> s = prefix + p->id;
+ for_each(p->eq, s, f);
+ if (p->data)
+ f(s, *p->data);
+ for_each(p->gt, prefix, f);
+ }
+ }
+
+ Char id; // the node's identity character
+ T* data; // optional data
+ tst_node* lt; // left pointer
+ tst_node* eq; // middle pointer
+ tst_node* gt; // right pointer
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/qi/string/lit.hpp b/boost/spirit/home/qi/string/lit.hpp
new file mode 100644
index 0000000000..1b966c32b5
--- /dev/null
+++ b/boost/spirit/home/qi/string/lit.hpp
@@ -0,0 +1,312 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ 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)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_LIT_APR_18_2006_1125PM)
+#define BOOST_SPIRIT_LIT_APR_18_2006_1125PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/detail/string_parse.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/qi/detail/enable_lit.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/modify.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/value_at.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <string>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct use_terminal<qi::domain, T
+ , typename enable_if<traits::is_string<T> >::type> // enables strings
+ : mpl::true_ {};
+
+ template <typename CharEncoding, typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<
+ tag::char_code<tag::string, CharEncoding> // enables string(str)
+ , fusion::vector1<A0> >
+ > : traits::is_string<A0> {};
+
+ template <typename CharEncoding> // enables string(f)
+ struct use_lazy_terminal<
+ qi::domain
+ , tag::char_code<tag::string, CharEncoding>
+ , 1 /*arity*/
+ > : mpl::true_ {};
+
+ // enables lit(...)
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::lit, fusion::vector1<A0> >
+ , typename enable_if<traits::is_string<A0> >::type>
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::lit;
+#endif
+ using spirit::lit_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parse for literal strings
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename String, bool no_attribute>
+ struct literal_string
+ : primitive_parser<literal_string<String, no_attribute> >
+ {
+ typedef typename
+ remove_const<typename traits::char_type_of<String>::type>::type
+ char_type;
+ typedef std::basic_string<char_type> string_type;
+
+ literal_string(typename add_reference<String>::type str)
+ : str(str)
+ {}
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename mpl::if_c<
+ no_attribute, unused_type, string_type>::type
+ type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper, Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper);
+ return detail::string_parse(str, first, last, attr);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("literal-string", str);
+ }
+
+ String str;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ literal_string& operator= (literal_string const&);
+ };
+
+ template <typename String, bool no_attribute>
+ struct no_case_literal_string
+ : primitive_parser<no_case_literal_string<String, no_attribute> >
+ {
+ typedef typename
+ remove_const<typename traits::char_type_of<String>::type>::type
+ char_type;
+ typedef std::basic_string<char_type> string_type;
+
+ template <typename CharEncoding>
+ no_case_literal_string(char_type const* in, CharEncoding encoding)
+ : str_lo(in)
+ , str_hi(in)
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ encoding; // suppresses warning: C4100: 'encoding' : unreferenced formal parameter
+#endif
+ typename string_type::iterator loi = str_lo.begin();
+ typename string_type::iterator hii = str_hi.begin();
+
+ for (; loi != str_lo.end(); ++loi, ++hii, ++in)
+ {
+ typedef typename CharEncoding::char_type encoded_char_type;
+
+ *loi = static_cast<char_type>(encoding.tolower(encoded_char_type(*loi)));
+ *hii = static_cast<char_type>(encoding.toupper(encoded_char_type(*hii)));
+ }
+ }
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename mpl::if_c<
+ no_attribute, unused_type, string_type>::type
+ type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper, Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper);
+ return detail::string_parse(str_lo, str_hi, first, last, attr);
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("no-case-literal-string", str_lo);
+ }
+
+ string_type str_lo, str_hi;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Modifiers>
+ struct make_primitive<T, Modifiers
+ , typename enable_if<traits::is_string<T> >::type>
+ {
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
+
+ typedef typename add_const<T>::type const_string;
+ typedef typename mpl::if_<
+ no_case
+ , no_case_literal_string<const_string, true>
+ , literal_string<const_string, true> >::type
+ result_type;
+
+ result_type operator()(
+ typename add_reference<const_string>::type str, unused_type) const
+ {
+ return op(str, no_case());
+ }
+
+ template <typename String>
+ result_type op(String const& str, mpl::false_) const
+ {
+ return result_type(str);
+ }
+
+ template <typename String>
+ result_type op(String const& str, mpl::true_) const
+ {
+ typename spirit::detail::get_encoding<Modifiers,
+ spirit::char_encoding::standard>::type encoding;
+ return result_type(traits::get_c_string(str), encoding);
+ }
+ };
+
+ // lit("...")
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<tag::lit, fusion::vector1<A0> >
+ , Modifiers
+ , typename enable_if<traits::is_string<A0> >::type>
+ {
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
+
+ typedef typename add_const<A0>::type const_string;
+ typedef typename mpl::if_<
+ no_case
+ , no_case_literal_string<const_string, true>
+ , literal_string<const_string, true> >::type
+ result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return op(fusion::at_c<0>(term.args), no_case());
+ }
+
+ template <typename String>
+ result_type op(String const& str, mpl::false_) const
+ {
+ return result_type(str);
+ }
+
+ template <typename String>
+ result_type op(String const& str, mpl::true_) const
+ {
+ typedef typename traits::char_encoding_from_char<
+ typename traits::char_type_of<A0>::type>::type encoding_type;
+ typename spirit::detail::get_encoding<Modifiers,
+ encoding_type>::type encoding;
+ return result_type(traits::get_c_string(str), encoding);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // string("...")
+ template <typename CharEncoding, typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<
+ tag::char_code<tag::string, CharEncoding>
+ , fusion::vector1<A0> >
+ , Modifiers>
+ {
+ typedef CharEncoding encoding;
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
+
+ typedef typename add_const<A0>::type const_string;
+ typedef typename mpl::if_<
+ no_case
+ , no_case_literal_string<const_string, false>
+ , literal_string<const_string, false> >::type
+ result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return op(fusion::at_c<0>(term.args), no_case());
+ }
+
+ template <typename String>
+ result_type op(String const& str, mpl::false_) const
+ {
+ return result_type(str);
+ }
+
+ template <typename String>
+ result_type op(String const& str, mpl::true_) const
+ {
+ return result_type(traits::get_c_string(str), encoding());
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename String, bool no_attribute, typename Attribute
+ ,typename Context, typename Iterator>
+ struct handles_container<qi::literal_string<String, no_attribute>
+ , Attribute, Context, Iterator>
+ : mpl::true_ {};
+
+ template <typename String, bool no_attribute, typename Attribute
+ , typename Context, typename Iterator>
+ struct handles_container<qi::no_case_literal_string<String, no_attribute>
+ , Attribute, Context, Iterator>
+ : mpl::true_ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/string/symbols.hpp b/boost/spirit/home/qi/string/symbols.hpp
new file mode 100644
index 0000000000..a9656f1827
--- /dev/null
+++ b/boost/spirit/home/qi/string/symbols.hpp
@@ -0,0 +1,431 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_SYMBOLS_MARCH_11_2007_1055AM)
+#define BOOST_SPIRIT_SYMBOLS_MARCH_11_2007_1055AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/string/tst.hpp>
+#include <boost/spirit/home/qi/reference.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/support/modify.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+
+#include <boost/fusion/include/at.hpp>
+#include <boost/range.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/shared_ptr.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning
+#endif
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <
+ typename Char = char
+ , typename T = unused_type
+ , typename Lookup = tst<Char, T>
+ , typename Filter = tst_pass_through>
+ struct symbols
+ : proto::extends<
+ typename proto::terminal<
+ reference<symbols<Char, T, Lookup, Filter> >
+ >::type
+ , symbols<Char, T, Lookup, Filter>
+ >
+ , primitive_parser<symbols<Char, T, Lookup, Filter> >
+ {
+ typedef Char char_type; // the character type
+ typedef T value_type; // the value associated with each entry
+ typedef symbols<Char, T, Lookup, Filter> this_type;
+ typedef reference<this_type> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, this_type> base_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef value_type type;
+ };
+
+ symbols(std::string const& name = "symbols")
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(new Lookup())
+ , name_(name)
+ {
+ }
+
+ symbols(symbols const& syms)
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(syms.lookup)
+ , name_(syms.name_)
+ {
+ }
+
+ template <typename Filter_>
+ symbols(symbols<Char, T, Lookup, Filter_> const& syms)
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(syms.lookup)
+ , name_(syms.name_)
+ {
+ }
+
+ template <typename Symbols>
+ symbols(Symbols const& syms, std::string const& name = "symbols")
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(new Lookup())
+ , name_(name)
+ {
+ typename range_const_iterator<Symbols>::type si = boost::begin(syms);
+ while (si != boost::end(syms))
+ add(*si++);
+ }
+
+ template <typename Symbols, typename Data>
+ symbols(Symbols const& syms, Data const& data
+ , std::string const& name = "symbols")
+ : base_type(terminal::make(reference_(*this)))
+ , add(*this)
+ , remove(*this)
+ , lookup(new Lookup())
+ , name_(name)
+ {
+ typename range_const_iterator<Symbols>::type si = boost::begin(syms);
+ typename range_const_iterator<Data>::type di = boost::begin(data);
+ while (si != boost::end(syms))
+ add(*si++, *di++);
+ }
+
+ symbols&
+ operator=(symbols const& rhs)
+ {
+ name_ = rhs.name_;
+ *lookup = *rhs.lookup;
+ return *this;
+ }
+
+ template <typename Filter_>
+ symbols&
+ operator=(symbols<Char, T, Lookup, Filter_> const& rhs)
+ {
+ name_ = rhs.name_;
+ *lookup = *rhs.lookup;
+ return *this;
+ }
+
+ void clear()
+ {
+ lookup->clear();
+ }
+
+ struct adder;
+ struct remover;
+
+ template <typename Str>
+ adder const&
+ operator=(Str const& str)
+ {
+ lookup->clear();
+ return add(str);
+ }
+
+ template <typename Str>
+ friend adder const&
+ operator+=(symbols& sym, Str const& str)
+ {
+ return sym.add(str);
+ }
+
+ template <typename Str>
+ friend remover const&
+ operator-=(symbols& sym, Str const& str)
+ {
+ return sym.remove(str);
+ }
+
+#if defined(BOOST_NO_RVALUE_REFERENCES)
+ // non-const version needed to suppress proto's += kicking in
+ template <typename Str>
+ friend adder const&
+ operator+=(symbols& sym, Str& str)
+ {
+ return sym.add(str);
+ }
+
+ // non-const version needed to suppress proto's -= kicking in
+ template <typename Str>
+ friend remover const&
+ operator-=(symbols& sym, Str& str)
+ {
+ return sym.remove(str);
+ }
+#else
+ // for rvalue references
+ template <typename Str>
+ friend adder const&
+ operator+=(symbols& sym, Str&& str)
+ {
+ return sym.add(str);
+ }
+
+ // for rvalue references
+ template <typename Str>
+ friend remover const&
+ operator-=(symbols& sym, Str&& str)
+ {
+ return sym.remove(str);
+ }
+#endif
+ template <typename F>
+ void for_each(F f) const
+ {
+ lookup->for_each(f);
+ }
+
+ template <typename Str>
+ value_type& at(Str const& str)
+ {
+ return *lookup->add(traits::get_begin<Char>(str)
+ , traits::get_end<Char>(str), T());
+ }
+
+ template <typename Iterator>
+ value_type* prefix_find(Iterator& first, Iterator const& last)
+ {
+ return lookup->find(first, last, Filter());
+ }
+
+ template <typename Iterator>
+ value_type const* prefix_find(Iterator& first, Iterator const& last) const
+ {
+ return lookup->find(first, last, Filter());
+ }
+
+ template <typename Str>
+ value_type* find(Str const& str)
+ {
+ return find_impl(traits::get_begin<Char>(str)
+ , traits::get_end<Char>(str));
+ }
+
+ template <typename Str>
+ value_type const* find(Str const& str) const
+ {
+ return find_impl(traits::get_begin<Char>(str)
+ , traits::get_end<Char>(str));
+ }
+
+private:
+ template <typename Iterator>
+ value_type* find_impl(Iterator begin, Iterator end)
+ {
+ value_type* r = lookup->find(begin, end, Filter());
+ return begin == end ? r : 0;
+ }
+
+ template <typename Iterator>
+ value_type const* find_impl(Iterator begin, Iterator end) const
+ {
+ value_type const* r = lookup->find(begin, end, Filter());
+ return begin == end ? r : 0;
+ }
+
+public:
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper, Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper);
+
+ if (value_type* val_ptr
+ = lookup->find(first, last, Filter()))
+ {
+ spirit::traits::assign_to(*val_ptr, attr);
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info(name_);
+ }
+
+ void name(std::string const &str)
+ {
+ name_ = str;
+ }
+ std::string const &name() const
+ {
+ return name_;
+ }
+
+ struct adder
+ {
+ template <typename, typename = unused_type, typename = unused_type>
+ struct result { typedef adder const& type; };
+
+ adder(symbols& sym)
+ : sym(sym)
+ {
+ }
+
+ template <typename Iterator>
+ adder const&
+ operator()(Iterator const& first, Iterator const& last, T const& val) const
+ {
+ sym.lookup->add(first, last, val);
+ return *this;
+ }
+
+ template <typename Str>
+ adder const&
+ operator()(Str const& s, T const& val = T()) const
+ {
+ sym.lookup->add(traits::get_begin<Char>(s)
+ , traits::get_end<Char>(s), val);
+ return *this;
+ }
+
+ template <typename Str>
+ adder const&
+ operator,(Str const& s) const
+ {
+ sym.lookup->add(traits::get_begin<Char>(s)
+ , traits::get_end<Char>(s), T());
+ return *this;
+ }
+
+ symbols& sym;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ adder& operator= (adder const&);
+ };
+
+ struct remover
+ {
+ template <typename, typename = unused_type, typename = unused_type>
+ struct result { typedef remover const& type; };
+
+ remover(symbols& sym)
+ : sym(sym)
+ {
+ }
+
+ template <typename Iterator>
+ remover const&
+ operator()(Iterator const& first, Iterator const& last) const
+ {
+ sym.lookup->remove(first, last);
+ return *this;
+ }
+
+ template <typename Str>
+ remover const&
+ operator()(Str const& s) const
+ {
+ sym.lookup->remove(traits::get_begin<Char>(s)
+ , traits::get_end<Char>(s));
+ return *this;
+ }
+
+ template <typename Str>
+ remover const&
+ operator,(Str const& s) const
+ {
+ sym.lookup->remove(traits::get_begin<Char>(s)
+ , traits::get_end<Char>(s));
+ return *this;
+ }
+
+ symbols& sym;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ remover& operator= (remover const&);
+ };
+
+ adder add;
+ remover remove;
+ shared_ptr<Lookup> lookup;
+ std::string name_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char, typename T, typename Lookup
+ , typename Filter, typename Modifiers>
+ struct make_primitive<reference<symbols<Char, T, Lookup, Filter> >, Modifiers>
+ {
+ template <typename CharEncoding>
+ struct no_case_filter
+ {
+ Char operator()(Char ch) const
+ {
+ return static_cast<Char>(CharEncoding::tolower(ch));
+ }
+ };
+
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
+ typedef reference<symbols<Char, T, Lookup, Filter> > reference_;
+ typedef no_case_filter<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers
+ , char_encoding::standard
+ , no_case::value>::type>
+ nc_filter;
+
+ typedef typename mpl::if_<
+ no_case
+ , symbols<Char, T, Lookup, nc_filter>
+ , reference_>::type
+ result_type;
+
+ result_type operator()(reference_ ref, unused_type) const
+ {
+ return result_type(ref.ref.get());
+ }
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char, typename T, typename Lookup, typename Filter
+ , typename Attr, typename Context, typename Iterator>
+ struct handles_container<qi::symbols<Char, T, Lookup, Filter>, Attr, Context, Iterator>
+ : traits::is_container<Attr> {};
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/qi/string/tst.hpp b/boost/spirit/home/qi/string/tst.hpp
new file mode 100644
index 0000000000..200894fdc1
--- /dev/null
+++ b/boost/spirit/home/qi/string/tst.hpp
@@ -0,0 +1,137 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_TST_JUNE_03_2007_1031AM)
+#define BOOST_SPIRIT_TST_JUNE_03_2007_1031AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/string/detail/tst.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ struct tst_pass_through
+ {
+ template <typename Char>
+ Char operator()(Char ch) const
+ {
+ return ch;
+ }
+ };
+
+ template <typename Char, typename T>
+ struct tst
+ {
+ typedef Char char_type; // the character type
+ typedef T value_type; // the value associated with each entry
+ typedef detail::tst_node<Char, T> node;
+
+ tst()
+ : root(0)
+ {
+ }
+
+ ~tst()
+ {
+ clear();
+ }
+
+ tst(tst const& rhs)
+ : root(0)
+ {
+ copy(rhs);
+ }
+
+ tst& operator=(tst const& rhs)
+ {
+ return assign(rhs);
+ }
+
+ template <typename Iterator, typename Filter>
+ T* find(Iterator& first, Iterator last, Filter filter) const
+ {
+ return node::find(root, first, last, filter);
+ }
+
+ template <typename Iterator>
+ T* find(Iterator& first, Iterator last) const
+ {
+ return find(first, last, tst_pass_through());
+ }
+
+ template <typename Iterator>
+ T* add(
+ Iterator first
+ , Iterator last
+ , typename boost::call_traits<T>::param_type val)
+ {
+ return node::add(root, first, last, val, this);
+ }
+
+ template <typename Iterator>
+ void remove(Iterator first, Iterator last)
+ {
+ node::remove(root, first, last, this);
+ }
+
+ void clear()
+ {
+ node::destruct_node(root, this);
+ root = 0;
+ }
+
+ template <typename F>
+ void for_each(F f) const
+ {
+ node::for_each(root, std::basic_string<Char>(), f);
+ }
+
+ private:
+
+ friend struct detail::tst_node<Char, T>;
+
+ void copy(tst const& rhs)
+ {
+ root = node::clone_node(rhs.root, this);
+ }
+
+ tst& assign(tst const& rhs)
+ {
+ if (this != &rhs)
+ {
+ clear();
+ copy(rhs);
+ }
+ return *this;
+ }
+
+ node* root;
+
+ node* new_node(Char id)
+ {
+ return new node(id);
+ }
+
+ T* new_data(typename boost::call_traits<T>::param_type val)
+ {
+ return new T(val);
+ }
+
+ void delete_node(node* p)
+ {
+ delete p;
+ }
+
+ void delete_data(T* p)
+ {
+ delete p;
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/string/tst_map.hpp b/boost/spirit/home/qi/string/tst_map.hpp
new file mode 100644
index 0000000000..0ea838c42e
--- /dev/null
+++ b/boost/spirit/home/qi/string/tst_map.hpp
@@ -0,0 +1,216 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_TST_MAP_JUNE_03_2007_1143AM)
+#define BOOST_SPIRIT_TST_MAP_JUNE_03_2007_1143AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/string/detail/tst.hpp>
+#include <boost/unordered_map.hpp>
+#include <boost/pool/object_pool.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ struct tst_pass_through; // declared in tst.hpp
+
+ template <typename Char, typename T>
+ struct tst_map
+ {
+ typedef Char char_type; // the character type
+ typedef T value_type; // the value associated with each entry
+ typedef detail::tst_node<Char, T> node;
+
+ tst_map()
+ {
+ }
+
+ ~tst_map()
+ {
+ // Nothing to do here.
+ // The pools do the right thing for us
+ }
+
+ tst_map(tst_map const& rhs)
+ {
+ copy(rhs);
+ }
+
+ tst_map& operator=(tst_map const& rhs)
+ {
+ return assign(rhs);
+ }
+
+ template <typename Iterator, typename Filter>
+ T* find(Iterator& first, Iterator last, Filter filter) const
+ {
+ if (first != last)
+ {
+ Iterator save = first;
+ typename map_type::const_iterator
+ i = map.find(filter(*first++));
+ if (i == map.end())
+ {
+ first = save;
+ return 0;
+ }
+ if (T* p = node::find(i->second.root, first, last, filter))
+ {
+ return p;
+ }
+ return i->second.data;
+ }
+ return 0;
+ }
+
+ template <typename Iterator>
+ T* find(Iterator& first, Iterator last) const
+ {
+ return find(first, last, tst_pass_through());
+ }
+
+ template <typename Iterator>
+ bool add(
+ Iterator first
+ , Iterator last
+ , typename boost::call_traits<T>::param_type val)
+ {
+ if (first != last)
+ {
+ map_data x = {0, 0};
+ std::pair<typename map_type::iterator, bool>
+ r = map.insert(std::pair<Char, map_data>(*first++, x));
+
+ if (first != last)
+ {
+ return node::add(r.first->second.root
+ , first, last, val, this) ? true : false;
+ }
+ else
+ {
+ if (r.first->second.data)
+ return false;
+ r.first->second.data = this->new_data(val);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Iterator>
+ void remove(Iterator first, Iterator last)
+ {
+ if (first != last)
+ {
+ typename map_type::iterator i = map.find(*first++);
+ if (i != map.end())
+ {
+ if (first != last)
+ {
+ node::remove(i->second.root, first, last, this);
+ }
+ else if (i->second.data)
+ {
+ this->delete_data(i->second.data);
+ i->second.data = 0;
+ }
+ if (i->second.data == 0 && i->second.root == 0)
+ {
+ map.erase(i);
+ }
+ }
+ }
+ }
+
+ void clear()
+ {
+ BOOST_FOREACH(typename map_type::value_type& x, map)
+ {
+ node::destruct_node(x.second.root, this);
+ if (x.second.data)
+ this->delete_data(x.second.data);
+ }
+ map.clear();
+ }
+
+ template <typename F>
+ void for_each(F f) const
+ {
+ BOOST_FOREACH(typename map_type::value_type const& x, map)
+ {
+ std::basic_string<Char> s(1, x.first);
+ node::for_each(x.second.root, s, f);
+ if (x.second.data)
+ f(s, *x.second.data);
+ }
+ }
+
+ private:
+
+ friend struct detail::tst_node<Char, T>;
+
+ struct map_data
+ {
+ node* root;
+ T* data;
+ };
+
+ typedef unordered_map<Char, map_data> map_type;
+
+ void copy(tst_map const& rhs)
+ {
+ BOOST_FOREACH(typename map_type::value_type const& x, rhs.map)
+ {
+ map_data xx = {node::clone_node(x.second.root, this), 0};
+ if (x.second.data)
+ xx.data = data_pool.construct(*x.second.data);
+ map[x.first] = xx;
+ }
+ }
+
+ tst_map& assign(tst_map const& rhs)
+ {
+ if (this != &rhs)
+ {
+ BOOST_FOREACH(typename map_type::value_type& x, map)
+ {
+ node::destruct_node(x.second.root, this);
+ }
+ map.clear();
+ copy(rhs);
+ }
+ return *this;
+ }
+
+ node* new_node(Char id)
+ {
+ return node_pool.construct(id);
+ }
+
+ T* new_data(typename boost::call_traits<T>::param_type val)
+ {
+ return data_pool.construct(val);
+ }
+
+ void delete_node(node* p)
+ {
+ node_pool.destroy(p);
+ }
+
+ void delete_data(T* p)
+ {
+ data_pool.destroy(p);
+ }
+
+ map_type map;
+ object_pool<node> node_pool;
+ object_pool<T> data_pool;
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/qi/what.hpp b/boost/spirit/home/qi/what.hpp
new file mode 100644
index 0000000000..ae26b7bed1
--- /dev/null
+++ b/boost/spirit/home/qi/what.hpp
@@ -0,0 +1,33 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_WHAT_APRIL_21_2007_0732AM)
+#define BOOST_SPIRIT_WHAT_APRIL_21_2007_0732AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/assert.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Expr>
+ inline info what(Expr const& expr)
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_expr_is_not_convertible_to_a_parser
+ // error message here, then the expression (expr) is not a
+ // valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
+ return compile<qi::domain>(expr).what(unused);
+ }
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support.hpp b/boost/spirit/home/support.hpp
new file mode 100644
index 0000000000..5c341fdf2b
--- /dev/null
+++ b/boost/spirit/home/support.hpp
@@ -0,0 +1,34 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_SUPPORT_SEPTEMBER_26_2008_0340AM)
+#define BOOST_SPIRIT_SUPPORT_SEPTEMBER_26_2008_0340AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include<boost/spirit/home/support/assert_msg.hpp>
+#include<boost/spirit/home/support/action_dispatch.hpp>
+#include<boost/spirit/home/support/argument.hpp>
+#include<boost/spirit/home/support/attributes.hpp>
+#include<boost/spirit/home/support/char_class.hpp>
+#include<boost/spirit/home/support/common_terminals.hpp>
+#include<boost/spirit/home/support/container.hpp>
+#include<boost/spirit/home/support/context.hpp>
+#include<boost/spirit/home/support/info.hpp>
+#include<boost/spirit/home/support/lazy.hpp>
+#include<boost/spirit/home/support/make_component.hpp>
+#include<boost/spirit/home/support/meta_compiler.hpp>
+#include<boost/spirit/home/support/modify.hpp>
+#include<boost/spirit/home/support/sequence_base_id.hpp>
+#include<boost/spirit/home/support/string_traits.hpp>
+#include<boost/spirit/home/support/terminal.hpp>
+#include<boost/spirit/home/support/unused.hpp>
+#include<boost/spirit/home/support/utf8.hpp>
+
+#endif
+
diff --git a/boost/spirit/home/support/action_dispatch.hpp b/boost/spirit/home/support/action_dispatch.hpp
new file mode 100644
index 0000000000..7b9bccf097
--- /dev/null
+++ b/boost/spirit/home/support/action_dispatch.hpp
@@ -0,0 +1,217 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ACTION_DISPATCH_APRIL_18_2008_0720AM)
+#define BOOST_SPIRIT_ACTION_DISPATCH_APRIL_18_2008_0720AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include<boost/config.hpp>
+
+#if !defined(BOOST_NO_RVALUE_REFERENCES) && !defined(BOOST_NO_LAMBDAS) && \
+ !defined(BOOST_NO_VARIADIC_TEMPLATES) && !defined(BOOST_NO_DECLTYPE)
+#include <utility>
+#include <type_traits>
+#endif
+
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Component>
+ struct action_dispatch
+ {
+#if !defined(BOOST_NO_RVALUE_REFERENCES) && !defined(BOOST_NO_LAMBDAS) && \
+ !defined(BOOST_NO_VARIADIC_TEMPLATES) && !defined(BOOST_NO_DECLTYPE)
+ // omit function parameters without specializing for each possible
+ // type of callable entity
+ // many thanks to Eelis/##iso-c++ for this contribution
+
+ private:
+ // this will be used to pass around POD types which are safe
+ // to go through the ellipsis operator (if ever used)
+ template <typename>
+ struct fwd_tag {};
+
+ // the first parameter is a placeholder to obtain SFINAE when
+ // doing overload resolution, the second one is the actual
+ // forwarder, where we can apply our implementation
+ template <typename, typename T>
+ struct fwd_storage { typedef T type; };
+
+ // gcc should accept fake<T>() but it prints a sorry, needs
+ // a check once the bug is sorted out, use a FAKE_CALL macro for now
+ template <typename T>
+ T fake_call();
+
+#define BOOST_SPIRIT_FAKE_CALL(T) (*(T*)0)
+
+ // the forwarders, here we could tweak the implementation of
+ // how parameters are passed to the functions, if needed
+ struct fwd_none
+ {
+ template<typename F, typename... Rest>
+ auto operator()(F && f, Rest&&...) -> decltype(f())
+ {
+ return f();
+ }
+ };
+
+ struct fwd_attrib
+ {
+ template<typename F, typename A, typename... Rest>
+ auto operator()(F && f, A && a, Rest&&...) -> decltype(f(a))
+ {
+ return f(a);
+ }
+ };
+
+ struct fwd_attrib_context
+ {
+ template<typename F, typename A, typename B, typename... Rest>
+ auto operator()(F && f, A && a, B && b, Rest&&...)
+ -> decltype(f(a, b))
+ {
+ return f(a, b);
+ }
+ };
+
+ struct fwd_attrib_context_pass
+ {
+ template<typename F, typename A, typename B, typename C
+ , typename... Rest>
+ auto operator()(F && f, A && a, B && b, C && c, Rest&&...)
+ -> decltype(f(a, b, c))
+ {
+ return f(a, b, c);
+ }
+ };
+
+ // SFINAE for our calling syntax, the forwarders are stored based
+ // on what function call gives a proper result
+ // this code can probably be more generic once implementations are
+ // steady
+ template <typename F>
+ static auto do_call(F && f, ...)
+ -> typename fwd_storage<decltype(f()), fwd_none>::type
+ {
+ return {};
+ }
+
+ template <typename F, typename A>
+ static auto do_call(F && f, fwd_tag<A>, ...)
+ -> typename fwd_storage<decltype(f(BOOST_SPIRIT_FAKE_CALL(A)))
+ , fwd_attrib>::type
+ {
+ return {};
+ }
+
+ template <typename F, typename A, typename B>
+ static auto do_call(F && f, fwd_tag<A>, fwd_tag<B>, ...)
+ -> typename fwd_storage<
+ decltype(f(BOOST_SPIRIT_FAKE_CALL(A), BOOST_SPIRIT_FAKE_CALL(B)))
+ , fwd_attrib_context>::type
+ {
+ return {};
+ }
+
+ template <typename F, typename A, typename B, typename C>
+ static auto do_call(F && f, fwd_tag<A>, fwd_tag<B>, fwd_tag<C>, ...)
+ -> typename fwd_storage<
+ decltype(f(BOOST_SPIRIT_FAKE_CALL(A), BOOST_SPIRIT_FAKE_CALL(B)
+ , BOOST_SPIRIT_FAKE_CALL(C)))
+ , fwd_attrib_context_pass>::type
+ {
+ return {};
+ }
+
+ // this function calls the forwarder and is responsible for
+ // stripping the tail of the parameters
+ template <typename F, typename... A>
+ static void caller(F && f, A && ... a)
+ {
+ do_call(f, fwd_tag<typename std::remove_reference<A>::type>()...)
+ (std::forward<F>(f), std::forward<A>(a)...);
+ }
+
+#undef BOOST_SPIRIT_FAKE_CALL
+
+ public:
+ template <typename F, typename Attribute, typename Context>
+ bool operator()(F const& f, Attribute& attr, Context& context)
+ {
+ bool pass = true;
+ caller(f, attr, context, pass);
+ return pass;
+ }
+#else
+ // general handler for everything not explicitly specialized below
+ template <typename F, typename Attribute, typename Context>
+ bool operator()(F const& f, Attribute& attr, Context& context)
+ {
+ bool pass = true;
+ f(attr, context, pass);
+ return pass;
+ }
+#endif
+
+ // handler for phoenix actors
+
+ // If the component this action has to be invoked for is a tuple, we
+ // wrap any non-fusion tuple into a fusion tuple (done by pass_attribute)
+ // and pass through any fusion tuple.
+ template <typename Eval, typename Attribute, typename Context>
+ bool operator()(phoenix::actor<Eval> const& f
+ , Attribute& attr, Context& context)
+ {
+ bool pass = true;
+ typename pass_attribute<Component, Attribute>::type attr_wrap(attr);
+ f(attr_wrap, context, pass);
+ return pass;
+ }
+
+ // specializations for plain function pointers taking different number of
+ // arguments
+ template <typename RT, typename A0, typename A1, typename A2
+ , typename Attribute, typename Context>
+ bool operator()(RT(*f)(A0, A1, A2), Attribute& attr, Context& context)
+ {
+ bool pass = true;
+ f(attr, context, pass);
+ return pass;
+ }
+
+ template <typename RT, typename A0, typename A1
+ , typename Attribute, typename Context>
+ bool operator()(RT(*f)(A0, A1), Attribute& attr, Context& context)
+ {
+ f(attr, context);
+ return true;
+ }
+
+ template <typename RT, typename A0, typename Attribute, typename Context>
+ bool operator()(RT(*f)(A0), Attribute& attr, Context&)
+ {
+ f(attr);
+ return true;
+ }
+
+ template <typename RT, typename Attribute, typename Context>
+ bool operator()(RT(*f)(), Attribute&, Context&)
+ {
+ f();
+ return true;
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/adapt_adt_attributes.hpp b/boost/spirit/home/support/adapt_adt_attributes.hpp
new file mode 100644
index 0000000000..63a898a0fb
--- /dev/null
+++ b/boost/spirit/home/support/adapt_adt_attributes.hpp
@@ -0,0 +1,406 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ADAPT_ADT_ATTRIBUTES_SEP_15_2010_1219PM)
+#define BOOST_SPIRIT_ADAPT_ADT_ATTRIBUTES_SEP_15_2010_1219PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/numeric_traits.hpp>
+#include <boost/fusion/include/adapt_adt.hpp>
+#include <boost/utility/enable_if.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// customization points allowing to use adapted classes with spirit
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, int N, bool Const, typename Domain>
+ struct not_is_variant<
+ fusion::extension::adt_attribute_proxy<T, N, Const>, Domain>
+ : not_is_variant<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ , Domain>
+ {};
+
+ template <typename T, int N, bool Const, typename Domain>
+ struct not_is_optional<
+ fusion::extension::adt_attribute_proxy<T, N, Const>, Domain>
+ : not_is_optional<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ , Domain>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, int N, bool Const>
+ struct is_container<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ : is_container<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >
+ {};
+
+ template <typename T, int N, bool Const>
+ struct container_value<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ : container_value<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<
+ T, N, Const
+ >::type
+ >::type
+ >
+ {};
+
+ template <typename T, int N, bool Const>
+ struct container_value<
+ fusion::extension::adt_attribute_proxy<T, N, Const> const>
+ : container_value<
+ typename add_const<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<
+ T, N, Const
+ >::type
+ >::type
+ >::type
+ >
+ {};
+
+ template <typename T, int N, typename Val>
+ struct push_back_container<
+ fusion::extension::adt_attribute_proxy<T, N, false>
+ , Val
+ , typename enable_if<is_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, false>::type
+ > >::type>
+ {
+ static bool call(
+ fusion::extension::adt_attribute_proxy<T, N, false>& p
+ , Val const& val)
+ {
+ typedef typename
+ fusion::extension::adt_attribute_proxy<T, N, false>::type
+ type;
+ return push_back(type(p), val);
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct container_iterator<
+ fusion::extension::adt_attribute_proxy<T, N, Const> >
+ : container_iterator<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<
+ T, N, Const
+ >::type
+ >::type
+ >
+ {};
+
+ template <typename T, int N, bool Const>
+ struct container_iterator<
+ fusion::extension::adt_attribute_proxy<T, N, Const> const>
+ : container_iterator<
+ typename add_const<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<
+ T, N, Const
+ >::type
+ >::type
+ >::type
+ >
+ {};
+
+ template <typename T, int N, bool Const>
+ struct begin_container<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ typedef typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >::type container_type;
+
+ static typename container_iterator<container_type>::type
+ call(fusion::extension::adt_attribute_proxy<T, N, Const>& c)
+ {
+ return c.get().begin();
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct begin_container<fusion::extension::adt_attribute_proxy<T, N, Const> const>
+ {
+ typedef typename add_const<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >::type
+ >::type container_type;
+
+ static typename container_iterator<container_type>::type
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& c)
+ {
+ return c.get().begin();
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct end_container<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ typedef typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >::type container_type;
+
+ static typename container_iterator<container_type>::type
+ call(fusion::extension::adt_attribute_proxy<T, N, Const>& c)
+ {
+ return c.get().end();
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct end_container<fusion::extension::adt_attribute_proxy<T, N, Const> const>
+ {
+ typedef typename add_const<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >::type
+ >::type container_type;
+
+ static typename container_iterator<container_type>::type
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& c)
+ {
+ return c.get().end();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, int N, typename Val>
+ struct assign_to_attribute_from_value<
+ fusion::extension::adt_attribute_proxy<T, N, false>
+ , Val>
+ {
+ static void
+ call(Val const& val
+ , fusion::extension::adt_attribute_proxy<T, N, false>& attr)
+ {
+ attr = val;
+ }
+ };
+
+ template <typename T, int N, bool Const, typename Exposed>
+ struct extract_from_attribute<
+ fusion::extension::adt_attribute_proxy<T, N, Const>, Exposed>
+ {
+ typedef typename remove_const<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >::type
+ >::type embedded_type;
+ typedef
+ typename spirit::result_of::extract_from<Exposed, embedded_type>::type
+ type;
+
+ template <typename Context>
+ static type
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& val, Context& ctx)
+ {
+ return extract_from<Exposed>(val.get(), ctx);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, int N, bool Const>
+ struct attribute_type<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ : fusion::extension::adt_attribute_proxy<T, N, Const>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, int N, bool Const>
+ struct optional_attribute<
+ fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ typedef typename result_of::optional_value<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >::type
+ >::type type;
+
+ static type
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& val)
+ {
+ return optional_value(val.get());
+ }
+
+ static bool
+ is_valid(fusion::extension::adt_attribute_proxy<T, N, Const> const& val)
+ {
+ return has_optional_value(val.get());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, int N, typename Attribute, typename Domain>
+ struct transform_attribute<
+ fusion::extension::adt_attribute_proxy<T, N, false>
+ , Attribute
+ , Domain
+ , typename disable_if<is_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, false>::type
+ > >::type>
+ {
+ typedef Attribute type;
+
+ static Attribute
+ pre(fusion::extension::adt_attribute_proxy<T, N, false>& val)
+ {
+ return val;
+ }
+ static void
+ post(
+ fusion::extension::adt_attribute_proxy<T, N, false>& val
+ , Attribute const& attr)
+ {
+ val = attr;
+ }
+ static void
+ fail(fusion::extension::adt_attribute_proxy<T, N, false>&)
+ {
+ }
+ };
+
+ template <
+ typename T, int N, bool Const, typename Attribute, typename Domain>
+ struct transform_attribute<
+ fusion::extension::adt_attribute_proxy<T, N, Const>
+ , Attribute
+ , Domain
+ , typename enable_if<is_reference<
+ typename fusion::extension::adt_attribute_proxy<
+ T, N, Const
+ >::type
+ > >::type>
+ {
+ typedef Attribute& type;
+
+ static Attribute&
+ pre(fusion::extension::adt_attribute_proxy<T, N, Const>& val)
+ {
+ return val;
+ }
+ static void
+ post(
+ fusion::extension::adt_attribute_proxy<T, N, Const>&
+ , Attribute const&)
+ {
+ }
+ static void
+ fail(fusion::extension::adt_attribute_proxy<T, N, Const>&)
+ {
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct clear_value<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ static void call(
+ fusion::extension::adt_attribute_proxy<T, N, Const>& val)
+ {
+ typedef typename
+ fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ type;
+ clear(type(val));
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct attribute_size<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ typedef typename remove_const<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >::type
+ >::type embedded_type;
+
+ typedef typename attribute_size<embedded_type>::type type;
+
+ static type
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& val)
+ {
+ return attribute_size<embedded_type>::call(val.get());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // customization point specializations for numeric generators
+ template <typename T, int N, bool Const>
+ struct absolute_value<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ typedef typename
+ fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ type;
+
+ static type
+ call (fusion::extension::adt_attribute_proxy<T, N, Const> const& val)
+ {
+ return get_absolute_value(val.get());
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct is_negative<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ static bool
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& val)
+ {
+ return test_negative(val.get());
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct is_zero<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ static bool
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& val)
+ {
+ return test_zero(val.get());
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct is_nan<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ static bool
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& val)
+ {
+ return test_nan(val.get());
+ }
+ };
+
+ template <typename T, int N, bool Const>
+ struct is_infinite<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ {
+ static bool
+ call(fusion::extension::adt_attribute_proxy<T, N, Const> const& val)
+ {
+ return test_infinite(val.get());
+ }
+ };
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace result_of
+{
+ template <typename T, int N, bool Const>
+ struct optional_value<fusion::extension::adt_attribute_proxy<T, N, Const> >
+ : result_of::optional_value<
+ typename remove_const<
+ typename remove_reference<
+ typename fusion::extension::adt_attribute_proxy<T, N, Const>::type
+ >::type
+ >::type>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/algorithm/any.hpp b/boost/spirit/home/support/algorithm/any.hpp
new file mode 100644
index 0000000000..a62201f781
--- /dev/null
+++ b/boost/spirit/home/support/algorithm/any.hpp
@@ -0,0 +1,76 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_ANY_APRIL_22_2006_1147AM)
+#define BOOST_SPIRIT_ANY_APRIL_22_2006_1147AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/fusion/include/equal_to.hpp>
+#include <boost/fusion/include/next.hpp>
+#include <boost/fusion/include/deref.hpp>
+#include <boost/fusion/include/begin.hpp>
+#include <boost/fusion/include/end.hpp>
+#include <boost/fusion/include/any.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit
+{
+ // This is the binary version of fusion::any. This might
+ // be a good candidate for inclusion in fusion algorithm
+
+ namespace detail
+ {
+ template <typename First1, typename Last, typename First2, typename F>
+ inline bool
+ any(First1 const&, First2 const&, Last const&, F const&, mpl::true_)
+ {
+ return false;
+ }
+
+ template <typename First1, typename Last, typename First2, typename F>
+ inline bool
+ any(First1 const& first1, First2 const& first2, Last const& last, F& f, mpl::false_)
+ {
+ return f(*first1, *first2) ||
+ detail::any(
+ fusion::next(first1)
+ , fusion::next(first2)
+ , last
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::next<First1>::type, Last>());
+ }
+ }
+
+ template <typename Sequence1, typename Sequence2, typename F>
+ inline bool
+ any(Sequence1 const& seq1, Sequence2& seq2, F f)
+ {
+ return detail::any(
+ fusion::begin(seq1)
+ , fusion::begin(seq2)
+ , fusion::end(seq1)
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::begin<Sequence1>::type
+ , typename fusion::result_of::end<Sequence1>::type>());
+ }
+
+ template <typename Sequence, typename F>
+ inline bool
+ any(Sequence const& seq, unused_type, F f)
+ {
+ return fusion::any(seq, f);
+ }
+
+}}
+
+#endif
+
diff --git a/boost/spirit/home/support/algorithm/any_if.hpp b/boost/spirit/home/support/algorithm/any_if.hpp
new file mode 100644
index 0000000000..0ce6d3ff30
--- /dev/null
+++ b/boost/spirit/home/support/algorithm/any_if.hpp
@@ -0,0 +1,220 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_ANY_IF_MARCH_30_2007_1220PM)
+#define BOOST_SPIRIT_ANY_IF_MARCH_30_2007_1220PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/fusion/include/equal_to.hpp>
+#include <boost/fusion/include/next.hpp>
+#include <boost/fusion/include/deref.hpp>
+#include <boost/fusion/include/value_of.hpp>
+#include <boost/fusion/include/begin.hpp>
+#include <boost/fusion/include/end.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/fusion/include/any.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This is a special version for a binary fusion::any. The predicate
+ // is used to decide whether to advance the second iterator or not.
+ // This is needed for sequences containing components with unused
+ // attributes. The second iterator is advanced only if the attribute
+ // of the corresponding component iterator is not unused.
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Pred>
+ struct apply_predicate
+ : mpl::apply1<Pred, typename fusion::result_of::value_of<Iterator>::type>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////
+ // if the predicate is true, attribute_next returns next(Iterator2),
+ // otherwise Iterator2
+ namespace result_of
+ {
+ template <
+ typename Iterator1, typename Iterator2, typename Last2
+ , typename Pred>
+ struct attribute_next
+ {
+ typedef mpl::and_<
+ apply_predicate<Iterator1, Pred>
+ , mpl::not_<fusion::result_of::equal_to<Iterator2, Last2> >
+ > pred;
+
+ typedef typename
+ mpl::eval_if<
+ pred
+ , fusion::result_of::next<Iterator2>
+ , mpl::identity<Iterator2>
+ >::type
+ type;
+
+ template <typename Iterator>
+ static type
+ call(Iterator const& i, mpl::true_)
+ {
+ return fusion::next(i);
+ }
+
+ template <typename Iterator>
+ static type
+ call(Iterator const& i, mpl::false_)
+ {
+ return i;
+ }
+
+ template <typename Iterator>
+ static type
+ call(Iterator const& i)
+ {
+ return call(i, pred());
+ }
+ };
+ }
+
+ template <
+ typename Pred, typename Iterator1, typename Last2
+ , typename Iterator2>
+ inline typename
+ result_of::attribute_next<Iterator1, Iterator2, Last2, Pred
+ >::type const
+ attribute_next(Iterator2 const& i)
+ {
+ return result_of::attribute_next<
+ Iterator1, Iterator2, Last2, Pred>::call(i);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // if the predicate is true, attribute_value returns deref(Iterator2),
+ // otherwise unused
+ namespace result_of
+ {
+ template <
+ typename Iterator1, typename Iterator2, typename Last2
+ , typename Pred>
+ struct attribute_value
+ {
+ typedef mpl::and_<
+ apply_predicate<Iterator1, Pred>
+ , mpl::not_<fusion::result_of::equal_to<Iterator2, Last2> >
+ > pred;
+
+ typedef typename
+ mpl::eval_if<
+ pred
+ , fusion::result_of::deref<Iterator2>
+ , mpl::identity<unused_type const>
+ >::type
+ type;
+
+ template <typename Iterator>
+ static type
+ call(Iterator const& i, mpl::true_)
+ {
+ return fusion::deref(i);
+ }
+
+ template <typename Iterator>
+ static type
+ call(Iterator const&, mpl::false_)
+ {
+ return unused;
+ }
+
+ template <typename Iterator>
+ static type
+ call(Iterator const& i)
+ {
+ return call(i, pred());
+ }
+ };
+ }
+
+ template <
+ typename Pred, typename Iterator1, typename Last2
+ , typename Iterator2>
+ inline typename
+ result_of::attribute_value<Iterator1, Iterator2, Last2, Pred
+ >::type
+ attribute_value(Iterator2 const& i)
+ {
+ return result_of::attribute_value<
+ Iterator1, Iterator2, Last2, Pred>::call(i);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <
+ typename Pred, typename First1, typename Last1, typename First2
+ , typename Last2, typename F>
+ inline bool
+ any_if (First1 const&, First2 const&, Last1 const&, Last2 const&
+ , F const&, mpl::true_)
+ {
+ return false;
+ }
+
+ template <
+ typename Pred, typename First1, typename Last1, typename First2
+ , typename Last2, typename F>
+ inline bool
+ any_if (First1 const& first1, First2 const& first2, Last1 const& last1
+ , Last2 const& last2, F& f, mpl::false_)
+ {
+ typename result_of::attribute_value<First1, First2, Last2, Pred>::type
+ attribute = attribute_value<Pred, First1, Last2>(first2);
+
+ return f(*first1, attribute) ||
+ detail::any_if<Pred>(
+ fusion::next(first1)
+ , attribute_next<Pred, First1, Last2>(first2)
+ , last1, last2
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::next<First1>::type, Last1>());
+ }
+ }
+
+ template <typename Pred, typename Sequence1, typename Sequence2, typename F>
+ inline bool
+ any_if(Sequence1 const& seq1, Sequence2& seq2, F f, Pred)
+ {
+ return detail::any_if<Pred>(
+ fusion::begin(seq1), fusion::begin(seq2)
+ , fusion::end(seq1), fusion::end(seq2)
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::begin<Sequence1>::type
+ , typename fusion::result_of::end<Sequence1>::type>());
+ }
+
+ template <typename Pred, typename Sequence, typename F>
+ inline bool
+ any_if(Sequence const& seq, unused_type const, F f, Pred)
+ {
+ return fusion::any(seq, f);
+ }
+
+}}
+
+#endif
+
diff --git a/boost/spirit/home/support/algorithm/any_if_ns.hpp b/boost/spirit/home/support/algorithm/any_if_ns.hpp
new file mode 100644
index 0000000000..394f365b28
--- /dev/null
+++ b/boost/spirit/home/support/algorithm/any_if_ns.hpp
@@ -0,0 +1,91 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_ANY_IF_NS_NOVEMBER_04_2008_0906PM)
+#define BOOST_SPIRIT_ANY_IF_NS_NOVEMBER_04_2008_0906PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/algorithm/any_if.hpp>
+#include <boost/spirit/home/support/algorithm/any_ns.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This is a special version for a binary fusion::any. The predicate
+ // is used to decide whether to advance the second iterator or not.
+ // This is needed for sequences containing components with unused
+ // attributes. The second iterator is advanced only if the attribute
+ // of the corresponding component iterator is not unused.
+ //
+ // This is a non-short circuiting (ns) version of the any_if algorithm.
+ // see any_if.hpp (uses | instead of ||).
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <
+ typename Pred, typename First1, typename Last1, typename First2
+ , typename Last2, typename F
+ >
+ inline bool
+ any_if_ns(First1 const&, First2 const&, Last1 const&, Last2 const&
+ , F const&, mpl::true_)
+ {
+ return false;
+ }
+
+ template <
+ typename Pred, typename First1, typename Last1, typename First2
+ , typename Last2, typename F
+ >
+ inline bool
+ any_if_ns(First1 const& first1, First2 const& first2
+ , Last1 const& last1, Last2 const& last2, F& f, mpl::false_)
+ {
+ return (0 != (f(*first1, attribute_value<Pred, First1, Last2>(first2)) |
+ detail::any_if_ns<Pred>(
+ fusion::next(first1)
+ , attribute_next<Pred, First1, Last2>(first2)
+ , last1, last2
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::next<First1>::type, Last1>())));
+ }
+ }
+
+ template <typename Pred, typename Sequence1, typename Sequence2, typename F>
+ inline bool
+ any_if_ns(Sequence1 const& seq1, Sequence2& seq2, F f, Pred)
+ {
+ return detail::any_if_ns<Pred>(
+ fusion::begin(seq1), fusion::begin(seq2)
+ , fusion::end(seq1), fusion::end(seq2)
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::begin<Sequence1>::type
+ , typename fusion::result_of::end<Sequence1>::type>());
+ }
+
+ template <typename Pred, typename Sequence, typename F>
+ inline bool
+ any_if_ns(Sequence const& seq, unused_type const, F f, Pred)
+ {
+ return detail::any_ns(
+ fusion::begin(seq)
+ , fusion::end(seq)
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::begin<Sequence>::type
+ , typename fusion::result_of::end<Sequence>::type>());
+ }
+
+}}
+
+#endif
+
diff --git a/boost/spirit/home/support/algorithm/any_ns.hpp b/boost/spirit/home/support/algorithm/any_ns.hpp
new file mode 100644
index 0000000000..63b95267ae
--- /dev/null
+++ b/boost/spirit/home/support/algorithm/any_ns.hpp
@@ -0,0 +1,102 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_ANY_NS_MARCH_13_2007_0827AM)
+#define BOOST_SPIRIT_ANY_NS_MARCH_13_2007_0827AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/fusion/include/equal_to.hpp>
+#include <boost/fusion/include/next.hpp>
+#include <boost/fusion/include/deref.hpp>
+#include <boost/fusion/include/begin.hpp>
+#include <boost/fusion/include/end.hpp>
+#include <boost/fusion/include/any.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit
+{
+ // A non-short circuiting (ns) version of the any algorithm (uses
+ // | instead of ||.
+
+ namespace detail
+ {
+ template <typename First1, typename Last, typename First2, typename F>
+ inline bool
+ any_ns(First1 const&, First2 const&, Last const&, F const&, mpl::true_)
+ {
+ return false;
+ }
+
+ template <typename First1, typename Last, typename First2, typename F>
+ inline bool
+ any_ns(First1 const& first1, First2 const& first2, Last const& last, F& f, mpl::false_)
+ {
+ return (0 != (f(*first1, *first2) |
+ detail::any_ns(
+ fusion::next(first1)
+ , fusion::next(first2)
+ , last
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::next<First1>::type, Last>())));
+ }
+
+ template <typename First, typename Last, typename F>
+ inline bool
+ any_ns(First const&, Last const&, F const&, mpl::true_)
+ {
+ return false;
+ }
+
+ template <typename First, typename Last, typename F>
+ inline bool
+ any_ns(First const& first, Last const& last, F& f, mpl::false_)
+ {
+ return (0 != (f(*first) |
+ detail::any_ns(
+ fusion::next(first)
+ , last
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::next<First>::type, Last>())));
+ }
+ }
+
+ template <typename Sequence1, typename Sequence2, typename F>
+ inline bool
+ any_ns(Sequence1 const& seq1, Sequence2& seq2, F f)
+ {
+ return detail::any_ns(
+ fusion::begin(seq1)
+ , fusion::begin(seq2)
+ , fusion::end(seq1)
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::begin<Sequence1>::type
+ , typename fusion::result_of::end<Sequence1>::type>());
+ }
+
+ template <typename Sequence, typename F>
+ inline bool
+ any_ns(Sequence const& seq, unused_type, F f)
+ {
+ return detail::any_ns(
+ fusion::begin(seq)
+ , fusion::end(seq)
+ , f
+ , fusion::result_of::equal_to<
+ typename fusion::result_of::begin<Sequence>::type
+ , typename fusion::result_of::end<Sequence>::type>());
+ }
+
+}}
+
+#endif
+
diff --git a/boost/spirit/home/support/argument.hpp b/boost/spirit/home/support/argument.hpp
new file mode 100644
index 0000000000..caeee0b46a
--- /dev/null
+++ b/boost/spirit/home/support/argument.hpp
@@ -0,0 +1,217 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Thomas Heller
+
+ Distributed under the 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_SPIRIT_ARGUMENT_FEBRUARY_17_2007_0339PM)
+#define BOOST_SPIRIT_ARGUMENT_FEBRUARY_17_2007_0339PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/support/limits.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/at.hpp>
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+#define SPIRIT_DECLARE_ARG(z, n, data) \
+ typedef phoenix::actor<argument<n> > \
+ BOOST_PP_CAT(BOOST_PP_CAT(_, BOOST_PP_INC(n)), _type); \
+ phoenix::actor<argument<n> > const \
+ BOOST_PP_CAT(_, BOOST_PP_INC(n)) = \
+ BOOST_PP_CAT(BOOST_PP_CAT(_, BOOST_PP_INC(n)), _type)(); \
+ /***/
+
+#define SPIRIT_USING_ARGUMENT(z, n, data) \
+ using spirit::BOOST_PP_CAT(BOOST_PP_CAT(_, n), _type); \
+ using spirit::BOOST_PP_CAT(_, n); \
+ /***/
+
+#else
+
+#define SPIRIT_DECLARE_ARG(z, n, data) \
+ typedef phoenix::actor<argument<n> > \
+ BOOST_PP_CAT(BOOST_PP_CAT(_, BOOST_PP_INC(n)), _type); \
+ /***/
+
+#define SPIRIT_USING_ARGUMENT(z, n, data) \
+ using spirit::BOOST_PP_CAT(BOOST_PP_CAT(_, n), _type); \
+ /***/
+
+#endif
+
+namespace boost { namespace spirit
+{
+ template <int N>
+ struct argument;
+
+ template <typename Dummy>
+ struct attribute_context;
+}}
+
+BOOST_PHOENIX_DEFINE_CUSTOM_TERMINAL(
+ template <int N>
+ , boost::spirit::argument<N>
+ , mpl::false_ // is not nullary
+ , v2_eval(
+ proto::make<
+ boost::spirit::argument<N>()
+ >
+ , proto::call<
+ functional::env(proto::_state)
+ >
+ )
+)
+
+BOOST_PHOENIX_DEFINE_CUSTOM_TERMINAL(
+ template <typename Dummy>
+ , boost::spirit::attribute_context<Dummy>
+ , mpl::false_ // is not nullary
+ , v2_eval(
+ proto::make<
+ boost::spirit::attribute_context<Dummy>()
+ >
+ , proto::call<
+ functional::env(proto::_state)
+ >
+ )
+)
+
+namespace boost { namespace spirit
+{
+ namespace result_of
+ {
+ template <typename Sequence, int N>
+ struct get_arg
+ {
+ typedef typename
+ fusion::result_of::size<Sequence>::type
+ sequence_size;
+
+ // report invalid argument not found (N is out of bounds)
+ BOOST_SPIRIT_ASSERT_MSG(
+ (N < sequence_size::value),
+ index_is_out_of_bounds, ());
+
+ typedef typename
+ fusion::result_of::at_c<Sequence, N>::type
+ type;
+
+ static type call(Sequence& seq)
+ {
+ return fusion::at_c<N>(seq);
+ }
+ };
+
+ template <typename Sequence, int N>
+ struct get_arg<Sequence&, N> : get_arg<Sequence, N>
+ {
+ };
+ }
+
+ template <int N, typename T>
+ typename result_of::get_arg<T, N>::type
+ get_arg(T& val)
+ {
+ return result_of::get_arg<T, N>::call(val);
+ }
+
+ template <typename>
+ struct attribute_context
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ // FIXME: is this remove_const really necessary?
+ typedef typename
+ remove_const<
+ typename mpl::at_c<typename Env::args_type, 0>::type
+ >::type
+ type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return fusion::at_c<0>(env.args());
+ }
+ };
+
+ template <int N>
+ struct argument
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ mpl::at_c<typename Env::args_type, 0>::type
+ arg_type;
+
+ typedef typename result_of::get_arg<arg_type, N>::type type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return get_arg<N>(fusion::at_c<0>(env.args()));
+ }
+ };
+
+ // _0 refers to the whole attribute as generated by the lhs parser
+ typedef phoenix::actor<attribute_context<void> > _0_type;
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ _0_type const _0 = _0_type();
+#endif
+
+ // _1, _2, ... refer to the attributes of the single components the lhs
+ // parser is composed of
+ typedef phoenix::actor<argument<0> > _1_type;
+ typedef phoenix::actor<argument<1> > _2_type;
+ typedef phoenix::actor<argument<2> > _3_type;
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ _1_type const _1 = _1_type();
+ _2_type const _2 = _2_type();
+ _3_type const _3 = _3_type();
+#endif
+
+ // '_pass' may be used to make a match fail in retrospective
+ typedef phoenix::arg_names::_3_type _pass_type;
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ _pass_type const _pass = _pass_type();
+#endif
+
+ // Bring in the rest of the arguments and attributes (_4 .. _N+1), using PP
+ BOOST_PP_REPEAT_FROM_TO(
+ 3, SPIRIT_ARGUMENTS_LIMIT, SPIRIT_DECLARE_ARG, _)
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ // You can bring these in with the using directive
+ // without worrying about bringing in too much.
+ namespace labels
+ {
+ BOOST_PP_REPEAT(SPIRIT_ARGUMENTS_LIMIT, SPIRIT_USING_ARGUMENT, _)
+ }
+#endif
+
+}}
+
+#undef SPIRIT_DECLARE_ARG
+#endif
diff --git a/boost/spirit/home/support/argument_expression.hpp b/boost/spirit/home/support/argument_expression.hpp
new file mode 100644
index 0000000000..ff5d4cec53
--- /dev/null
+++ b/boost/spirit/home/support/argument_expression.hpp
@@ -0,0 +1,132 @@
+/*=============================================================================
+ Copyright (c) 2011 Thomas Heller
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Thomas Heller
+
+ Distributed under the 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_SPIRIT_ARGUMENT_MARCH_22_2011_0939PM)
+#define BOOST_SPIRIT_ARGUMENT_MARCH_22_2011_0939PM
+
+#include <boost/spirit/include/phoenix_core.hpp>
+
+namespace boost { namespace spirit
+{
+ template <int N>
+ struct argument;
+
+ template <typename Dummy>
+ struct attribute_context;
+
+ namespace expression
+ {
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+ template <int N>
+ struct argument
+ {
+ typedef phoenix::actor<spirit::argument<N> > type;
+
+ static type make()
+ {
+ return spirit::argument<N>();
+ }
+ };
+
+ template <typename Dummy>
+ struct attribute_context
+ {
+ typedef phoenix::actor<spirit::attribute_context<Dummy> > type;
+
+ static type make()
+ {
+ return spirit::attribute_context<Dummy>();
+ }
+ };
+#else
+ template <int N>
+ struct argument
+ : phoenix::expression::terminal<spirit::argument<N> >
+ {
+ typedef typename phoenix::expression::terminal<
+ spirit::argument<N>
+ >::type type;
+
+ static type make()
+ {
+ type const e = {{{}}};
+ return e;
+ }
+ };
+
+ template <typename Dummy>
+ struct attribute_context
+ : phoenix::expression::terminal<spirit::attribute_context<Dummy> >
+ {
+ typedef typename phoenix::expression::terminal<
+ spirit::attribute_context<Dummy>
+ >::type type;
+
+ static type make()
+ {
+ type const e = {{{}}};
+ return e;
+ }
+ };
+#endif
+ }
+}}
+
+#ifdef BOOST_SPIRIT_USE_PHOENIX_V3
+namespace boost { namespace phoenix
+{
+ namespace result_of
+ {
+ template <typename Dummy>
+ struct is_nullary<custom_terminal<spirit::attribute_context<Dummy> > >
+ : mpl::false_
+ {};
+
+ template <int N>
+ struct is_nullary<custom_terminal<spirit::argument<N> > >
+ : mpl::false_
+ {};
+ }
+
+ template <typename Dummy>
+ struct is_custom_terminal<spirit::attribute_context<Dummy> >
+ : mpl::true_
+ {};
+
+ template <int N>
+ struct is_custom_terminal<spirit::argument<N> >
+ : mpl::true_
+ {};
+
+ template <typename Dummy>
+ struct custom_terminal<spirit::attribute_context<Dummy> >
+ : proto::call<
+ v2_eval(
+ proto::make<spirit::attribute_context<Dummy>()>
+ , proto::call<
+ functional::env(proto::_state)
+ >
+ )
+ >
+ {};
+
+ template <int N>
+ struct custom_terminal<spirit::argument<N> >
+ : proto::call<
+ v2_eval(
+ proto::make<spirit::argument<N>()>
+ , proto::call<
+ functional::env(proto::_state)
+ >
+ )
+ >
+ {};
+}}
+#endif // BOOST_SPIRIT_USE_PHOENIX_V3
+
+#endif
diff --git a/boost/spirit/home/support/assert_msg.hpp b/boost/spirit/home/support/assert_msg.hpp
new file mode 100644
index 0000000000..db36072917
--- /dev/null
+++ b/boost/spirit/home/support/assert_msg.hpp
@@ -0,0 +1,31 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ASSERT_MSG_JUN_23_2009_0836AM)
+#define BOOST_SPIRIT_ASSERT_MSG_JUN_23_2009_0836AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+// Allow to work around the MPL problem in BOOST_MPL_ASSERT_MSG generating
+// multiple definition linker errors for certain compilers (VC++)
+#if BOOST_SPIRIT_DONT_USE_MPL_ASSERT_MSG != 0
+#include <boost/static_assert.hpp>
+#define BOOST_SPIRIT_ASSERT_MSG(Cond, Msg, Types) \
+ BOOST_STATIC_ASSERT(Cond)
+#else
+#include <boost/mpl/assert.hpp>
+#define BOOST_SPIRIT_ASSERT_MSG(Cond, Msg, Types) \
+ BOOST_MPL_ASSERT_MSG(Cond, Msg, Types)
+#endif
+
+#define BOOST_SPIRIT_ASSERT_MATCH(Domain, Expr) \
+ BOOST_SPIRIT_ASSERT_MSG(( \
+ boost::spirit::traits::matches<Domain, Expr>::value \
+ ), error_invalid_expression, (Expr))
+
+#endif
+
diff --git a/boost/spirit/home/support/attributes.hpp b/boost/spirit/home/support/attributes.hpp
new file mode 100644
index 0000000000..48bff06085
--- /dev/null
+++ b/boost/spirit/home/support/attributes.hpp
@@ -0,0 +1,1358 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_ATTRIBUTES_JANUARY_29_2007_0954AM)
+#define BOOST_SPIRIT_ATTRIBUTES_JANUARY_29_2007_0954AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/detail/hold_any.hpp>
+#include <boost/spirit/home/support/detail/as_variant.hpp>
+#include <boost/optional/optional.hpp>
+#include <boost/fusion/include/transform.hpp>
+#include <boost/fusion/include/filter_if.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/fusion/include/push_front.hpp>
+#include <boost/fusion/include/pop_front.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/fusion/include/for_each.hpp>
+#include <boost/fusion/include/is_view.hpp>
+#include <boost/fusion/include/mpl.hpp>
+#include <boost/foreach.hpp>
+#include <boost/utility/value_init.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/mpl/find_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/distance.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/equal.hpp>
+#include <boost/proto/proto_fwd.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/variant.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/config.hpp>
+#include <vector>
+#include <utility>
+#include <ios>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This file deals with attribute related functions and meta-functions
+ // including generalized attribute transformation utilities for Spirit
+ // components.
+ ///////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Find out if T can be a (strong) substitute for Expected attribute
+ namespace detail
+ {
+ template <typename T, typename Expected>
+ struct value_type_is_substitute
+ : is_substitute<
+ typename container_value<T>::type
+ , typename container_value<Expected>::type>
+ {};
+
+ template <typename T, typename Expected, typename Enable = void>
+ struct is_substitute_impl : is_same<T, Expected> {};
+
+ template <typename T, typename Expected>
+ struct is_substitute_impl<T, Expected,
+ typename enable_if<
+ mpl::and_<
+ fusion::traits::is_sequence<T>,
+ fusion::traits::is_sequence<Expected>,
+ mpl::equal<T, Expected, is_substitute<mpl::_1, mpl::_2> >
+ >
+ >::type>
+ : mpl::true_ {};
+
+ template <typename T, typename Expected>
+ struct is_substitute_impl<T, Expected,
+ typename enable_if<
+ mpl::and_<
+ is_container<T>,
+ is_container<Expected>,
+ detail::value_type_is_substitute<T, Expected>
+ >
+ >::type>
+ : mpl::true_ {};
+ }
+
+ template <typename T, typename Expected, typename Enable /*= void*/>
+ struct is_substitute
+ : detail::is_substitute_impl<T, Expected> {};
+
+ template <typename T, typename Expected>
+ struct is_substitute<optional<T>, optional<Expected> >
+ : is_substitute<T, Expected> {};
+
+ template <typename T>
+ struct is_substitute<T, T
+ , typename enable_if<not_is_optional<T> >::type>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Find out if T can be a weak substitute for Expected attribute
+ namespace detail
+ {
+ // A type, which is convertible to the attribute is at the same time
+ // usable as its weak substitute.
+ template <typename T, typename Expected, typename Enable = void>
+ struct is_weak_substitute_impl : is_convertible<T, Expected> {};
+
+// // An exposed attribute is a weak substitute for a supplied container
+// // attribute if it is a weak substitute for its value_type. This is
+// // true as all character parsers are compatible with a container
+// // attribute having the corresponding character type as its value_type.
+// template <typename T, typename Expected>
+// struct is_weak_substitute_for_value_type
+// : is_weak_substitute<T, typename container_value<Expected>::type>
+// {};
+//
+// template <typename T, typename Expected>
+// struct is_weak_substitute_impl<T, Expected,
+// typename enable_if<
+// mpl::and_<
+// mpl::not_<is_string<T> >
+// , is_string<Expected>
+// , is_weak_substitute_for_value_type<T, Expected> >
+// >::type>
+// : mpl::true_
+// {};
+
+ // An exposed container attribute is a weak substitute for a supplied
+ // container attribute if and only if their value_types are weak
+ // substitutes.
+ template <typename T, typename Expected>
+ struct value_type_is_weak_substitute
+ : is_weak_substitute<
+ typename container_value<T>::type
+ , typename container_value<Expected>::type>
+ {};
+
+ template <typename T, typename Expected>
+ struct is_weak_substitute_impl<T, Expected,
+ typename enable_if<
+ mpl::and_<
+ is_container<T>
+ , is_container<Expected>
+ , value_type_is_weak_substitute<T, Expected> >
+ >::type>
+ : mpl::true_ {};
+
+ // Two fusion sequences are weak substitutes if and only if their
+ // elements are pairwise weak substitutes.
+ template <typename T, typename Expected>
+ struct is_weak_substitute_impl<T, Expected,
+ typename enable_if<
+ mpl::and_<
+ fusion::traits::is_sequence<T>
+ , fusion::traits::is_sequence<Expected>
+ , mpl::equal<T, Expected, is_weak_substitute<mpl::_1, mpl::_2> > >
+ >::type>
+ : mpl::true_ {};
+
+ // If this is not defined, the main template definition above will return
+ // true if T is convertible to the first type in a fusion::vector. We
+ // globally declare any non-Fusion sequence T as not compatible with any
+ // Fusion sequence 'Expected'.
+ template <typename T, typename Expected>
+ struct is_weak_substitute_impl<T, Expected,
+ typename enable_if<
+ mpl::and_<
+ mpl::not_<fusion::traits::is_sequence<T> >
+ , fusion::traits::is_sequence<Expected> >
+ >::type>
+ : mpl::false_ {};
+ }
+
+ // main template forwards to detail namespace, this helps older compilers
+ // to disambiguate things
+ template <typename T, typename Expected, typename Enable /*= void*/>
+ struct is_weak_substitute
+ : detail::is_weak_substitute_impl<T, Expected> {};
+
+ template <typename T, typename Expected>
+ struct is_weak_substitute<optional<T>, optional<Expected> >
+ : is_weak_substitute<T, Expected> {};
+
+ template <typename T, typename Expected>
+ struct is_weak_substitute<optional<T>, Expected>
+ : is_weak_substitute<T, Expected> {};
+
+ template <typename T, typename Expected>
+ struct is_weak_substitute<T, optional<Expected> >
+ : is_weak_substitute<T, Expected> {};
+
+#define BOOST_SPIRIT_IS_WEAK_SUBSTITUTE(z, N, _) \
+ is_weak_substitute<BOOST_PP_CAT(T, N), Expected>::type::value && \
+ /***/
+
+ // make sure unused variant parameters do not affect the outcome
+ template <typename Expected>
+ struct is_weak_substitute<boost::detail::variant::void_, Expected>
+ : mpl::true_
+ {};
+
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Expected>
+ struct is_weak_substitute<
+ boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Expected>
+ : mpl::bool_<BOOST_PP_REPEAT(BOOST_VARIANT_LIMIT_TYPES
+ , BOOST_SPIRIT_IS_WEAK_SUBSTITUTE, _) true>
+ {};
+
+#undef BOOST_SPIRIT_IS_WEAK_SUBSTITUTE
+
+ template <typename T>
+ struct is_weak_substitute<T, T
+ , typename enable_if<
+ mpl::and_<not_is_optional<T>, not_is_variant<T> >
+ >::type>
+ : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable/* = void*/>
+ struct is_proxy : mpl::false_ {};
+
+ template <typename T>
+ struct is_proxy<T,
+ typename enable_if<
+ mpl::and_<
+ fusion::traits::is_sequence<T>,
+ fusion::traits::is_view<T>
+ >
+ >::type>
+ : mpl::true_ {};
+
+ namespace detail
+ {
+ // By declaring a nested struct in your class/struct, you tell
+ // spirit that it is regarded as a variant type. The minimum
+ // required interface for such a variant is that it has constructors
+ // for various types supported by your variant and a typedef 'types'
+ // which is an mpl sequence of the contained types.
+ //
+ // This is an intrusive interface. For a non-intrusive interface,
+ // use the not_is_variant trait.
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(adapted_variant_tag)
+ }
+
+ template <typename T, typename Domain, typename Enable/* = void*/>
+ struct not_is_variant
+ : mpl::not_<detail::has_adapted_variant_tag<T> >
+ {};
+
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Domain>
+ struct not_is_variant<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Domain>
+ : mpl::false_
+ {};
+
+ template <typename T, typename Domain>
+ struct not_is_variant<boost::optional<T>, Domain>
+ : not_is_variant<T, Domain>
+ {};
+
+ // we treat every type as if it where the variant (as this meta function is
+ // invoked for variant types only)
+ template <typename T>
+ struct variant_type
+ : mpl::identity<T>
+ {};
+
+ template <typename T>
+ struct variant_type<boost::optional<T> >
+ : variant_type<T>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The compute_compatible_component_variant
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ // A component is compatible to a given Attribute type if the
+ // Attribute is the same as the expected type of the component or if
+ // it is convertible to the expected type.
+ template <typename Expected, typename Attribute>
+ struct attribute_is_compatible
+ : is_convertible<Attribute, Expected>
+ {};
+
+ template <typename Expected, typename Attribute>
+ struct attribute_is_compatible<Expected, boost::optional<Attribute> >
+ : is_convertible<Attribute, Expected>
+ {};
+
+ template <typename Container>
+ struct is_hold_any_container
+ : traits::is_hold_any<typename traits::container_value<Container>::type>
+ {};
+ }
+
+ template <typename Attribute, typename Expected
+ , typename IsNotVariant = mpl::false_, typename Enable = void>
+ struct compute_compatible_component_variant
+ : mpl::or_<
+ traits::detail::attribute_is_compatible<Expected, Attribute>
+ , traits::is_hold_any<Expected>
+ , mpl::eval_if<
+ is_container<Expected>
+ , traits::detail::is_hold_any_container<Expected>
+ , mpl::false_> >
+ {};
+
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(types)
+ }
+
+ template <typename Variant, typename Expected>
+ struct compute_compatible_component_variant<Variant, Expected, mpl::false_
+ , typename enable_if<detail::has_types<Variant> >::type>
+ {
+ typedef typename traits::variant_type<Variant>::type variant_type;
+ typedef typename variant_type::types types;
+ typedef typename mpl::end<types>::type end;
+
+ typedef typename
+ mpl::find_if<types, is_same<Expected, mpl::_1> >::type
+ iter;
+
+ typedef typename mpl::distance<
+ typename mpl::begin<types>::type, iter
+ >::type distance;
+
+ // true_ if the attribute matches one of the types in the variant
+ typedef typename mpl::not_<is_same<iter, end> >::type type;
+ enum { value = type::value };
+
+ // return the type in the variant the attribute is compatible with
+ typedef typename
+ mpl::eval_if<type, mpl::deref<iter>, mpl::identity<unused_type> >::type
+ compatible_type;
+
+ // return whether the given type is compatible with the Expected type
+ static bool is_compatible(int which)
+ {
+ return which == distance::value;
+ }
+ };
+
+ template <typename Expected, typename Attribute, typename Domain>
+ struct compute_compatible_component
+ : compute_compatible_component_variant<Attribute, Expected
+ , typename spirit::traits::not_is_variant<Attribute, Domain>::type> {};
+
+ template <typename Expected, typename Domain>
+ struct compute_compatible_component<Expected, unused_type, Domain>
+ : mpl::false_ {};
+
+ template <typename Attribute, typename Domain>
+ struct compute_compatible_component<unused_type, Attribute, Domain>
+ : mpl::false_ {};
+
+ template <typename Domain>
+ struct compute_compatible_component<unused_type, unused_type, Domain>
+ : mpl::false_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // return the type currently stored in the given variant
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct variant_which<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ {
+ static int call(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& v)
+ {
+ return v.which();
+ }
+ };
+
+ template <typename T>
+ int which(T const& v)
+ {
+ return variant_which<T>::call(v);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Domain, typename Enable/* = void*/>
+ struct not_is_optional
+ : mpl::true_
+ {};
+
+ template <typename T, typename Domain>
+ struct not_is_optional<boost::optional<T>, Domain>
+ : mpl::false_
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // attribute_of
+ //
+ // Get the component's attribute
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Component
+ , typename Context = unused_type, typename Iterator = unused_type>
+ struct attribute_of
+ {
+ typedef typename Component::template
+ attribute<Context, Iterator>::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // attribute_not_unused
+ //
+ // An mpl meta-function class that determines whether a component's
+ // attribute is not unused.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Context, typename Iterator = unused_type>
+ struct attribute_not_unused
+ {
+ template <typename Component>
+ struct apply
+ : not_is_unused<typename
+ attribute_of<Component, Context, Iterator>::type>
+ {};
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Retrieve the attribute type to use from the given type
+ //
+ // This is needed to extract the correct attribute type from proxy classes
+ // as utilized in FUSION_ADAPT_ADT et. al.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Enable/* = void*/>
+ struct attribute_type : mpl::identity<Attribute> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Retrieve the size of a fusion sequence (compile time)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct sequence_size
+ : fusion::result_of::size<T>
+ {};
+
+ template <>
+ struct sequence_size<unused_type>
+ : mpl::int_<0>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Retrieve the size of an attribute (runtime)
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Attribute, typename Enable = void>
+ struct attribute_size_impl
+ {
+ typedef std::size_t type;
+
+ static type call(Attribute const&)
+ {
+ return 1;
+ }
+ };
+
+ template <typename Attribute>
+ struct attribute_size_impl<Attribute
+ , typename enable_if<
+ mpl::and_<
+ fusion::traits::is_sequence<Attribute>
+ , mpl::not_<traits::is_container<Attribute> >
+ >
+ >::type>
+ {
+ typedef typename fusion::result_of::size<Attribute>::value_type type;
+
+ static type call(Attribute const& attr)
+ {
+ return fusion::size(attr);
+ }
+ };
+
+ template <typename Attribute>
+ struct attribute_size_impl<Attribute
+ , typename enable_if<
+ mpl::and_<
+ traits::is_container<Attribute>
+ , mpl::not_<traits::is_iterator_range<Attribute> >
+ >
+ >::type>
+ {
+ typedef typename Attribute::size_type type;
+
+ static type call(Attribute const& attr)
+ {
+ return attr.size();
+ }
+ };
+ }
+
+ template <typename Attribute, typename Enable/* = void*/>
+ struct attribute_size
+ : detail::attribute_size_impl<Attribute>
+ {};
+
+ template <typename Attribute>
+ struct attribute_size<optional<Attribute> >
+ {
+ typedef typename attribute_size<Attribute>::type type;
+
+ static type call(optional<Attribute> const& val)
+ {
+ if (!val)
+ return 0;
+ return val.get();
+ }
+ };
+
+ template <typename Iterator>
+ struct attribute_size<iterator_range<Iterator> >
+ {
+ typedef typename boost::detail::iterator_traits<Iterator>::
+ difference_type type;
+
+ static type call(iterator_range<Iterator> const& r)
+ {
+ return boost::detail::distance(r.begin(), r.end());
+ }
+ };
+
+ template <>
+ struct attribute_size<unused_type>
+ {
+ typedef std::size_t type;
+
+ static type call(unused_type)
+ {
+ return 0;
+ }
+ };
+
+ template <typename Attribute>
+ typename attribute_size<Attribute>::type
+ size (Attribute const& attr)
+ {
+ return attribute_size<Attribute>::call(attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // pass_attribute
+ //
+ // Determines how we pass attributes to semantic actions. This
+ // may be specialized. By default, all attributes are wrapped in
+ // a fusion sequence, because the attribute has to be treated as being
+ // a single value in any case (even if it actually already is a fusion
+ // sequence in its own).
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Component, typename Attribute, typename Enable/* = void*/>
+ struct pass_attribute
+ {
+ typedef fusion::vector1<Attribute&> type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Subclass a pass_attribute specialization from this to wrap
+ // the attribute in a tuple only IFF it is not already a fusion tuple.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Force = mpl::false_>
+ struct wrap_if_not_tuple
+ : mpl::if_<
+ fusion::traits::is_sequence<Attribute>
+ , Attribute&, fusion::vector1<Attribute&> >
+ {};
+
+ template <typename Attribute>
+ struct wrap_if_not_tuple<Attribute, mpl::true_>
+ {
+ typedef fusion::vector1<Attribute&> type;
+ };
+
+ template <>
+ struct wrap_if_not_tuple<unused_type, mpl::false_>
+ {
+ typedef unused_type type;
+ };
+
+ template <>
+ struct wrap_if_not_tuple<unused_type const, mpl::false_>
+ {
+ typedef unused_type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // build_optional
+ //
+ // Build a boost::optional from T. Return unused_type if T is unused_type.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct build_optional
+ {
+ typedef boost::optional<T> type;
+ };
+
+ template <typename T>
+ struct build_optional<boost::optional<T> >
+ {
+ typedef boost::optional<T> type;
+ };
+
+ template <>
+ struct build_optional<unused_type>
+ {
+ typedef unused_type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // build_std_vector
+ //
+ // Build a std::vector from T. Return unused_type if T is unused_type.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct build_std_vector
+ {
+ typedef std::vector<T> type;
+ };
+
+ template <>
+ struct build_std_vector<unused_type>
+ {
+ typedef unused_type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // filter_unused_attributes
+ //
+ // Remove unused_types from a sequence
+ ///////////////////////////////////////////////////////////////////////////
+
+ // Compute the list of all *used* attributes of sub-components
+ // (filter all unused attributes from the list)
+ template <typename Sequence>
+ struct filter_unused_attributes
+ : fusion::result_of::filter_if<Sequence, not_is_unused<mpl::_> >
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // sequence_attribute_transform
+ //
+ // This transform is invoked for every attribute in a sequence allowing
+ // to modify the attribute type exposed by a component to the enclosing
+ // sequence component. By default no transformation is performed.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Domain>
+ struct sequence_attribute_transform
+ : mpl::identity<Attribute>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // permutation_attribute_transform
+ //
+ // This transform is invoked for every attribute in a sequence allowing
+ // to modify the attribute type exposed by a component to the enclosing
+ // permutation component. By default a build_optional transformation is
+ // performed.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Domain>
+ struct permutation_attribute_transform
+ : traits::build_optional<Attribute>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // sequential_or_attribute_transform
+ //
+ // This transform is invoked for every attribute in a sequential_or allowing
+ // to modify the attribute type exposed by a component to the enclosing
+ // sequential_or component. By default a build_optional transformation is
+ // performed.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Domain>
+ struct sequential_or_attribute_transform
+ : traits::build_optional<Attribute>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // build_fusion_vector
+ //
+ // Build a fusion vector from a fusion sequence. All unused attributes
+ // are filtered out. If the result is empty after the removal of unused
+ // types, return unused_type. If the input sequence is an unused_type,
+ // also return unused_type.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence>
+ struct build_fusion_vector
+ {
+ // Remove all unused attributes
+ typedef typename
+ filter_unused_attributes<Sequence>::type
+ filtered_attributes;
+
+ // Build a fusion vector from a fusion sequence (Sequence),
+ // But *only if* the sequence is not empty. i.e. if the
+ // sequence is empty, our result will be unused_type.
+
+ typedef typename
+ mpl::eval_if<
+ fusion::result_of::empty<filtered_attributes>
+ , mpl::identity<unused_type>
+ , fusion::result_of::as_vector<filtered_attributes>
+ >::type
+ type;
+ };
+
+ template <>
+ struct build_fusion_vector<unused_type>
+ {
+ typedef unused_type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // build_attribute_sequence
+ //
+ // Build a fusion sequence attribute sequence from a sequence of
+ // components. Transform<T>::type is called on each element.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence, typename Context
+ , template <typename T, typename D> class Transform
+ , typename Iterator = unused_type, typename Domain = unused_type>
+ struct build_attribute_sequence
+ {
+ struct element_attribute
+ {
+ template <typename T>
+ struct result;
+
+ template <typename F, typename Element>
+ struct result<F(Element)>
+ {
+ typedef typename
+ Transform<
+ typename attribute_of<Element, Context, Iterator>::type
+ , Domain
+ >::type
+ type;
+ };
+
+ // never called, but needed for decltype-based result_of (C++0x)
+#ifndef BOOST_NO_RVALUE_REFERENCES
+ template <typename Element>
+ typename result<element_attribute(Element)>::type
+ operator()(Element&&) const;
+#endif
+ };
+
+ // Compute the list of attributes of all sub-components
+ typedef typename
+ fusion::result_of::transform<Sequence, element_attribute>::type
+ type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // has_no_unused
+ //
+ // Test if there are no unused attributes in Sequence
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence>
+ struct has_no_unused
+ : is_same<
+ typename mpl::find_if<Sequence, is_same<mpl::_, unused_type> >::type
+ , typename mpl::end<Sequence>::type>
+ {};
+
+ namespace detail
+ {
+ template <typename Sequence, bool no_unused
+ , int size = mpl::size<Sequence>::value>
+ struct build_collapsed_variant;
+
+ // N element case, no unused
+ template <typename Sequence, int size>
+ struct build_collapsed_variant<Sequence, true, size>
+ : spirit::detail::as_variant<Sequence> {};
+
+ // N element case with unused
+ template <typename Sequence, int size>
+ struct build_collapsed_variant<Sequence, false, size>
+ {
+ typedef boost::optional<
+ typename spirit::detail::as_variant<
+ typename fusion::result_of::pop_front<Sequence>::type
+ >::type
+ > type;
+ };
+
+ // 1 element case, no unused
+ template <typename Sequence>
+ struct build_collapsed_variant<Sequence, true, 1>
+ : mpl::front<Sequence> {};
+
+ // 1 element case, with unused
+ template <typename Sequence>
+ struct build_collapsed_variant<Sequence, false, 1>
+ : mpl::front<Sequence> {};
+
+ // 2 element case, no unused
+ template <typename Sequence>
+ struct build_collapsed_variant<Sequence, true, 2>
+ : spirit::detail::as_variant<Sequence> {};
+
+ // 2 element case, with unused
+ template <typename Sequence>
+ struct build_collapsed_variant<Sequence, false, 2>
+ {
+ typedef boost::optional<
+ typename mpl::deref<
+ typename mpl::next<
+ typename mpl::begin<Sequence>::type
+ >::type
+ >::type
+ >
+ type;
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // alternative_attribute_transform
+ //
+ // This transform is invoked for every attribute in an alternative allowing
+ // to modify the attribute type exposed by a component to the enclosing
+ // alternative component. By default no transformation is performed.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Domain>
+ struct alternative_attribute_transform
+ : mpl::identity<Attribute>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // build_variant
+ //
+ // Build a boost::variant from a fusion sequence. build_variant makes sure
+ // that 1) all attributes in the variant are unique 2) puts the unused
+ // attribute, if there is any, to the front and 3) collapses single element
+ // variants, variant<T> to T.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence>
+ struct build_variant
+ {
+ // Remove all unused attributes.
+ typedef typename
+ filter_unused_attributes<Sequence>::type
+ filtered_attributes;
+
+ typedef has_no_unused<Sequence> no_unused;
+
+ // If the original attribute list does not contain any unused
+ // attributes, it is used, otherwise a single unused_type is
+ // pushed to the front of the list. This is to make sure that if
+ // there is an unused_type in the list, it is the first one.
+ typedef typename
+ mpl::eval_if<
+ no_unused,
+ mpl::identity<Sequence>,
+ fusion::result_of::push_front<filtered_attributes, unused_type>
+ >::type
+ attribute_sequence;
+
+ // Make sure each of the types occur only once in the type list
+ typedef typename
+ mpl::fold<
+ attribute_sequence, mpl::vector<>,
+ mpl::if_<
+ mpl::contains<mpl::_1, mpl::_2>,
+ mpl::_1, mpl::push_back<mpl::_1, mpl::_2>
+ >
+ >::type
+ no_duplicates;
+
+ // If there is only one type in the list of types we strip off the
+ // variant. IOTW, collapse single element variants, variant<T> to T.
+ // Take note that this also collapses variant<unused_type, T> to T.
+ typedef typename
+ traits::detail::build_collapsed_variant<
+ no_duplicates, no_unused::value>::type
+ type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // transform_attribute
+ //
+ // Sometimes the user needs to transform the attribute types for certain
+ // attributes. This template can be used as a customization point, where
+ // the user is able specify specific transformation rules for any attribute
+ // type.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Exposed, typename Transformed, typename Domain
+ , typename Enable/* = void*/>
+ struct transform_attribute;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Domain, typename Transformed, typename Exposed>
+ typename spirit::result_of::pre_transform<Exposed, Transformed, Domain>::type
+ pre_transform(Exposed& attr BOOST_PROTO_DISABLE_IF_IS_CONST(Exposed))
+ {
+ return transform_attribute<Exposed, Transformed, Domain>::pre(attr);
+ }
+
+ template <typename Domain, typename Transformed, typename Exposed>
+ typename spirit::result_of::pre_transform<Exposed const, Transformed, Domain>::type
+ pre_transform(Exposed const& attr)
+ {
+ return transform_attribute<Exposed const, Transformed, Domain>::pre(attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // make_attribute
+ //
+ // All parsers and generators have specific attribute types.
+ // Spirit parsers and generators are passed an attribute; these are either
+ // references to the expected type, or an unused_type -- to flag that we do
+ // not care about the attribute. For semantic actions, however, we need to
+ // have a real value to pass to the semantic action. If the client did not
+ // provide one, we will have to synthesize the value. This class takes care
+ // of that. *Note that this behavior has changed. From Boost 1.47, semantic
+ // actions always take in the passed attribute as-is if the PP constant:
+ // BOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT is defined.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename ActualAttribute>
+ struct make_attribute
+ {
+ typedef typename remove_const<Attribute>::type attribute_type;
+ typedef typename
+ mpl::if_<
+ is_same<typename remove_const<ActualAttribute>::type, unused_type>
+ , attribute_type
+ , ActualAttribute&>::type
+ type;
+
+ typedef typename
+ mpl::if_<
+ is_same<typename remove_const<ActualAttribute>::type, unused_type>
+ , attribute_type
+ , ActualAttribute>::type
+ value_type;
+
+ static Attribute call(unused_type)
+ {
+ // synthesize the attribute/parameter
+ return boost::get(value_initialized<attribute_type>());
+ }
+
+ template <typename T>
+ static T& call(T& value)
+ {
+ return value; // just pass the one provided
+ }
+ };
+
+ template <typename Attribute, typename ActualAttribute>
+ struct make_attribute<Attribute&, ActualAttribute>
+ : make_attribute<Attribute, ActualAttribute>
+ {};
+
+ template <typename Attribute, typename ActualAttribute>
+ struct make_attribute<Attribute const&, ActualAttribute>
+ : make_attribute<Attribute const, ActualAttribute>
+ {};
+
+ template <typename ActualAttribute>
+ struct make_attribute<unused_type, ActualAttribute>
+ {
+ typedef unused_type type;
+ typedef unused_type value_type;
+ static unused_type call(unused_type)
+ {
+ return unused;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // swap_impl
+ //
+ // Swap (with proper handling of unused_types)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename A, typename B>
+ void swap_impl(A& a, B& b)
+ {
+ A temp = a;
+ a = b;
+ b = temp;
+ }
+
+ template <typename T>
+ void swap_impl(T& a, T& b)
+ {
+ using namespace std;
+ swap(a, b);
+ }
+
+ template <typename A>
+ void swap_impl(A&, unused_type)
+ {
+ }
+
+ template <typename A>
+ void swap_impl(unused_type, A&)
+ {
+ }
+
+ inline void swap_impl(unused_type, unused_type)
+ {
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Strips single element fusion vectors into its 'naked'
+ // form: vector<T> --> T
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct strip_single_element_vector
+ {
+ typedef T type;
+ };
+
+ template <typename T>
+ struct strip_single_element_vector<fusion::vector1<T> >
+ {
+ typedef T type;
+ };
+
+ template <typename T>
+ struct strip_single_element_vector<fusion::vector<T> >
+ {
+ typedef T type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // meta function to return whether the argument is a one element fusion
+ // sequence
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T
+ , bool IsFusionSeq = fusion::traits::is_sequence<T>::value
+ , bool IsProtoExpr = proto::is_expr<T>::value>
+ struct one_element_sequence
+ : mpl::false_
+ {};
+
+ template <typename T>
+ struct one_element_sequence<T, true, false>
+ : mpl::bool_<mpl::size<T>::value == 1>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // clear
+ //
+ // Clear data efficiently
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ void clear(T& val);
+
+ namespace detail
+ {
+ // this is used by the variant and fusion sequence dispatch
+ struct clear_visitor : static_visitor<>
+ {
+ template <typename T>
+ void operator()(T& val) const
+ {
+ spirit::traits::clear(val);
+ }
+ };
+
+ // default
+ template <typename T>
+ void clear_impl2(T& val, mpl::false_)
+ {
+ val = T();
+ }
+
+ // for fusion sequences
+ template <typename T>
+ void clear_impl2(T& val, mpl::true_)
+ {
+ fusion::for_each(val, clear_visitor());
+ }
+
+ // dispatch default or fusion sequence
+ template <typename T>
+ void clear_impl(T& val, mpl::false_)
+ {
+ clear_impl2(val, fusion::traits::is_sequence<T>());
+ }
+
+ // STL containers
+ template <typename T>
+ void clear_impl(T& val, mpl::true_)
+ {
+ val.clear();
+ }
+ }
+
+ template <typename T, typename Enable/* = void*/>
+ struct clear_value
+ {
+ static void call(T& val)
+ {
+ detail::clear_impl(val, typename is_container<T>::type());
+ }
+ };
+
+ // optionals
+ template <typename T>
+ struct clear_value<boost::optional<T> >
+ {
+ static void call(boost::optional<T>& val)
+ {
+ if (val)
+ val = none_t(); // leave optional uninitialized
+ }
+ };
+
+ // variants
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct clear_value<variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ {
+ static void call(variant<BOOST_VARIANT_ENUM_PARAMS(T)>& val)
+ {
+ apply_visitor(detail::clear_visitor(), val);
+ }
+ };
+
+ // iterator range
+ template <typename T>
+ struct clear_value<iterator_range<T> >
+ {
+ static void call(iterator_range<T>& val)
+ {
+ val = iterator_range<T>(val.end(), val.end());
+ }
+ };
+
+ // main dispatch
+ template <typename T>
+ void clear(T& val)
+ {
+ clear_value<T>::call(val);
+ }
+
+ // for unused
+ inline void clear(unused_type)
+ {
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename Out>
+ struct print_fusion_sequence
+ {
+ print_fusion_sequence(Out& out)
+ : out(out), is_first(true) {}
+
+ typedef void result_type;
+
+ template <typename T>
+ void operator()(T const& val) const
+ {
+ if (is_first)
+ is_first = false;
+ else
+ out << ", ";
+ spirit::traits::print_attribute(out, val);
+ }
+
+ Out& out;
+ mutable bool is_first;
+ };
+
+ // print elements in a variant
+ template <typename Out>
+ struct print_visitor : static_visitor<>
+ {
+ print_visitor(Out& out) : out(out) {}
+
+ template <typename T>
+ void operator()(T const& val) const
+ {
+ spirit::traits::print_attribute(out, val);
+ }
+
+ Out& out;
+ };
+ }
+
+ template <typename Out, typename T, typename Enable>
+ struct print_attribute_debug
+ {
+ // for plain data types
+ template <typename T_>
+ static void call_impl3(Out& out, T_ const& val, mpl::false_)
+ {
+ out << val;
+ }
+
+ // for fusion data types
+ template <typename T_>
+ static void call_impl3(Out& out, T_ const& val, mpl::true_)
+ {
+ out << '[';
+ fusion::for_each(val, detail::print_fusion_sequence<Out>(out));
+ out << ']';
+ }
+
+ // non-stl container
+ template <typename T_>
+ static void call_impl2(Out& out, T_ const& val, mpl::false_)
+ {
+ call_impl3(out, val, fusion::traits::is_sequence<T_>());
+ }
+
+ // stl container
+ template <typename T_>
+ static void call_impl2(Out& out, T_ const& val, mpl::true_)
+ {
+ out << '[';
+ if (!traits::is_empty(val))
+ {
+ bool first = true;
+ typename container_iterator<T_ const>::type iend = traits::end(val);
+ for (typename container_iterator<T_ const>::type i = traits::begin(val);
+ !traits::compare(i, iend); traits::next(i))
+ {
+ if (!first)
+ out << ", ";
+ first = false;
+ spirit::traits::print_attribute(out, traits::deref(i));
+ }
+ }
+ out << ']';
+ }
+
+ // for variant types
+ template <typename T_>
+ static void call_impl(Out& out, T_ const& val, mpl::false_)
+ {
+ apply_visitor(detail::print_visitor<Out>(out), val);
+ }
+
+ // for non-variant types
+ template <typename T_>
+ static void call_impl(Out& out, T_ const& val, mpl::true_)
+ {
+ call_impl2(out, val, is_container<T_>());
+ }
+
+ // main entry point
+ static void call(Out& out, T const& val)
+ {
+ call_impl(out, val, not_is_variant<T>());
+ }
+ };
+
+ template <typename Out, typename T>
+ struct print_attribute_debug<Out, boost::optional<T> >
+ {
+ static void call(Out& out, boost::optional<T> const& val)
+ {
+ if (val)
+ spirit::traits::print_attribute(out, *val);
+ else
+ out << "[empty]";
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Out, typename T>
+ inline void print_attribute(Out& out, T const& val)
+ {
+ print_attribute_debug<Out, T>::call(out, val);
+ }
+
+ template <typename Out>
+ inline void print_attribute(Out&, unused_type)
+ {
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // generate debug output for lookahead token (character) stream
+ namespace detail
+ {
+ struct token_printer_debug_for_chars
+ {
+ template<typename Out, typename Char>
+ static void print(Out& o, Char c)
+ {
+ using namespace std; // allow for ADL to find the proper iscntrl
+
+ if (c == static_cast<Char>('\a'))
+ o << "\\a";
+ else if (c == static_cast<Char>('\b'))
+ o << "\\b";
+ else if (c == static_cast<Char>('\f'))
+ o << "\\f";
+ else if (c == static_cast<Char>('\n'))
+ o << "\\n";
+ else if (c == static_cast<Char>('\r'))
+ o << "\\r";
+ else if (c == static_cast<Char>('\t'))
+ o << "\\t";
+ else if (c == static_cast<Char>('\v'))
+ o << "\\v";
+ else if (c >= 0 && c < 127 && iscntrl(c))
+ o << "\\" << std::oct << static_cast<int>(c);
+ else
+ o << static_cast<char>(c);
+ }
+ };
+
+ // for token types where the comparison with char constants wouldn't work
+ struct token_printer_debug
+ {
+ template<typename Out, typename T>
+ static void print(Out& o, T const& val)
+ {
+ o << val;
+ }
+ };
+ }
+
+ template <typename T, typename Enable>
+ struct token_printer_debug
+ : mpl::if_<
+ mpl::and_<
+ is_convertible<T, char>, is_convertible<char, T> >
+ , detail::token_printer_debug_for_chars
+ , detail::token_printer_debug>::type
+ {};
+
+ template <typename Out, typename T>
+ inline void print_token(Out& out, T const& val)
+ {
+ // allow to customize the token printer routine
+ token_printer_debug<T>::print(out, val);
+ }
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace result_of
+{
+ template <typename Exposed, typename Transformed, typename Domain>
+ struct pre_transform
+ : traits::transform_attribute<Exposed, Transformed, Domain>
+ {};
+}}}
+
+
+#endif
diff --git a/boost/spirit/home/support/attributes_fwd.hpp b/boost/spirit/home/support/attributes_fwd.hpp
new file mode 100644
index 0000000000..6086d3709d
--- /dev/null
+++ b/boost/spirit/home/support/attributes_fwd.hpp
@@ -0,0 +1,297 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+ 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)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_ATTRIBUTES_FWD_OCT_01_2009_0715AM)
+#define BOOST_SPIRIT_ATTRIBUTES_FWD_OCT_01_2009_0715AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#if (defined(__GNUC__) && (__GNUC__ < 4)) || \
+ (defined(__APPLE__) && defined(__INTEL_COMPILER))
+#include <boost/utility/enable_if.hpp>
+#endif
+#include <boost/spirit/home/support/unused.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace result_of
+{
+ // forward declaration only
+ template <typename Exposed, typename Attribute>
+ struct extract_from;
+
+ template <typename T, typename Attribute>
+ struct attribute_as;
+
+ template <typename Exposed, typename Transformed, typename Domain>
+ struct pre_transform;
+
+ template <typename T>
+ struct optional_value;
+
+ template <typename Container>
+ struct begin;
+
+ template <typename Container>
+ struct end;
+
+ template <typename Iterator>
+ struct deref;
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Find out if T can be a strong substitute for Expected attribute
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Expected, typename Enable = void>
+ struct is_substitute;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Find out if T can be a weak substitute for Expected attribute
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Expected, typename Enable = void>
+ struct is_weak_substitute;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine if T is a proxy
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable = void>
+ struct is_proxy;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Retrieve the attribute type to use from the given type
+ //
+ // This is needed to extract the correct attribute type from proxy classes
+ // as utilized in FUSION_ADAPT_ADT et. al.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Enable = void>
+ struct attribute_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Retrieve the size of a fusion sequence (compile time)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct sequence_size;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Retrieve the size of an attribute (runtime)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Enable = void>
+ struct attribute_size;
+
+ template <typename Attribute>
+ typename attribute_size<Attribute>::type
+ size(Attribute const& attr);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Determines how we pass attributes to semantic actions. This
+ // may be specialized. By default, all attributes are wrapped in
+ // a fusion sequence, because the attribute has to be treated as being
+ // a single value in any case (even if it actually already is a fusion
+ // sequence in its own).
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Component, typename Attribute, typename Enable = void>
+ struct pass_attribute;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable = void>
+ struct optional_attribute;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Sometimes the user needs to transform the attribute types for certain
+ // attributes. This template can be used as a customization point, where
+ // the user is able specify specific transformation rules for any attribute
+ // type.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Exposed, typename Transformed, typename Domain
+ , typename Enable = void>
+ struct transform_attribute;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Qi only
+ template <typename Attribute, typename Iterator, typename Enable = void>
+ struct assign_to_attribute_from_iterators;
+
+ template <typename Iterator, typename Attribute>
+ void assign_to(Iterator const& first, Iterator const& last, Attribute& attr);
+
+ template <typename Iterator>
+ void assign_to(Iterator const&, Iterator const&, unused_type);
+
+ template <typename Attribute, typename T, typename Enable = void>
+ struct assign_to_attribute_from_value;
+
+ template <typename Attribute, typename T, typename Enable = void>
+ struct assign_to_container_from_value;
+
+ template <typename T, typename Attribute>
+ void assign_to(T const& val, Attribute& attr);
+
+ template <typename T>
+ void assign_to(T const&, unused_type);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Karma only
+ template <typename Attribute, typename Exposed, typename Enable = void>
+ struct extract_from_attribute;
+
+ template <typename Attribute, typename Exposed, typename Enable = void>
+ struct extract_from_container;
+
+ template <typename Exposed, typename Attribute, typename Context>
+ typename spirit::result_of::extract_from<Exposed, Attribute>::type
+ extract_from(Attribute const& attr, Context& ctx
+#if (defined(__GNUC__) && (__GNUC__ < 4)) || \
+ (defined(__APPLE__) && defined(__INTEL_COMPILER))
+ , typename enable_if<traits::not_is_unused<Attribute> >::type* = NULL
+#endif
+ );
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Karma only
+ template <typename T, typename Attribute, typename Enable = void>
+ struct attribute_as;
+
+ template <typename T, typename Attribute>
+ typename spirit::result_of::attribute_as<T, Attribute>::type
+ as(Attribute const& attr);
+
+ template <typename T, typename Attribute>
+ bool valid_as(Attribute const& attr);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // return the type currently stored in the given variant
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable = void>
+ struct variant_which;
+
+ template <typename T>
+ int which(T const& v);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine, whether T is a variant like type
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Domain = unused_type, typename Enable = void>
+ struct not_is_variant;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine, whether T is a variant like type
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Domain = unused_type, typename Enable = void>
+ struct not_is_optional;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Clear data efficiently
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable = void>
+ struct clear_value;
+
+ ///////////////////////////////////////////////////////////////////////
+ // Determine the value type of the given container type
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Container, typename Enable = void>
+ struct container_value;
+
+ template <typename Container, typename Enable = void>
+ struct container_iterator;
+
+ template <typename T, typename Enable = void>
+ struct is_container;
+
+ template <typename T, typename Enable = void>
+ struct is_iterator_range;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Attribute, typename Context = unused_type
+ , typename Iterator = unused_type, typename Enable = void>
+ struct handles_container;
+
+ template <typename Container, typename ValueType, typename Attribute
+ , typename Sequence, typename Domain, typename Enable = void>
+ struct pass_through_container;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Qi only
+ template <typename Container, typename T, typename Enable = void>
+ struct push_back_container;
+
+ template <typename Container, typename Enable = void>
+ struct is_empty_container;
+
+ template <typename Container, typename Enable = void>
+ struct make_container_attribute;
+
+ ///////////////////////////////////////////////////////////////////////
+ // Determine the iterator type of the given container type
+ // Karma only
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Container, typename Enable = void>
+ struct begin_container;
+
+ template <typename Container, typename Enable = void>
+ struct end_container;
+
+ template <typename Iterator, typename Enable = void>
+ struct deref_iterator;
+
+ template <typename Iterator, typename Enable = void>
+ struct next_iterator;
+
+ template <typename Iterator, typename Enable = void>
+ struct compare_iterators;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Print the given attribute of type T to the stream given as Out
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Out, typename T, typename Enable = void>
+ struct print_attribute_debug;
+
+ template <typename Out, typename T>
+ void print_attribute(Out&, T const&);
+
+ template <typename Out>
+ void print_attribute(Out&, unused_type);
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char, typename Enable = void>
+ struct token_printer_debug;
+
+ template<typename Out, typename T>
+ void print_token(Out&, T const&);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Access attributes from a karma symbol table
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Attribute, typename Enable = void>
+ struct symbols_lookup;
+
+ template <typename Attribute, typename T, typename Enable = void>
+ struct symbols_value;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // transform attribute types exposed from compound operator components
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Domain>
+ struct alternative_attribute_transform;
+
+ template <typename Attribute, typename Domain>
+ struct sequence_attribute_transform;
+
+ template <typename Attribute, typename Domain>
+ struct permutation_attribute_transform;
+
+ template <typename Attribute, typename Domain>
+ struct sequential_or_attribute_transform;
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/auto/meta_create.hpp b/boost/spirit/home/support/auto/meta_create.hpp
new file mode 100644
index 0000000000..3734c86b87
--- /dev/null
+++ b/boost/spirit/home/support/auto/meta_create.hpp
@@ -0,0 +1,212 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_SUPPORT_META_CREATE_NOV_21_2009_0327PM)
+#define BOOST_SPIRIT_SUPPORT_META_CREATE_NOV_21_2009_0327PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+
+#include <boost/version.hpp>
+#include <boost/spirit/include/phoenix_limits.hpp> // needs to be included before proto
+#include <boost/proto/proto.hpp>
+#include <boost/utility/result_of.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/fusion/include/fold.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+
+// needed for workaround below
+#if defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ < 3))
+#include <boost/type_traits/is_same.hpp>
+#endif
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This is the main dispatch point for meta_create to the correct domain
+ template <typename Domain, typename T, typename Enable = void>
+ struct meta_create;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This allows to query whether a valid mapping exists for the given data
+ // type to a component in the given domain
+ template <typename Domain, typename T, typename Enable = void>
+ struct meta_create_exists : mpl::false_ {};
+}}}
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T>
+ struct add_const_ref
+ : add_reference<typename add_const<T>::type> {};
+
+ template <typename T>
+ struct remove_const_ref
+ : remove_const<typename remove_reference<T>::type> {};
+
+// starting with Boost V1.42 fusion::fold has been changed to be compatible
+// with mpl::fold (the sequence of template parameters for the meta-function
+// object has been changed)
+#if BOOST_VERSION < 104200
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OpTag, typename Domain>
+ struct nary_proto_expr_function
+ {
+ template <typename T>
+ struct result;
+
+// this is a workaround for older versions of g++ (< V4.3) which apparently have
+// problems with the following template specialization
+#if defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ < 3))
+ template <typename F, typename T1, typename T2>
+ struct result<F(T1, T2)>
+ {
+ BOOST_STATIC_ASSERT((is_same<F, nary_proto_expr_function>::value));
+#else
+ template <typename T1, typename T2>
+ struct result<nary_proto_expr_function(T1, T2)>
+ {
+#endif
+ typedef typename remove_const_ref<T2>::type left_type;
+ typedef typename
+ spirit::traits::meta_create<Domain, T1>::type
+ right_type;
+
+ typedef typename mpl::eval_if<
+ traits::not_is_unused<left_type>
+ , proto::result_of::make_expr<OpTag, left_type, right_type>
+ , mpl::identity<right_type>
+ >::type type;
+ };
+
+ template <typename T>
+ typename result<nary_proto_expr_function(T, unused_type const&)>::type
+ operator()(T, unused_type const&) const
+ {
+ typedef spirit::traits::meta_create<Domain, T> right_type;
+ return right_type::call();
+ }
+
+ template <typename T1, typename T2>
+ typename result<nary_proto_expr_function(T1, T2)>::type
+ operator()(T1, T2 const& t2) const
+ {
+ // we variants to the alternative operator
+ typedef spirit::traits::meta_create<Domain, T1> right_type;
+ return proto::make_expr<OpTag>(t2, right_type::call());
+ }
+ };
+#else
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OpTag, typename Domain>
+ struct nary_proto_expr_function
+ {
+ template <typename T>
+ struct result;
+
+// this is a workaround for older versions of g++ (< V4.3) which apparently have
+// problems with the following template specialization
+#if defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ < 3))
+ template <typename F, typename T1, typename T2>
+ struct result<F(T1, T2)>
+ {
+ BOOST_STATIC_ASSERT((is_same<F, nary_proto_expr_function>::value));
+#else
+ template <typename T1, typename T2>
+ struct result<nary_proto_expr_function(T1, T2)>
+ {
+#endif
+ typedef typename remove_const_ref<T1>::type left_type;
+ typedef typename
+ spirit::traits::meta_create<Domain, T2>::type
+ right_type;
+
+ typedef typename mpl::eval_if<
+ traits::not_is_unused<left_type>
+ , proto::result_of::make_expr<OpTag, left_type, right_type>
+ , mpl::identity<right_type>
+ >::type type;
+ };
+
+ template <typename T>
+ typename result<nary_proto_expr_function(unused_type const&, T)>::type
+ operator()(unused_type const&, T) const
+ {
+ typedef spirit::traits::meta_create<Domain, T> right_type;
+ return right_type::call();
+ }
+
+ template <typename T1, typename T2>
+ typename result<nary_proto_expr_function(T1, T2)>::type
+ operator()(T1 const& t1, T2) const
+ {
+ // we variants to the alternative operator
+ typedef spirit::traits::meta_create<Domain, T2> right_type;
+ return proto::make_expr<OpTag>(t1, right_type::call());
+ }
+ };
+#endif
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T, typename OpTag, typename Domain>
+ struct make_unary_proto_expr
+ {
+ typedef spirit::traits::meta_create<Domain, T> subject_type;
+
+ typedef typename proto::result_of::make_expr<
+ OpTag, typename subject_type::type
+ >::type type;
+
+ static type call()
+ {
+ return proto::make_expr<OpTag>(subject_type::call());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence, typename OpTag, typename Domain>
+ struct make_nary_proto_expr
+ {
+ typedef detail::nary_proto_expr_function<OpTag, Domain>
+ make_proto_expr;
+
+ typedef typename fusion::result_of::fold<
+ Sequence, unused_type, make_proto_expr
+ >::type type;
+
+ static type call()
+ {
+ return fusion::fold(Sequence(), unused, make_proto_expr());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ // Starting with newer versions of Proto, all Proto expressions are at
+ // the same time Fusion sequences. This is the correct behavior, but
+ // we need to distinguish between Fusion sequences and Proto
+ // expressions. This meta-function does exactly that.
+ template <typename T>
+ struct is_fusion_sequence_but_not_proto_expr
+ : mpl::and_<
+ fusion::traits::is_sequence<T>
+ , mpl::not_<proto::is_expr<T> > >
+ {};
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/support/auxiliary/attr_cast.hpp b/boost/spirit/home/support/auxiliary/attr_cast.hpp
new file mode 100644
index 0000000000..89b52cd237
--- /dev/null
+++ b/boost/spirit/home/support/auxiliary/attr_cast.hpp
@@ -0,0 +1,47 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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(SPIRIT_SUPPORT_ATTR_CAST_OCT_06_2009_00535PM)
+#define SPIRIT_SUPPORT_ATTR_CAST_OCT_06_2009_00535PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This one is the function that the user can call directly in order
+ // to create a customized attr_cast component
+ template <typename Expr>
+ typename enable_if<proto::is_expr<Expr>
+ , stateful_tag_type<Expr, tag::attr_cast> >::type
+ attr_cast(Expr const& expr)
+ {
+ return stateful_tag_type<Expr, tag::attr_cast>(expr);
+ }
+
+ template <typename Exposed, typename Expr>
+ typename enable_if<proto::is_expr<Expr>
+ , stateful_tag_type<Expr, tag::attr_cast, Exposed> >::type
+ attr_cast(Expr const& expr)
+ {
+ return stateful_tag_type<Expr, tag::attr_cast, Exposed>(expr);
+ }
+
+ template <typename Exposed, typename Transformed, typename Expr>
+ typename enable_if<proto::is_expr<Expr>
+ , stateful_tag_type<Expr, tag::attr_cast, Exposed, Transformed> >::type
+ attr_cast(Expr const& expr)
+ {
+ return stateful_tag_type<Expr, tag::attr_cast, Exposed, Transformed>(expr);
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/support/char_class.hpp b/boost/spirit/home/support/char_class.hpp
new file mode 100644
index 0000000000..574a25e7c7
--- /dev/null
+++ b/boost/spirit/home/support/char_class.hpp
@@ -0,0 +1,797 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM)
+#define BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <string>
+
+#include <boost/spirit/include/phoenix_limits.hpp> // needs to be included before proto
+#include <boost/proto/proto.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/detail/is_spirit_tag.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/type_traits/make_signed.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4800) // 'int' : forcing value to bool 'true' or 'false' warning
+#endif
+
+namespace boost { namespace spirit { namespace detail
+{
+ // Here's the thing... typical encodings (except ASCII) deal with unsigned
+ // integers > 127. ASCII uses only 127. Yet, most char and wchar_t are signed.
+ // Thus, a char with value > 127 is negative (e.g. char 233 is -23). When you
+ // cast this to an unsigned int with 32 bits, you get 4294967273!
+ //
+ // The trick is to cast to an unsigned version of the source char first
+ // before casting to the target. {P.S. Don't worry about the code, the
+ // optimizer will optimize the if-else branches}
+
+ template <typename TargetChar, typename SourceChar>
+ TargetChar cast_char(SourceChar ch)
+ {
+ if (is_signed<TargetChar>::value != is_signed<SourceChar>::value)
+ {
+ if (is_signed<SourceChar>::value)
+ {
+ // source is signed, target is unsigned
+ typedef typename make_unsigned<SourceChar>::type USourceChar;
+ return TargetChar(USourceChar(ch));
+ }
+ else
+ {
+ // source is unsigned, target is signed
+ typedef typename make_signed<SourceChar>::type SSourceChar;
+ return TargetChar(SSourceChar(ch));
+ }
+ }
+ else
+ {
+ // source and target has same signedness
+ return TargetChar(ch); // just cast
+ }
+ }
+}}}
+
+namespace boost { namespace spirit { namespace tag
+{
+ struct char_ { BOOST_SPIRIT_IS_TAG() };
+ struct string { BOOST_SPIRIT_IS_TAG() };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // classification tags
+ struct alnum { BOOST_SPIRIT_IS_TAG() };
+ struct alpha { BOOST_SPIRIT_IS_TAG() };
+ struct digit { BOOST_SPIRIT_IS_TAG() };
+ struct xdigit { BOOST_SPIRIT_IS_TAG() };
+ struct cntrl { BOOST_SPIRIT_IS_TAG() };
+ struct graph { BOOST_SPIRIT_IS_TAG() };
+ struct print { BOOST_SPIRIT_IS_TAG() };
+ struct punct { BOOST_SPIRIT_IS_TAG() };
+ struct space { BOOST_SPIRIT_IS_TAG() };
+ struct blank { BOOST_SPIRIT_IS_TAG() };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // classification/conversion tags
+ struct no_case { BOOST_SPIRIT_IS_TAG() };
+ struct lower { BOOST_SPIRIT_IS_TAG() };
+ struct upper { BOOST_SPIRIT_IS_TAG() };
+ struct lowernum { BOOST_SPIRIT_IS_TAG() };
+ struct uppernum { BOOST_SPIRIT_IS_TAG() };
+ struct ucs4 { BOOST_SPIRIT_IS_TAG() };
+ struct encoding { BOOST_SPIRIT_IS_TAG() };
+
+#if defined(BOOST_SPIRIT_UNICODE)
+///////////////////////////////////////////////////////////////////////////
+// Unicode Major Categories
+///////////////////////////////////////////////////////////////////////////
+ struct letter { BOOST_SPIRIT_IS_TAG() };
+ struct mark { BOOST_SPIRIT_IS_TAG() };
+ struct number { BOOST_SPIRIT_IS_TAG() };
+ struct separator { BOOST_SPIRIT_IS_TAG() };
+ struct other { BOOST_SPIRIT_IS_TAG() };
+ struct punctuation { BOOST_SPIRIT_IS_TAG() };
+ struct symbol { BOOST_SPIRIT_IS_TAG() };
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode General Categories
+///////////////////////////////////////////////////////////////////////////
+ struct uppercase_letter { BOOST_SPIRIT_IS_TAG() };
+ struct lowercase_letter { BOOST_SPIRIT_IS_TAG() };
+ struct titlecase_letter { BOOST_SPIRIT_IS_TAG() };
+ struct modifier_letter { BOOST_SPIRIT_IS_TAG() };
+ struct other_letter { BOOST_SPIRIT_IS_TAG() };
+
+ struct nonspacing_mark { BOOST_SPIRIT_IS_TAG() };
+ struct enclosing_mark { BOOST_SPIRIT_IS_TAG() };
+ struct spacing_mark { BOOST_SPIRIT_IS_TAG() };
+
+ struct decimal_number { BOOST_SPIRIT_IS_TAG() };
+ struct letter_number { BOOST_SPIRIT_IS_TAG() };
+ struct other_number { BOOST_SPIRIT_IS_TAG() };
+
+ struct space_separator { BOOST_SPIRIT_IS_TAG() };
+ struct line_separator { BOOST_SPIRIT_IS_TAG() };
+ struct paragraph_separator { BOOST_SPIRIT_IS_TAG() };
+
+ struct control { BOOST_SPIRIT_IS_TAG() };
+ struct format { BOOST_SPIRIT_IS_TAG() };
+ struct private_use { BOOST_SPIRIT_IS_TAG() };
+ struct surrogate { BOOST_SPIRIT_IS_TAG() };
+ struct unassigned { BOOST_SPIRIT_IS_TAG() };
+
+ struct dash_punctuation { BOOST_SPIRIT_IS_TAG() };
+ struct open_punctuation { BOOST_SPIRIT_IS_TAG() };
+ struct close_punctuation { BOOST_SPIRIT_IS_TAG() };
+ struct connector_punctuation { BOOST_SPIRIT_IS_TAG() };
+ struct other_punctuation { BOOST_SPIRIT_IS_TAG() };
+ struct initial_punctuation { BOOST_SPIRIT_IS_TAG() };
+ struct final_punctuation { BOOST_SPIRIT_IS_TAG() };
+
+ struct math_symbol { BOOST_SPIRIT_IS_TAG() };
+ struct currency_symbol { BOOST_SPIRIT_IS_TAG() };
+ struct modifier_symbol { BOOST_SPIRIT_IS_TAG() };
+ struct other_symbol { BOOST_SPIRIT_IS_TAG() };
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode Derived Categories
+///////////////////////////////////////////////////////////////////////////
+ struct alphabetic { BOOST_SPIRIT_IS_TAG() };
+ struct uppercase { BOOST_SPIRIT_IS_TAG() };
+ struct lowercase { BOOST_SPIRIT_IS_TAG() };
+ struct white_space { BOOST_SPIRIT_IS_TAG() };
+ struct hex_digit { BOOST_SPIRIT_IS_TAG() };
+ struct noncharacter_code_point { BOOST_SPIRIT_IS_TAG() };
+ struct default_ignorable_code_point { BOOST_SPIRIT_IS_TAG() };
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode Scripts
+///////////////////////////////////////////////////////////////////////////
+ struct arabic { BOOST_SPIRIT_IS_TAG() };
+ struct imperial_aramaic { BOOST_SPIRIT_IS_TAG() };
+ struct armenian { BOOST_SPIRIT_IS_TAG() };
+ struct avestan { BOOST_SPIRIT_IS_TAG() };
+ struct balinese { BOOST_SPIRIT_IS_TAG() };
+ struct bamum { BOOST_SPIRIT_IS_TAG() };
+ struct bengali { BOOST_SPIRIT_IS_TAG() };
+ struct bopomofo { BOOST_SPIRIT_IS_TAG() };
+ struct braille { BOOST_SPIRIT_IS_TAG() };
+ struct buginese { BOOST_SPIRIT_IS_TAG() };
+ struct buhid { BOOST_SPIRIT_IS_TAG() };
+ struct canadian_aboriginal { BOOST_SPIRIT_IS_TAG() };
+ struct carian { BOOST_SPIRIT_IS_TAG() };
+ struct cham { BOOST_SPIRIT_IS_TAG() };
+ struct cherokee { BOOST_SPIRIT_IS_TAG() };
+ struct coptic { BOOST_SPIRIT_IS_TAG() };
+ struct cypriot { BOOST_SPIRIT_IS_TAG() };
+ struct cyrillic { BOOST_SPIRIT_IS_TAG() };
+ struct devanagari { BOOST_SPIRIT_IS_TAG() };
+ struct deseret { BOOST_SPIRIT_IS_TAG() };
+ struct egyptian_hieroglyphs { BOOST_SPIRIT_IS_TAG() };
+ struct ethiopic { BOOST_SPIRIT_IS_TAG() };
+ struct georgian { BOOST_SPIRIT_IS_TAG() };
+ struct glagolitic { BOOST_SPIRIT_IS_TAG() };
+ struct gothic { BOOST_SPIRIT_IS_TAG() };
+ struct greek { BOOST_SPIRIT_IS_TAG() };
+ struct gujarati { BOOST_SPIRIT_IS_TAG() };
+ struct gurmukhi { BOOST_SPIRIT_IS_TAG() };
+ struct hangul { BOOST_SPIRIT_IS_TAG() };
+ struct han { BOOST_SPIRIT_IS_TAG() };
+ struct hanunoo { BOOST_SPIRIT_IS_TAG() };
+ struct hebrew { BOOST_SPIRIT_IS_TAG() };
+ struct hiragana { BOOST_SPIRIT_IS_TAG() };
+ struct katakana_or_hiragana { BOOST_SPIRIT_IS_TAG() };
+ struct old_italic { BOOST_SPIRIT_IS_TAG() };
+ struct javanese { BOOST_SPIRIT_IS_TAG() };
+ struct kayah_li { BOOST_SPIRIT_IS_TAG() };
+ struct katakana { BOOST_SPIRIT_IS_TAG() };
+ struct kharoshthi { BOOST_SPIRIT_IS_TAG() };
+ struct khmer { BOOST_SPIRIT_IS_TAG() };
+ struct kannada { BOOST_SPIRIT_IS_TAG() };
+ struct kaithi { BOOST_SPIRIT_IS_TAG() };
+ struct tai_tham { BOOST_SPIRIT_IS_TAG() };
+ struct lao { BOOST_SPIRIT_IS_TAG() };
+ struct latin { BOOST_SPIRIT_IS_TAG() };
+ struct lepcha { BOOST_SPIRIT_IS_TAG() };
+ struct limbu { BOOST_SPIRIT_IS_TAG() };
+ struct linear_b { BOOST_SPIRIT_IS_TAG() };
+ struct lisu { BOOST_SPIRIT_IS_TAG() };
+ struct lycian { BOOST_SPIRIT_IS_TAG() };
+ struct lydian { BOOST_SPIRIT_IS_TAG() };
+ struct malayalam { BOOST_SPIRIT_IS_TAG() };
+ struct mongolian { BOOST_SPIRIT_IS_TAG() };
+ struct meetei_mayek { BOOST_SPIRIT_IS_TAG() };
+ struct myanmar { BOOST_SPIRIT_IS_TAG() };
+ struct nko { BOOST_SPIRIT_IS_TAG() };
+ struct ogham { BOOST_SPIRIT_IS_TAG() };
+ struct ol_chiki { BOOST_SPIRIT_IS_TAG() };
+ struct old_turkic { BOOST_SPIRIT_IS_TAG() };
+ struct oriya { BOOST_SPIRIT_IS_TAG() };
+ struct osmanya { BOOST_SPIRIT_IS_TAG() };
+ struct phags_pa { BOOST_SPIRIT_IS_TAG() };
+ struct inscriptional_pahlavi { BOOST_SPIRIT_IS_TAG() };
+ struct phoenician { BOOST_SPIRIT_IS_TAG() };
+ struct inscriptional_parthian { BOOST_SPIRIT_IS_TAG() };
+ struct rejang { BOOST_SPIRIT_IS_TAG() };
+ struct runic { BOOST_SPIRIT_IS_TAG() };
+ struct samaritan { BOOST_SPIRIT_IS_TAG() };
+ struct old_south_arabian { BOOST_SPIRIT_IS_TAG() };
+ struct saurashtra { BOOST_SPIRIT_IS_TAG() };
+ struct shavian { BOOST_SPIRIT_IS_TAG() };
+ struct sinhala { BOOST_SPIRIT_IS_TAG() };
+ struct sundanese { BOOST_SPIRIT_IS_TAG() };
+ struct syloti_nagri { BOOST_SPIRIT_IS_TAG() };
+ struct syriac { BOOST_SPIRIT_IS_TAG() };
+ struct tagbanwa { BOOST_SPIRIT_IS_TAG() };
+ struct tai_le { BOOST_SPIRIT_IS_TAG() };
+ struct new_tai_lue { BOOST_SPIRIT_IS_TAG() };
+ struct tamil { BOOST_SPIRIT_IS_TAG() };
+ struct tai_viet { BOOST_SPIRIT_IS_TAG() };
+ struct telugu { BOOST_SPIRIT_IS_TAG() };
+ struct tifinagh { BOOST_SPIRIT_IS_TAG() };
+ struct tagalog { BOOST_SPIRIT_IS_TAG() };
+ struct thaana { BOOST_SPIRIT_IS_TAG() };
+ struct thai { BOOST_SPIRIT_IS_TAG() };
+ struct tibetan { BOOST_SPIRIT_IS_TAG() };
+ struct ugaritic { BOOST_SPIRIT_IS_TAG() };
+ struct vai { BOOST_SPIRIT_IS_TAG() };
+ struct old_persian { BOOST_SPIRIT_IS_TAG() };
+ struct cuneiform { BOOST_SPIRIT_IS_TAG() };
+ struct yi { BOOST_SPIRIT_IS_TAG() };
+ struct inherited { BOOST_SPIRIT_IS_TAG() };
+ struct common { BOOST_SPIRIT_IS_TAG() };
+ struct unknown { BOOST_SPIRIT_IS_TAG() };
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This composite tag type encodes both the character
+ // set and the specific char tag (used for classification
+ // or conversion). char_code_base and char_encoding_base
+ // can be used to test for modifier membership (see modifier.hpp)
+ template <typename CharClass>
+ struct char_code_base {};
+
+ template <typename CharEncoding>
+ struct char_encoding_base {};
+
+ template <typename CharClass, typename CharEncoding>
+ struct char_code
+ : char_code_base<CharClass>, char_encoding_base<CharEncoding>
+ {
+ BOOST_SPIRIT_IS_TAG()
+ typedef CharEncoding char_encoding; // e.g. ascii
+ typedef CharClass char_class; // e.g. tag::alnum
+ };
+}}}
+
+namespace boost { namespace spirit { namespace char_class
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Test characters for classification
+ template <typename CharEncoding>
+ struct classify
+ {
+ typedef typename CharEncoding::char_type char_type;
+
+#define BOOST_SPIRIT_CLASSIFY(name, isname) \
+ template <typename Char> \
+ static bool \
+ is(tag::name, Char ch) \
+ { \
+ return CharEncoding::isname \
+ BOOST_PREVENT_MACRO_SUBSTITUTION \
+ (detail::cast_char<char_type>(ch)); \
+ } \
+ /***/
+
+ BOOST_SPIRIT_CLASSIFY(char_, ischar)
+ BOOST_SPIRIT_CLASSIFY(alnum, isalnum)
+ BOOST_SPIRIT_CLASSIFY(alpha, isalpha)
+ BOOST_SPIRIT_CLASSIFY(digit, isdigit)
+ BOOST_SPIRIT_CLASSIFY(xdigit, isxdigit)
+ BOOST_SPIRIT_CLASSIFY(cntrl, iscntrl)
+ BOOST_SPIRIT_CLASSIFY(graph, isgraph)
+ BOOST_SPIRIT_CLASSIFY(lower, islower)
+ BOOST_SPIRIT_CLASSIFY(print, isprint)
+ BOOST_SPIRIT_CLASSIFY(punct, ispunct)
+ BOOST_SPIRIT_CLASSIFY(space, isspace)
+ BOOST_SPIRIT_CLASSIFY(blank, isblank)
+ BOOST_SPIRIT_CLASSIFY(upper, isupper)
+
+#undef BOOST_SPIRIT_CLASSIFY
+
+ template <typename Char>
+ static bool
+ is(tag::lowernum, Char ch)
+ {
+ return CharEncoding::islower(detail::cast_char<char_type>(ch)) ||
+ CharEncoding::isdigit(detail::cast_char<char_type>(ch));
+ }
+
+ template <typename Char>
+ static bool
+ is(tag::uppernum, Char ch)
+ {
+ return CharEncoding::isupper(detail::cast_char<char_type>(ch)) ||
+ CharEncoding::isdigit(detail::cast_char<char_type>(ch));
+ }
+
+#if defined(BOOST_SPIRIT_UNICODE)
+
+#define BOOST_SPIRIT_UNICODE_CLASSIFY(name) \
+ template <typename Char> \
+ static bool \
+ is(tag::name, Char ch) \
+ { \
+ return CharEncoding::is_##name(detail::cast_char<char_type>(ch)); \
+ } \
+ /***/
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode Major Categories
+///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CLASSIFY(letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(mark)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(number)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(separator)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(other)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(symbol)
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode General Categories
+///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase_letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase_letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(titlecase_letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(other_letter)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY(nonspacing_mark)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(enclosing_mark)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(spacing_mark)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY(decimal_number)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(letter_number)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(other_number)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY(space_separator)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(line_separator)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(paragraph_separator)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY(control)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(format)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(private_use)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(surrogate)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(unassigned)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY(dash_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(open_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(close_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(connector_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(other_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(initial_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(final_punctuation)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY(math_symbol)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(currency_symbol)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_symbol)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(other_symbol)
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode Derived Categories
+///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CLASSIFY(alphabetic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(white_space)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(hex_digit)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(noncharacter_code_point)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(default_ignorable_code_point)
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode Scripts
+///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CLASSIFY(arabic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(imperial_aramaic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(armenian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(avestan)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(balinese)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(bamum)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(bengali)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(bopomofo)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(braille)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(buginese)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(buhid)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(canadian_aboriginal)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(carian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(cham)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(cherokee)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(coptic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(cypriot)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(cyrillic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(devanagari)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(deseret)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(egyptian_hieroglyphs)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(ethiopic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(georgian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(glagolitic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(gothic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(greek)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(gujarati)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(gurmukhi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(hangul)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(han)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(hanunoo)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(hebrew)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(hiragana)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(katakana_or_hiragana)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(old_italic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(javanese)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(kayah_li)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(katakana)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(kharoshthi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(khmer)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(kannada)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(kaithi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(tai_tham)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(lao)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(latin)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(lepcha)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(limbu)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(linear_b)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(lisu)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(lycian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(lydian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(malayalam)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(mongolian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(meetei_mayek)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(myanmar)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(nko)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(ogham)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(ol_chiki)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(old_turkic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(oriya)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(osmanya)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(phags_pa)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_pahlavi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(phoenician)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_parthian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(rejang)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(runic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(samaritan)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(old_south_arabian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(saurashtra)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(shavian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(sinhala)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(sundanese)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(syloti_nagri)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(syriac)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(tagbanwa)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(tai_le)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(new_tai_lue)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(tamil)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(tai_viet)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(telugu)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(tifinagh)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(tagalog)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(thaana)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(thai)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(tibetan)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(ugaritic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(vai)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(old_persian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(cuneiform)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(yi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(inherited)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(common)
+ BOOST_SPIRIT_UNICODE_CLASSIFY(unknown)
+
+#undef BOOST_SPIRIT_UNICODE_CLASSIFY
+#endif
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Convert characters
+ template <typename CharEncoding>
+ struct convert
+ {
+ typedef typename CharEncoding::char_type char_type;
+
+ template <typename Char>
+ static Char
+ to(tag::lower, Char ch)
+ {
+ return static_cast<Char>(
+ CharEncoding::tolower(detail::cast_char<char_type>(ch)));
+ }
+
+ template <typename Char>
+ static Char
+ to(tag::upper, Char ch)
+ {
+ return static_cast<Char>(
+ CharEncoding::toupper(detail::cast_char<char_type>(ch)));
+ }
+
+ template <typename Char>
+ static Char
+ to(tag::ucs4, Char ch)
+ {
+ return static_cast<Char>(
+ CharEncoding::toucs4(detail::cast_char<char_type>(ch)));
+ }
+
+ template <typename Char>
+ static Char
+ to(unused_type, Char ch)
+ {
+ return ch;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Info on character classification
+ template <typename CharEncoding>
+ struct what
+ {
+#define BOOST_SPIRIT_CLASSIFY_WHAT(name, isname) \
+ static char const* is(tag::name) \
+ { \
+ return isname; \
+ } \
+ /***/
+
+ BOOST_SPIRIT_CLASSIFY_WHAT(char_, "char")
+ BOOST_SPIRIT_CLASSIFY_WHAT(alnum, "alnum")
+ BOOST_SPIRIT_CLASSIFY_WHAT(alpha, "alpha")
+ BOOST_SPIRIT_CLASSIFY_WHAT(digit, "digit")
+ BOOST_SPIRIT_CLASSIFY_WHAT(xdigit, "xdigit")
+ BOOST_SPIRIT_CLASSIFY_WHAT(cntrl, "cntrl")
+ BOOST_SPIRIT_CLASSIFY_WHAT(graph, "graph")
+ BOOST_SPIRIT_CLASSIFY_WHAT(lower, "lower")
+ BOOST_SPIRIT_CLASSIFY_WHAT(lowernum, "lowernum")
+ BOOST_SPIRIT_CLASSIFY_WHAT(print, "print")
+ BOOST_SPIRIT_CLASSIFY_WHAT(punct, "punct")
+ BOOST_SPIRIT_CLASSIFY_WHAT(space, "space")
+ BOOST_SPIRIT_CLASSIFY_WHAT(blank, "blank")
+ BOOST_SPIRIT_CLASSIFY_WHAT(upper, "upper")
+ BOOST_SPIRIT_CLASSIFY_WHAT(uppernum, "uppernum")
+ BOOST_SPIRIT_CLASSIFY_WHAT(ucs4, "ucs4")
+
+#undef BOOST_SPIRIT_CLASSIFY_WHAT
+
+#if defined(BOOST_SPIRIT_UNICODE)
+
+#define BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(name) \
+ static char const* is(tag::name) \
+ { \
+ return BOOST_PP_STRINGIZE(name); \
+ } \
+ /***/
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode Major Categories
+///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mark)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(number)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(separator)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(symbol)
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode General Categories
+///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase_letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase_letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(titlecase_letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_letter)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_letter)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nonspacing_mark)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(enclosing_mark)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(spacing_mark)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(decimal_number)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter_number)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_number)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(space_separator)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(line_separator)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(paragraph_separator)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(control)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(format)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(private_use)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(surrogate)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unassigned)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(dash_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(open_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(close_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(connector_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(initial_punctuation)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(final_punctuation)
+
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(math_symbol)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(currency_symbol)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_symbol)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_symbol)
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode Derived Categories
+///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(alphabetic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(white_space)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hex_digit)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(noncharacter_code_point)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(default_ignorable_code_point)
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode Scripts
+///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(arabic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(imperial_aramaic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(armenian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(avestan)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(balinese)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bamum)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bengali)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bopomofo)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(braille)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buginese)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buhid)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(canadian_aboriginal)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(carian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cham)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cherokee)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(coptic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cypriot)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cyrillic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(devanagari)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(deseret)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(egyptian_hieroglyphs)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ethiopic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(georgian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(glagolitic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gothic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(greek)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gujarati)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gurmukhi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hangul)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(han)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hanunoo)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hebrew)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hiragana)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana_or_hiragana)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_italic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(javanese)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kayah_li)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kharoshthi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(khmer)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kannada)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kaithi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_tham)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lao)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(latin)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lepcha)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(limbu)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(linear_b)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lisu)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lycian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lydian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(malayalam)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mongolian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(meetei_mayek)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(myanmar)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nko)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ogham)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ol_chiki)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_turkic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(oriya)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(osmanya)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phags_pa)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_pahlavi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phoenician)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_parthian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(rejang)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(runic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(samaritan)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_south_arabian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(saurashtra)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(shavian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sinhala)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sundanese)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syloti_nagri)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syriac)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagbanwa)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_le)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(new_tai_lue)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tamil)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_viet)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(telugu)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tifinagh)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagalog)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thaana)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thai)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tibetan)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ugaritic)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(vai)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_persian)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cuneiform)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(yi)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inherited)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(common)
+ BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unknown)
+
+#undef BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT
+#endif
+
+ };
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This meta-function evaluates to mpl::true_ if the function
+ // char_encoding::ischar() needs to be called to ensure correct matching.
+ // This happens mainly if the character type returned from the underlying
+ // iterator is larger than the character type of the used character
+ // encoding. Additionally, this meta-function provides a customization
+ // point for the lexer library to enforce this behavior while parsing
+ // a token stream.
+ template <typename Char, typename BaseChar>
+ struct mustcheck_ischar
+ : mpl::bool_<(sizeof(Char) > sizeof(BaseChar)) ? true : false> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The following template calls char_encoding::ischar, if necessary
+ template <typename CharParam, typename CharEncoding
+ , bool MustCheck = mustcheck_ischar<
+ CharParam, typename CharEncoding::char_type>::value>
+ struct ischar
+ {
+ static bool call(CharParam)
+ {
+ return true;
+ }
+ };
+
+ template <typename CharParam, typename CharEncoding>
+ struct ischar<CharParam, CharEncoding, true>
+ {
+ static bool call(CharParam const& ch)
+ {
+ return CharEncoding::ischar(int(ch));
+ }
+ };
+
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
+
+
diff --git a/boost/spirit/home/support/char_encoding/ascii.hpp b/boost/spirit/home/support/char_encoding/ascii.hpp
new file mode 100644
index 0000000000..9b8a72fc38
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/ascii.hpp
@@ -0,0 +1,313 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_ASCII_APRIL_26_2006_1106PM)
+#define BOOST_SPIRIT_ASCII_APRIL_26_2006_1106PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <climits>
+#include <boost/assert.hpp>
+#include <boost/cstdint.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// constants used to classify the single characters
+///////////////////////////////////////////////////////////////////////////////
+#define BOOST_CC_DIGIT 0x0001
+#define BOOST_CC_XDIGIT 0x0002
+#define BOOST_CC_ALPHA 0x0004
+#define BOOST_CC_CTRL 0x0008
+#define BOOST_CC_LOWER 0x0010
+#define BOOST_CC_UPPER 0x0020
+#define BOOST_CC_SPACE 0x0040
+#define BOOST_CC_PUNCT 0x0080
+
+namespace boost { namespace spirit { namespace char_encoding
+{
+ // The detection of isgraph(), isprint() and isblank() is done programmatically
+ // to keep the character type table small. Additionally, these functions are
+ // rather seldom used and the programmatic detection is very simple.
+
+ ///////////////////////////////////////////////////////////////////////////
+ // ASCII character classification table
+ ///////////////////////////////////////////////////////////////////////////
+ const unsigned char ascii_char_types[] =
+ {
+ /* NUL 0 0 */ BOOST_CC_CTRL,
+ /* SOH 1 1 */ BOOST_CC_CTRL,
+ /* STX 2 2 */ BOOST_CC_CTRL,
+ /* ETX 3 3 */ BOOST_CC_CTRL,
+ /* EOT 4 4 */ BOOST_CC_CTRL,
+ /* ENQ 5 5 */ BOOST_CC_CTRL,
+ /* ACK 6 6 */ BOOST_CC_CTRL,
+ /* BEL 7 7 */ BOOST_CC_CTRL,
+ /* BS 8 8 */ BOOST_CC_CTRL,
+ /* HT 9 9 */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* NL 10 a */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* VT 11 b */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* NP 12 c */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* CR 13 d */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* SO 14 e */ BOOST_CC_CTRL,
+ /* SI 15 f */ BOOST_CC_CTRL,
+ /* DLE 16 10 */ BOOST_CC_CTRL,
+ /* DC1 17 11 */ BOOST_CC_CTRL,
+ /* DC2 18 12 */ BOOST_CC_CTRL,
+ /* DC3 19 13 */ BOOST_CC_CTRL,
+ /* DC4 20 14 */ BOOST_CC_CTRL,
+ /* NAK 21 15 */ BOOST_CC_CTRL,
+ /* SYN 22 16 */ BOOST_CC_CTRL,
+ /* ETB 23 17 */ BOOST_CC_CTRL,
+ /* CAN 24 18 */ BOOST_CC_CTRL,
+ /* EM 25 19 */ BOOST_CC_CTRL,
+ /* SUB 26 1a */ BOOST_CC_CTRL,
+ /* ESC 27 1b */ BOOST_CC_CTRL,
+ /* FS 28 1c */ BOOST_CC_CTRL,
+ /* GS 29 1d */ BOOST_CC_CTRL,
+ /* RS 30 1e */ BOOST_CC_CTRL,
+ /* US 31 1f */ BOOST_CC_CTRL,
+ /* SP 32 20 */ BOOST_CC_SPACE,
+ /* ! 33 21 */ BOOST_CC_PUNCT,
+ /* " 34 22 */ BOOST_CC_PUNCT,
+ /* # 35 23 */ BOOST_CC_PUNCT,
+ /* $ 36 24 */ BOOST_CC_PUNCT,
+ /* % 37 25 */ BOOST_CC_PUNCT,
+ /* & 38 26 */ BOOST_CC_PUNCT,
+ /* ' 39 27 */ BOOST_CC_PUNCT,
+ /* ( 40 28 */ BOOST_CC_PUNCT,
+ /* ) 41 29 */ BOOST_CC_PUNCT,
+ /* * 42 2a */ BOOST_CC_PUNCT,
+ /* + 43 2b */ BOOST_CC_PUNCT,
+ /* , 44 2c */ BOOST_CC_PUNCT,
+ /* - 45 2d */ BOOST_CC_PUNCT,
+ /* . 46 2e */ BOOST_CC_PUNCT,
+ /* / 47 2f */ BOOST_CC_PUNCT,
+ /* 0 48 30 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 1 49 31 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 2 50 32 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 3 51 33 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 4 52 34 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 5 53 35 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 6 54 36 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 7 55 37 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 8 56 38 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 9 57 39 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* : 58 3a */ BOOST_CC_PUNCT,
+ /* ; 59 3b */ BOOST_CC_PUNCT,
+ /* < 60 3c */ BOOST_CC_PUNCT,
+ /* = 61 3d */ BOOST_CC_PUNCT,
+ /* > 62 3e */ BOOST_CC_PUNCT,
+ /* ? 63 3f */ BOOST_CC_PUNCT,
+ /* @ 64 40 */ BOOST_CC_PUNCT,
+ /* A 65 41 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* B 66 42 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* C 67 43 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* D 68 44 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* E 69 45 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* F 70 46 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* G 71 47 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* H 72 48 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* I 73 49 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* J 74 4a */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* K 75 4b */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* L 76 4c */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* M 77 4d */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* N 78 4e */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* O 79 4f */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* P 80 50 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Q 81 51 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* R 82 52 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* S 83 53 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* T 84 54 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* U 85 55 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* V 86 56 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* W 87 57 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* X 88 58 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Y 89 59 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Z 90 5a */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* [ 91 5b */ BOOST_CC_PUNCT,
+ /* \ 92 5c */ BOOST_CC_PUNCT,
+ /* ] 93 5d */ BOOST_CC_PUNCT,
+ /* ^ 94 5e */ BOOST_CC_PUNCT,
+ /* _ 95 5f */ BOOST_CC_PUNCT,
+ /* ` 96 60 */ BOOST_CC_PUNCT,
+ /* a 97 61 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* b 98 62 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* c 99 63 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* d 100 64 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* e 101 65 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* f 102 66 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* g 103 67 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* h 104 68 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* i 105 69 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* j 106 6a */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* k 107 6b */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* l 108 6c */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* m 109 6d */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* n 110 6e */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* o 111 6f */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* p 112 70 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* q 113 71 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* r 114 72 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* s 115 73 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* t 116 74 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* u 117 75 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* v 118 76 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* w 119 77 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* x 120 78 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* y 121 79 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* z 122 7a */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* { 123 7b */ BOOST_CC_PUNCT,
+ /* | 124 7c */ BOOST_CC_PUNCT,
+ /* } 125 7d */ BOOST_CC_PUNCT,
+ /* ~ 126 7e */ BOOST_CC_PUNCT,
+ /* DEL 127 7f */ BOOST_CC_CTRL,
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Test characters for specified conditions (using ASCII)
+ ///////////////////////////////////////////////////////////////////////////
+ struct ascii
+ {
+ typedef char char_type;
+
+ static bool
+ isascii_(int ch)
+ {
+ return 0 == (ch & ~0x7f);
+ }
+
+ static bool
+ ischar(int ch)
+ {
+ return isascii_(ch);
+ }
+
+ static int
+ isalnum(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_ALPHA)
+ || (ascii_char_types[ch] & BOOST_CC_DIGIT);
+ }
+
+ static int
+ isalpha(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_ALPHA);
+ }
+
+ static int
+ isdigit(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_DIGIT);
+ }
+
+ static int
+ isxdigit(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_XDIGIT);
+ }
+
+ static int
+ iscntrl(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_CTRL);
+ }
+
+ static int
+ isgraph(int ch)
+ {
+ return ('\x21' <= ch && ch <= '\x7e');
+ }
+
+ static int
+ islower(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_LOWER);
+ }
+
+ static int
+ isprint(int ch)
+ {
+ return ('\x20' <= ch && ch <= '\x7e');
+ }
+
+ static int
+ ispunct(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_PUNCT);
+ }
+
+ static int
+ isspace(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_SPACE);
+ }
+
+ static int
+ isblank BOOST_PREVENT_MACRO_SUBSTITUTION (int ch)
+ {
+ return ('\x09' == ch || '\x20' == ch);
+ }
+
+ static int
+ isupper(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return (ascii_char_types[ch] & BOOST_CC_UPPER);
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ // Simple character conversions
+ ///////////////////////////////////////////////////////////////////////
+
+ static int
+ tolower(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return isupper(ch) ? (ch - 'A' + 'a') : ch;
+ }
+
+ static int
+ toupper(int ch)
+ {
+ BOOST_ASSERT(isascii_(ch));
+ return islower(ch) ? (ch - 'a' + 'A') : ch;
+ }
+
+ static ::boost::uint32_t
+ toucs4(int ch)
+ {
+ return ch;
+ }
+ };
+
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// undefine macros
+///////////////////////////////////////////////////////////////////////////////
+#undef BOOST_CC_DIGIT
+#undef BOOST_CC_XDIGIT
+#undef BOOST_CC_ALPHA
+#undef BOOST_CC_CTRL
+#undef BOOST_CC_LOWER
+#undef BOOST_CC_UPPER
+#undef BOOST_CC_PUNCT
+#undef BOOST_CC_SPACE
+
+#endif
+
diff --git a/boost/spirit/home/support/char_encoding/iso8859_1.hpp b/boost/spirit/home/support/char_encoding/iso8859_1.hpp
new file mode 100644
index 0000000000..37d2e6f98f
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/iso8859_1.hpp
@@ -0,0 +1,711 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_ISO8859_1_APRIL_26_2006_1106PM)
+#define BOOST_SPIRIT_ISO8859_1_APRIL_26_2006_1106PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <climits>
+#include <boost/assert.hpp>
+#include <boost/cstdint.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// constants used to classify the single characters
+///////////////////////////////////////////////////////////////////////////////
+#define BOOST_CC_DIGIT 0x0001
+#define BOOST_CC_XDIGIT 0x0002
+#define BOOST_CC_ALPHA 0x0004
+#define BOOST_CC_CTRL 0x0008
+#define BOOST_CC_LOWER 0x0010
+#define BOOST_CC_UPPER 0x0020
+#define BOOST_CC_SPACE 0x0040
+#define BOOST_CC_PUNCT 0x0080
+
+namespace boost { namespace spirit { namespace char_encoding
+{
+ // The detection of isgraph(), isprint() and isblank() is done programmatically
+ // to keep the character type table small. Additionally, these functions are
+ // rather seldom used and the programmatic detection is very simple.
+
+ ///////////////////////////////////////////////////////////////////////////
+ // ISO 8859-1 character classification table
+ //
+ // the comments intentionally contain non-ascii characters
+ // boostinspect:noascii
+ ///////////////////////////////////////////////////////////////////////////
+ const unsigned char iso8859_1_char_types[] =
+ {
+ /* NUL 0 0 */ BOOST_CC_CTRL,
+ /* SOH 1 1 */ BOOST_CC_CTRL,
+ /* STX 2 2 */ BOOST_CC_CTRL,
+ /* ETX 3 3 */ BOOST_CC_CTRL,
+ /* EOT 4 4 */ BOOST_CC_CTRL,
+ /* ENQ 5 5 */ BOOST_CC_CTRL,
+ /* ACK 6 6 */ BOOST_CC_CTRL,
+ /* BEL 7 7 */ BOOST_CC_CTRL,
+ /* BS 8 8 */ BOOST_CC_CTRL,
+ /* HT 9 9 */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* NL 10 a */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* VT 11 b */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* NP 12 c */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* CR 13 d */ BOOST_CC_CTRL|BOOST_CC_SPACE,
+ /* SO 14 e */ BOOST_CC_CTRL,
+ /* SI 15 f */ BOOST_CC_CTRL,
+ /* DLE 16 10 */ BOOST_CC_CTRL,
+ /* DC1 17 11 */ BOOST_CC_CTRL,
+ /* DC2 18 12 */ BOOST_CC_CTRL,
+ /* DC3 19 13 */ BOOST_CC_CTRL,
+ /* DC4 20 14 */ BOOST_CC_CTRL,
+ /* NAK 21 15 */ BOOST_CC_CTRL,
+ /* SYN 22 16 */ BOOST_CC_CTRL,
+ /* ETB 23 17 */ BOOST_CC_CTRL,
+ /* CAN 24 18 */ BOOST_CC_CTRL,
+ /* EM 25 19 */ BOOST_CC_CTRL,
+ /* SUB 26 1a */ BOOST_CC_CTRL,
+ /* ESC 27 1b */ BOOST_CC_CTRL,
+ /* FS 28 1c */ BOOST_CC_CTRL,
+ /* GS 29 1d */ BOOST_CC_CTRL,
+ /* RS 30 1e */ BOOST_CC_CTRL,
+ /* US 31 1f */ BOOST_CC_CTRL,
+ /* SP 32 20 */ BOOST_CC_SPACE,
+ /* ! 33 21 */ BOOST_CC_PUNCT,
+ /* " 34 22 */ BOOST_CC_PUNCT,
+ /* # 35 23 */ BOOST_CC_PUNCT,
+ /* $ 36 24 */ BOOST_CC_PUNCT,
+ /* % 37 25 */ BOOST_CC_PUNCT,
+ /* & 38 26 */ BOOST_CC_PUNCT,
+ /* ' 39 27 */ BOOST_CC_PUNCT,
+ /* ( 40 28 */ BOOST_CC_PUNCT,
+ /* ) 41 29 */ BOOST_CC_PUNCT,
+ /* * 42 2a */ BOOST_CC_PUNCT,
+ /* + 43 2b */ BOOST_CC_PUNCT,
+ /* , 44 2c */ BOOST_CC_PUNCT,
+ /* - 45 2d */ BOOST_CC_PUNCT,
+ /* . 46 2e */ BOOST_CC_PUNCT,
+ /* / 47 2f */ BOOST_CC_PUNCT,
+ /* 0 48 30 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 1 49 31 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 2 50 32 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 3 51 33 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 4 52 34 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 5 53 35 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 6 54 36 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 7 55 37 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 8 56 38 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* 9 57 39 */ BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
+ /* : 58 3a */ BOOST_CC_PUNCT,
+ /* ; 59 3b */ BOOST_CC_PUNCT,
+ /* < 60 3c */ BOOST_CC_PUNCT,
+ /* = 61 3d */ BOOST_CC_PUNCT,
+ /* > 62 3e */ BOOST_CC_PUNCT,
+ /* ? 63 3f */ BOOST_CC_PUNCT,
+ /* @ 64 40 */ BOOST_CC_PUNCT,
+ /* A 65 41 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* B 66 42 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* C 67 43 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* D 68 44 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* E 69 45 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* F 70 46 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
+ /* G 71 47 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* H 72 48 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* I 73 49 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* J 74 4a */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* K 75 4b */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* L 76 4c */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* M 77 4d */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* N 78 4e */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* O 79 4f */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* P 80 50 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Q 81 51 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* R 82 52 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* S 83 53 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* T 84 54 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* U 85 55 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* V 86 56 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* W 87 57 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* X 88 58 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Y 89 59 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Z 90 5a */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* [ 91 5b */ BOOST_CC_PUNCT,
+ /* \ 92 5c */ BOOST_CC_PUNCT,
+ /* ] 93 5d */ BOOST_CC_PUNCT,
+ /* ^ 94 5e */ BOOST_CC_PUNCT,
+ /* _ 95 5f */ BOOST_CC_PUNCT,
+ /* ` 96 60 */ BOOST_CC_PUNCT,
+ /* a 97 61 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* b 98 62 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* c 99 63 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* d 100 64 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* e 101 65 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* f 102 66 */ BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
+ /* g 103 67 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* h 104 68 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* i 105 69 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* j 106 6a */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* k 107 6b */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* l 108 6c */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* m 109 6d */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* n 110 6e */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* o 111 6f */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* p 112 70 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* q 113 71 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* r 114 72 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* s 115 73 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* t 116 74 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* u 117 75 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* v 118 76 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* w 119 77 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* x 120 78 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* y 121 79 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* z 122 7a */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* { 123 7b */ BOOST_CC_PUNCT,
+ /* | 124 7c */ BOOST_CC_PUNCT,
+ /* } 125 7d */ BOOST_CC_PUNCT,
+ /* ~ 126 7e */ BOOST_CC_PUNCT,
+ /* DEL 127 7f */ BOOST_CC_CTRL,
+ /* -- 128 80 */ BOOST_CC_CTRL,
+ /* -- 129 81 */ BOOST_CC_CTRL,
+ /* -- 130 82 */ BOOST_CC_CTRL,
+ /* -- 131 83 */ BOOST_CC_CTRL,
+ /* -- 132 84 */ BOOST_CC_CTRL,
+ /* -- 133 85 */ BOOST_CC_CTRL,
+ /* -- 134 86 */ BOOST_CC_CTRL,
+ /* -- 135 87 */ BOOST_CC_CTRL,
+ /* -- 136 88 */ BOOST_CC_CTRL,
+ /* -- 137 89 */ BOOST_CC_CTRL,
+ /* -- 138 8a */ BOOST_CC_CTRL,
+ /* -- 139 8b */ BOOST_CC_CTRL,
+ /* -- 140 8c */ BOOST_CC_CTRL,
+ /* -- 141 8d */ BOOST_CC_CTRL,
+ /* -- 142 8e */ BOOST_CC_CTRL,
+ /* -- 143 8f */ BOOST_CC_CTRL,
+ /* -- 144 90 */ BOOST_CC_CTRL,
+ /* -- 145 91 */ BOOST_CC_CTRL,
+ /* -- 146 92 */ BOOST_CC_CTRL,
+ /* -- 147 93 */ BOOST_CC_CTRL,
+ /* -- 148 94 */ BOOST_CC_CTRL,
+ /* -- 149 95 */ BOOST_CC_CTRL,
+ /* -- 150 96 */ BOOST_CC_CTRL,
+ /* -- 151 97 */ BOOST_CC_CTRL,
+ /* -- 152 98 */ BOOST_CC_CTRL,
+ /* -- 153 99 */ BOOST_CC_CTRL,
+ /* -- 154 9a */ BOOST_CC_CTRL,
+ /* -- 155 9b */ BOOST_CC_CTRL,
+ /* -- 156 9c */ BOOST_CC_CTRL,
+ /* -- 157 9d */ BOOST_CC_CTRL,
+ /* -- 158 9e */ BOOST_CC_CTRL,
+ /* -- 159 9f */ BOOST_CC_CTRL,
+ /* 160 a0 */ BOOST_CC_SPACE,
+ /* ¡ 161 a1 */ BOOST_CC_PUNCT,
+ /* ¢ 162 a2 */ BOOST_CC_PUNCT,
+ /* £ 163 a3 */ BOOST_CC_PUNCT,
+ /* ¤ 164 a4 */ BOOST_CC_PUNCT,
+ /* ¥ 165 a5 */ BOOST_CC_PUNCT,
+ /* ¦ 166 a6 */ BOOST_CC_PUNCT,
+ /* § 167 a7 */ BOOST_CC_PUNCT,
+ /* ¨ 168 a8 */ BOOST_CC_PUNCT,
+ /* © 169 a9 */ BOOST_CC_PUNCT,
+ /* ª 170 aa */ BOOST_CC_PUNCT,
+ /* « 171 ab */ BOOST_CC_PUNCT,
+ /* ¬ 172 ac */ BOOST_CC_PUNCT,
+ /* ­ 173 ad */ BOOST_CC_PUNCT,
+ /* ® 174 ae */ BOOST_CC_PUNCT,
+ /* ¯ 175 af */ BOOST_CC_PUNCT,
+ /* ° 176 b0 */ BOOST_CC_PUNCT,
+ /* ± 177 b1 */ BOOST_CC_PUNCT,
+ /* ² 178 b2 */ BOOST_CC_DIGIT|BOOST_CC_PUNCT,
+ /* ³ 179 b3 */ BOOST_CC_DIGIT|BOOST_CC_PUNCT,
+ /* ´ 180 b4 */ BOOST_CC_PUNCT,
+ /* µ 181 b5 */ BOOST_CC_PUNCT,
+ /* ¶ 182 b6 */ BOOST_CC_PUNCT,
+ /* · 183 b7 */ BOOST_CC_PUNCT,
+ /* ¸ 184 b8 */ BOOST_CC_PUNCT,
+ /* ¹ 185 b9 */ BOOST_CC_DIGIT|BOOST_CC_PUNCT,
+ /* º 186 ba */ BOOST_CC_PUNCT,
+ /* » 187 bb */ BOOST_CC_PUNCT,
+ /* ¼ 188 bc */ BOOST_CC_PUNCT,
+ /* ½ 189 bd */ BOOST_CC_PUNCT,
+ /* ¾ 190 be */ BOOST_CC_PUNCT,
+ /* ¿ 191 bf */ BOOST_CC_PUNCT,
+ /* À 192 c0 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Á 193 c1 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Â 194 c2 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ã 195 c3 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ä 196 c4 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Å 197 c5 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Æ 198 c6 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ç 199 c7 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* È 200 c8 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* É 201 c9 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ê 202 ca */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ë 203 cb */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ì 204 cc */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Í 205 cd */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Î 206 ce */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ï 207 cf */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ð 208 d0 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ñ 209 d1 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ò 210 d2 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ó 211 d3 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ô 212 d4 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Õ 213 d5 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ö 214 d6 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* × 215 d7 */ BOOST_CC_PUNCT,
+ /* Ø 216 d8 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ù 217 d9 */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ú 218 da */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Û 219 db */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ü 220 dc */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Ý 221 dd */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* Þ 222 de */ BOOST_CC_ALPHA|BOOST_CC_UPPER,
+ /* ß 223 df */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* à 224 e0 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* á 225 e1 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* â 226 e2 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ã 227 e3 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ä 228 e4 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* å 229 e5 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* æ 230 e6 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ç 231 e7 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* è 232 e8 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* é 233 e9 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ê 234 ea */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ë 235 eb */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ì 236 ec */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* í 237 ed */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* î 238 ee */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ï 239 ef */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ð 240 f0 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ñ 241 f1 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ò 242 f2 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ó 243 f3 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ô 244 f4 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* õ 245 f5 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ö 246 f6 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ÷ 247 f7 */ BOOST_CC_PUNCT,
+ /* ø 248 f8 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ù 249 f9 */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ú 250 fa */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* û 251 fb */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ü 252 fc */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ý 253 fd */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* þ 254 fe */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ /* ÿ 255 ff */ BOOST_CC_ALPHA|BOOST_CC_LOWER,
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // ISO 8859-1 character conversion table
+ ///////////////////////////////////////////////////////////////////////////
+ const unsigned char iso8859_1_char_conversion[] =
+ {
+ /* NUL 0 0 */ '\0',
+ /* SOH 1 1 */ '\0',
+ /* STX 2 2 */ '\0',
+ /* ETX 3 3 */ '\0',
+ /* EOT 4 4 */ '\0',
+ /* ENQ 5 5 */ '\0',
+ /* ACK 6 6 */ '\0',
+ /* BEL 7 7 */ '\0',
+ /* BS 8 8 */ '\0',
+ /* HT 9 9 */ '\0',
+ /* NL 10 a */ '\0',
+ /* VT 11 b */ '\0',
+ /* NP 12 c */ '\0',
+ /* CR 13 d */ '\0',
+ /* SO 14 e */ '\0',
+ /* SI 15 f */ '\0',
+ /* DLE 16 10 */ '\0',
+ /* DC1 17 11 */ '\0',
+ /* DC2 18 12 */ '\0',
+ /* DC3 19 13 */ '\0',
+ /* DC4 20 14 */ '\0',
+ /* NAK 21 15 */ '\0',
+ /* SYN 22 16 */ '\0',
+ /* ETB 23 17 */ '\0',
+ /* CAN 24 18 */ '\0',
+ /* EM 25 19 */ '\0',
+ /* SUB 26 1a */ '\0',
+ /* ESC 27 1b */ '\0',
+ /* FS 28 1c */ '\0',
+ /* GS 29 1d */ '\0',
+ /* RS 30 1e */ '\0',
+ /* US 31 1f */ '\0',
+ /* SP 32 20 */ '\0',
+ /* ! 33 21 */ '\0',
+ /* " 34 22 */ '\0',
+ /* # 35 23 */ '\0',
+ /* $ 36 24 */ '\0',
+ /* % 37 25 */ '\0',
+ /* & 38 26 */ '\0',
+ /* ' 39 27 */ '\0',
+ /* ( 40 28 */ '\0',
+ /* ) 41 29 */ '\0',
+ /* * 42 2a */ '\0',
+ /* + 43 2b */ '\0',
+ /* , 44 2c */ '\0',
+ /* - 45 2d */ '\0',
+ /* . 46 2e */ '\0',
+ /* / 47 2f */ '\0',
+ /* 0 48 30 */ '\0',
+ /* 1 49 31 */ '\0',
+ /* 2 50 32 */ '\0',
+ /* 3 51 33 */ '\0',
+ /* 4 52 34 */ '\0',
+ /* 5 53 35 */ '\0',
+ /* 6 54 36 */ '\0',
+ /* 7 55 37 */ '\0',
+ /* 8 56 38 */ '\0',
+ /* 9 57 39 */ '\0',
+ /* : 58 3a */ '\0',
+ /* ; 59 3b */ '\0',
+ /* < 60 3c */ '\0',
+ /* = 61 3d */ '\0',
+ /* > 62 3e */ '\0',
+ /* ? 63 3f */ '\0',
+ /* @ 64 40 */ '\0',
+ /* A 65 41 */ 'a',
+ /* B 66 42 */ 'b',
+ /* C 67 43 */ 'c',
+ /* D 68 44 */ 'd',
+ /* E 69 45 */ 'e',
+ /* F 70 46 */ 'f',
+ /* G 71 47 */ 'g',
+ /* H 72 48 */ 'h',
+ /* I 73 49 */ 'i',
+ /* J 74 4a */ 'j',
+ /* K 75 4b */ 'k',
+ /* L 76 4c */ 'l',
+ /* M 77 4d */ 'm',
+ /* N 78 4e */ 'n',
+ /* O 79 4f */ 'o',
+ /* P 80 50 */ 'p',
+ /* Q 81 51 */ 'q',
+ /* R 82 52 */ 'r',
+ /* S 83 53 */ 's',
+ /* T 84 54 */ 't',
+ /* U 85 55 */ 'u',
+ /* V 86 56 */ 'v',
+ /* W 87 57 */ 'w',
+ /* X 88 58 */ 'x',
+ /* Y 89 59 */ 'y',
+ /* Z 90 5a */ 'z',
+ /* [ 91 5b */ '\0',
+ /* \ 92 5c */ '\0',
+ /* ] 93 5d */ '\0',
+ /* ^ 94 5e */ '\0',
+ /* _ 95 5f */ '\0',
+ /* ` 96 60 */ '\0',
+ /* a 97 61 */ 'A',
+ /* b 98 62 */ 'B',
+ /* c 99 63 */ 'C',
+ /* d 100 64 */ 'D',
+ /* e 101 65 */ 'E',
+ /* f 102 66 */ 'F',
+ /* g 103 67 */ 'G',
+ /* h 104 68 */ 'H',
+ /* i 105 69 */ 'I',
+ /* j 106 6a */ 'J',
+ /* k 107 6b */ 'K',
+ /* l 108 6c */ 'L',
+ /* m 109 6d */ 'M',
+ /* n 110 6e */ 'N',
+ /* o 111 6f */ 'O',
+ /* p 112 70 */ 'P',
+ /* q 113 71 */ 'Q',
+ /* r 114 72 */ 'R',
+ /* s 115 73 */ 'S',
+ /* t 116 74 */ 'T',
+ /* u 117 75 */ 'U',
+ /* v 118 76 */ 'V',
+ /* w 119 77 */ 'W',
+ /* x 120 78 */ 'X',
+ /* y 121 79 */ 'Y',
+ /* z 122 7a */ 'Z',
+ /* { 123 7b */ '\0',
+ /* | 124 7c */ '\0',
+ /* } 125 7d */ '\0',
+ /* ~ 126 7e */ '\0',
+ /* DEL 127 7f */ '\0',
+ /* -- 128 80 */ '\0',
+ /* -- 129 81 */ '\0',
+ /* -- 130 82 */ '\0',
+ /* -- 131 83 */ '\0',
+ /* -- 132 84 */ '\0',
+ /* -- 133 85 */ '\0',
+ /* -- 134 86 */ '\0',
+ /* -- 135 87 */ '\0',
+ /* -- 136 88 */ '\0',
+ /* -- 137 89 */ '\0',
+ /* -- 138 8a */ '\0',
+ /* -- 139 8b */ '\0',
+ /* -- 140 8c */ '\0',
+ /* -- 141 8d */ '\0',
+ /* -- 142 8e */ '\0',
+ /* -- 143 8f */ '\0',
+ /* -- 144 90 */ '\0',
+ /* -- 145 91 */ '\0',
+ /* -- 146 92 */ '\0',
+ /* -- 147 93 */ '\0',
+ /* -- 148 94 */ '\0',
+ /* -- 149 95 */ '\0',
+ /* -- 150 96 */ '\0',
+ /* -- 151 97 */ '\0',
+ /* -- 152 98 */ '\0',
+ /* -- 153 99 */ '\0',
+ /* -- 154 9a */ '\0',
+ /* -- 155 9b */ '\0',
+ /* -- 156 9c */ '\0',
+ /* -- 157 9d */ '\0',
+ /* -- 158 9e */ '\0',
+ /* -- 159 9f */ '\0',
+ /* 160 a0 */ '\0',
+ /* ¡ 161 a1 */ '\0',
+ /* ¢ 162 a2 */ '\0',
+ /* £ 163 a3 */ '\0',
+ /* ¤ 164 a4 */ '\0',
+ /* ¥ 165 a5 */ '\0',
+ /* ¦ 166 a6 */ '\0',
+ /* § 167 a7 */ '\0',
+ /* ¨ 168 a8 */ '\0',
+ /* © 169 a9 */ '\0',
+ /* ª 170 aa */ '\0',
+ /* « 171 ab */ '\0',
+ /* ¬ 172 ac */ '\0',
+ /* ­ 173 ad */ '\0',
+ /* ® 174 ae */ '\0',
+ /* ¯ 175 af */ '\0',
+ /* ° 176 b0 */ '\0',
+ /* ± 177 b1 */ '\0',
+ /* ² 178 b2 */ '\0',
+ /* ³ 179 b3 */ '\0',
+ /* ´ 180 b4 */ '\0',
+ /* µ 181 b5 */ '\0',
+ /* ¶ 182 b6 */ '\0',
+ /* · 183 b7 */ '\0',
+ /* ¸ 184 b8 */ '\0',
+ /* ¹ 185 b9 */ '\0',
+ /* º 186 ba */ '\0',
+ /* » 187 bb */ '\0',
+ /* ¼ 188 bc */ '\0',
+ /* ½ 189 bd */ '\0',
+ /* ¾ 190 be */ '\0',
+ /* ¿ 191 bf */ '\0',
+ /* à 192 c0 */ 0xe0,
+ /* á 193 c1 */ 0xe1,
+ /* â 194 c2 */ 0xe2,
+ /* ã 195 c3 */ 0xe3,
+ /* ä 196 c4 */ 0xe4,
+ /* å 197 c5 */ 0xe5,
+ /* æ 198 c6 */ 0xe6,
+ /* ç 199 c7 */ 0xe7,
+ /* è 200 c8 */ 0xe8,
+ /* é 201 c9 */ 0xe9,
+ /* ê 202 ca */ 0xea,
+ /* ë 203 cb */ 0xeb,
+ /* ì 204 cc */ 0xec,
+ /* í 205 cd */ 0xed,
+ /* î 206 ce */ 0xee,
+ /* ï 207 cf */ 0xef,
+ /* ð 208 d0 */ 0xf0,
+ /* ñ 209 d1 */ 0xf1,
+ /* ò 210 d2 */ 0xf2,
+ /* ó 211 d3 */ 0xf3,
+ /* ô 212 d4 */ 0xf4,
+ /* õ 213 d5 */ 0xf5,
+ /* ö 214 d6 */ 0xf6,
+ /* × 215 d7 */ '\0',
+ /* ø 216 d8 */ 0xf8,
+ /* ù 217 d9 */ 0xf9,
+ /* ú 218 da */ 0xfa,
+ /* û 219 db */ 0xfb,
+ /* ü 220 dc */ 0xfc,
+ /* ý 221 dd */ 0xfd,
+ /* þ 222 de */ 0xfe,
+ /* ß 223 df */ '\0',
+ /* À 224 e0 */ 0xc0,
+ /* Á 225 e1 */ 0xc1,
+ /* Â 226 e2 */ 0xc2,
+ /* Ã 227 e3 */ 0xc3,
+ /* Ä 228 e4 */ 0xc4,
+ /* Å 229 e5 */ 0xc5,
+ /* Æ 230 e6 */ 0xc6,
+ /* Ç 231 e7 */ 0xc7,
+ /* È 232 e8 */ 0xc8,
+ /* É 233 e9 */ 0xc9,
+ /* Ê 234 ea */ 0xca,
+ /* Ë 235 eb */ 0xcb,
+ /* Ì 236 ec */ 0xcc,
+ /* Í 237 ed */ 0xcd,
+ /* Î 238 ee */ 0xce,
+ /* Ï 239 ef */ 0xcf,
+ /* Ð 240 f0 */ 0xd0,
+ /* Ñ 241 f1 */ 0xd1,
+ /* Ò 242 f2 */ 0xd2,
+ /* Ó 243 f3 */ 0xd3,
+ /* Ô 244 f4 */ 0xd4,
+ /* Õ 245 f5 */ 0xd5,
+ /* Ö 246 f6 */ 0xd6,
+ /* ÷ 247 f7 */ '\0',
+ /* Ø 248 f8 */ 0xd8,
+ /* Ù 249 f9 */ 0xd9,
+ /* Ú 250 fa */ 0xda,
+ /* Û 251 fb */ 0xdb,
+ /* Ü 252 fc */ 0xdc,
+ /* Ý 253 fd */ 0xdd,
+ /* Þ 254 fe */ 0xde,
+ /* ÿ 255 ff */ '\0',
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Test characters for specified conditions (using iso8859-1)
+ ///////////////////////////////////////////////////////////////////////////
+ struct iso8859_1
+ {
+ typedef unsigned char char_type;
+
+ static bool
+ isascii_(int ch)
+ {
+ return 0 == (ch & ~0x7f);
+ }
+
+ static bool
+ ischar(int ch)
+ {
+ // iso8859.1 uses all 8 bits
+ // we have to watch out for sign extensions
+ return (0 == (ch & ~0xff) || ~0 == (ch | 0xff)) ? true : false;
+ }
+
+ static int
+ isalnum(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_ALPHA)
+ || (iso8859_1_char_types[ch] & BOOST_CC_DIGIT);
+ }
+
+ static int
+ isalpha(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_ALPHA);
+ }
+
+ static int
+ isdigit(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_DIGIT);
+ }
+
+ static int
+ isxdigit(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_XDIGIT);
+ }
+
+ static int
+ iscntrl(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_CTRL);
+ }
+
+ static int
+ isgraph(int ch)
+ {
+ return ('\x21' <= ch && ch <= '\x7e') || ('\xa1' <= ch && ch <= '\xff');
+ }
+
+ static int
+ islower(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_LOWER);
+ }
+
+ static int
+ isprint(int ch)
+ {
+ return ('\x20' <= ch && ch <= '\x7e') || ('\xa0' <= ch && ch <= '\xff');
+ }
+
+ static int
+ ispunct(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_PUNCT);
+ }
+
+ static int
+ isspace(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_SPACE);
+ }
+
+ static int
+ isblank BOOST_PREVENT_MACRO_SUBSTITUTION (int ch)
+ {
+ return ('\x09' == ch || '\x20' == ch || '\xa0' == ch);
+ }
+
+ static int
+ isupper(int ch)
+ {
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
+ return (iso8859_1_char_types[ch] & BOOST_CC_UPPER);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Simple character conversions
+ ///////////////////////////////////////////////////////////////////////////
+
+ static int
+ tolower(int ch)
+ {
+ return isupper(ch) && '\0' != iso8859_1_char_conversion[ch] ?
+ iso8859_1_char_conversion[ch] : ch;
+ }
+
+ static int
+ toupper(int ch)
+ {
+ return islower(ch) && '\0' != iso8859_1_char_conversion[ch] ?
+ iso8859_1_char_conversion[ch] : ch;
+ }
+
+ static ::boost::uint32_t
+ toucs4(int ch)
+ {
+ // The first 256 characters in Unicode and the UCS are
+ // identical to those in ISO/IEC-8859-1.
+ return ch;
+ }
+ };
+
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// undefine macros
+///////////////////////////////////////////////////////////////////////////////
+#undef BOOST_CC_DIGIT
+#undef BOOST_CC_XDIGIT
+#undef BOOST_CC_ALPHA
+#undef BOOST_CC_CTRL
+#undef BOOST_CC_LOWER
+#undef BOOST_CC_UPPER
+#undef BOOST_CC_PUNCT
+#undef BOOST_CC_SPACE
+
+#endif
+
diff --git a/boost/spirit/home/support/char_encoding/standard.hpp b/boost/spirit/home/support/char_encoding/standard.hpp
new file mode 100644
index 0000000000..c32a9e73d8
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/standard.hpp
@@ -0,0 +1,137 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_STANDARD_APRIL_26_2006_1106PM)
+#define BOOST_SPIRIT_STANDARD_APRIL_26_2006_1106PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <cctype>
+#include <boost/cstdint.hpp>
+
+namespace boost { namespace spirit { namespace char_encoding
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Test characters for specified conditions (using std functions)
+ ///////////////////////////////////////////////////////////////////////////
+ struct standard
+ {
+ typedef char char_type;
+
+ static bool
+ isascii_(int ch)
+ {
+ return 0 == (ch & ~0x7f);
+ }
+
+ static bool
+ ischar(int ch)
+ {
+ // uses all 8 bits
+ // we have to watch out for sign extensions
+ return (0 == (ch & ~0xff) || ~0 == (ch | 0xff)) ? true : false;
+ }
+
+ static int
+ isalnum(int ch)
+ {
+ return std::isalnum(ch);
+ }
+
+ static int
+ isalpha(int ch)
+ {
+ return std::isalpha(ch);
+ }
+
+ static int
+ isdigit(int ch)
+ {
+ return std::isdigit(ch);
+ }
+
+ static int
+ isxdigit(int ch)
+ {
+ return std::isxdigit(ch);
+ }
+
+ static int
+ iscntrl(int ch)
+ {
+ return std::iscntrl(ch);
+ }
+
+ static int
+ isgraph(int ch)
+ {
+ return std::isgraph(ch);
+ }
+
+ static int
+ islower(int ch)
+ {
+ return std::islower(ch);
+ }
+
+ static int
+ isprint(int ch)
+ {
+ return std::isprint(ch);
+ }
+
+ static int
+ ispunct(int ch)
+ {
+ return std::ispunct(ch);
+ }
+
+ static int
+ isspace(int ch)
+ {
+ return std::isspace(ch);
+ }
+
+ static int
+ isblank BOOST_PREVENT_MACRO_SUBSTITUTION (int ch)
+ {
+ return (ch == ' ' || ch == '\t');
+ }
+
+ static int
+ isupper(int ch)
+ {
+ return std::isupper(ch);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////
+ // Simple character conversions
+ ///////////////////////////////////////////////////////////////////////////////
+ static int
+ tolower(int ch)
+ {
+ return std::tolower(ch);
+ }
+
+ static int
+ toupper(int ch)
+ {
+ return std::toupper(ch);
+ }
+
+ static ::boost::uint32_t
+ toucs4(int ch)
+ {
+ return ch;
+ }
+ };
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/char_encoding/standard_wide.hpp b/boost/spirit/home/support/char_encoding/standard_wide.hpp
new file mode 100644
index 0000000000..99c918ce56
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/standard_wide.hpp
@@ -0,0 +1,182 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_STANDARD_WIDE_NOVEMBER_10_2006_0913AM)
+#define BOOST_SPIRIT_STANDARD_WIDE_NOVEMBER_10_2006_0913AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <cwctype>
+#include <string>
+
+#include <boost/cstdint.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ template <std::size_t N>
+ struct wchar_t_size
+ {
+ BOOST_SPIRIT_ASSERT_MSG(N == 1 || N == 2 || N == 4,
+ not_supported_size_of_wchar_t, ());
+ };
+
+ template <> struct wchar_t_size<1> { enum { mask = 0xff }; };
+ template <> struct wchar_t_size<2> { enum { mask = 0xffff }; };
+ template <> struct wchar_t_size<4> { enum { mask = 0xffffffff }; };
+
+}}}
+
+namespace boost { namespace spirit { namespace char_encoding
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Test characters for specified conditions (using std wchar_t functions)
+ ///////////////////////////////////////////////////////////////////////////
+
+ struct standard_wide
+ {
+ typedef wchar_t char_type;
+
+ template <typename Char>
+ static typename std::char_traits<Char>::int_type
+ to_int_type(Char ch)
+ {
+ return std::char_traits<Char>::to_int_type(ch);
+ }
+
+ template <typename Char>
+ static Char
+ to_char_type(typename std::char_traits<Char>::int_type ch)
+ {
+ return std::char_traits<Char>::to_char_type(ch);
+ }
+
+ static bool
+ ischar(int ch)
+ {
+ // we have to watch out for sign extensions (casting is there to
+ // silence certain compilers complaining about signed/unsigned
+ // mismatch)
+ return (
+ std::size_t(0) ==
+ std::size_t(ch & ~traits::wchar_t_size<sizeof(wchar_t)>::mask) ||
+ std::size_t(~0) ==
+ std::size_t(ch | traits::wchar_t_size<sizeof(wchar_t)>::mask)
+ ) ? true : false; // any wchar_t, but no other bits set
+ }
+
+ static bool
+ isalnum(wchar_t ch)
+ {
+ using namespace std;
+ return iswalnum(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ isalpha(wchar_t ch)
+ {
+ using namespace std;
+ return iswalpha(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ iscntrl(wchar_t ch)
+ {
+ using namespace std;
+ return iswcntrl(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ isdigit(wchar_t ch)
+ {
+ using namespace std;
+ return iswdigit(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ isgraph(wchar_t ch)
+ {
+ using namespace std;
+ return iswgraph(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ islower(wchar_t ch)
+ {
+ using namespace std;
+ return iswlower(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ isprint(wchar_t ch)
+ {
+ using namespace std;
+ return iswprint(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ ispunct(wchar_t ch)
+ {
+ using namespace std;
+ return iswpunct(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ isspace(wchar_t ch)
+ {
+ using namespace std;
+ return iswspace(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ isupper(wchar_t ch)
+ {
+ using namespace std;
+ return iswupper(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ isxdigit(wchar_t ch)
+ {
+ using namespace std;
+ return iswxdigit(to_int_type(ch)) ? true : false;
+ }
+
+ static bool
+ isblank BOOST_PREVENT_MACRO_SUBSTITUTION (wchar_t ch)
+ {
+ return (ch == L' ' || ch == L'\t');
+ }
+
+ static wchar_t
+ tolower(wchar_t ch)
+ {
+ using namespace std;
+ return isupper(ch) ?
+ to_char_type<wchar_t>(towlower(to_int_type(ch))) : ch;
+ }
+
+ static wchar_t
+ toupper(wchar_t ch)
+ {
+ using namespace std;
+ return islower(ch) ?
+ to_char_type<wchar_t>(towupper(to_int_type(ch))) : ch;
+ }
+
+ static ::boost::uint32_t
+ toucs4(int ch)
+ {
+ return ch;
+ }
+ };
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/char_encoding/unicode.hpp b/boost/spirit/home/support/char_encoding/unicode.hpp
new file mode 100644
index 0000000000..9febf7e2a4
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode.hpp
@@ -0,0 +1,339 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_UNICODE_1_JANUARY_12_2010_0728PM)
+#define BOOST_SPIRIT_UNICODE_1_JANUARY_12_2010_0728PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/cstdint.hpp>
+#include <boost/spirit/home/support/char_encoding/unicode/query.hpp>
+
+namespace boost { namespace spirit { namespace char_encoding
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Test characters for specified conditions (using iso8859-1)
+ ///////////////////////////////////////////////////////////////////////////
+ struct unicode
+ {
+ typedef ::boost::uint32_t char_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Posix stuff
+ ///////////////////////////////////////////////////////////////////////////
+ static bool
+ isascii_(char_type ch)
+ {
+ return 0 == (ch & ~0x7f);
+ }
+
+ static bool
+ ischar(char_type ch)
+ {
+ // unicode code points in the range 0x00 to 0x10FFFF
+ return ch <= 0x10FFFF;
+ }
+
+ static bool
+ isalnum(char_type ch)
+ {
+ return ucd::is_alphanumeric(ch);
+ }
+
+ static bool
+ isalpha(char_type ch)
+ {
+ return ucd::is_alphabetic(ch);
+ }
+
+ static bool
+ isdigit(char_type ch)
+ {
+ return ucd::is_decimal_number(ch);
+ }
+
+ static bool
+ isxdigit(char_type ch)
+ {
+ return ucd::is_hex_digit(ch);
+ }
+
+ static bool
+ iscntrl(char_type ch)
+ {
+ return ucd::is_control(ch);
+ }
+
+ static bool
+ isgraph(char_type ch)
+ {
+ return ucd::is_graph(ch);
+ }
+
+ static bool
+ islower(char_type ch)
+ {
+ return ucd::is_lowercase(ch);
+ }
+
+ static bool
+ isprint(char_type ch)
+ {
+ return ucd::is_print(ch);
+ }
+
+ static bool
+ ispunct(char_type ch)
+ {
+ return ucd::is_punctuation(ch);
+ }
+
+ static bool
+ isspace(char_type ch)
+ {
+ return ucd::is_white_space(ch);
+ }
+
+ static int
+ isblank BOOST_PREVENT_MACRO_SUBSTITUTION (char_type ch)
+ {
+ return ucd::is_blank(ch);
+ }
+
+ static bool
+ isupper(char_type ch)
+ {
+ return ucd::is_uppercase(ch);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Simple character conversions
+ ///////////////////////////////////////////////////////////////////////////
+
+ static char_type
+ tolower(char_type ch)
+ {
+ return ucd::to_lowercase(ch);
+ }
+
+ static char_type
+ toupper(char_type ch)
+ {
+ return ucd::to_uppercase(ch);
+ }
+
+ static ::boost::uint32_t
+ toucs4(char_type ch)
+ {
+ return ch;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Major Categories
+ ///////////////////////////////////////////////////////////////////////////
+#define BOOST_SPIRIT_MAJOR_CATEGORY(name) \
+ static bool \
+ is_##name(char_type ch) \
+ { \
+ return ucd::get_major_category(ch) == ucd::properties::name; \
+ } \
+ /***/
+
+ BOOST_SPIRIT_MAJOR_CATEGORY(letter)
+ BOOST_SPIRIT_MAJOR_CATEGORY(mark)
+ BOOST_SPIRIT_MAJOR_CATEGORY(number)
+ BOOST_SPIRIT_MAJOR_CATEGORY(separator)
+ BOOST_SPIRIT_MAJOR_CATEGORY(other)
+ BOOST_SPIRIT_MAJOR_CATEGORY(punctuation)
+ BOOST_SPIRIT_MAJOR_CATEGORY(symbol)
+
+ ///////////////////////////////////////////////////////////////////////////
+ // General Categories
+ ///////////////////////////////////////////////////////////////////////////
+#define BOOST_SPIRIT_CATEGORY(name) \
+ static bool \
+ is_##name(char_type ch) \
+ { \
+ return ucd::get_category(ch) == ucd::properties::name; \
+ } \
+ /***/
+
+ BOOST_SPIRIT_CATEGORY(uppercase_letter)
+ BOOST_SPIRIT_CATEGORY(lowercase_letter)
+ BOOST_SPIRIT_CATEGORY(titlecase_letter)
+ BOOST_SPIRIT_CATEGORY(modifier_letter)
+ BOOST_SPIRIT_CATEGORY(other_letter)
+
+ BOOST_SPIRIT_CATEGORY(nonspacing_mark)
+ BOOST_SPIRIT_CATEGORY(enclosing_mark)
+ BOOST_SPIRIT_CATEGORY(spacing_mark)
+
+ BOOST_SPIRIT_CATEGORY(decimal_number)
+ BOOST_SPIRIT_CATEGORY(letter_number)
+ BOOST_SPIRIT_CATEGORY(other_number)
+
+ BOOST_SPIRIT_CATEGORY(space_separator)
+ BOOST_SPIRIT_CATEGORY(line_separator)
+ BOOST_SPIRIT_CATEGORY(paragraph_separator)
+
+ BOOST_SPIRIT_CATEGORY(control)
+ BOOST_SPIRIT_CATEGORY(format)
+ BOOST_SPIRIT_CATEGORY(private_use)
+ BOOST_SPIRIT_CATEGORY(surrogate)
+ BOOST_SPIRIT_CATEGORY(unassigned)
+
+ BOOST_SPIRIT_CATEGORY(dash_punctuation)
+ BOOST_SPIRIT_CATEGORY(open_punctuation)
+ BOOST_SPIRIT_CATEGORY(close_punctuation)
+ BOOST_SPIRIT_CATEGORY(connector_punctuation)
+ BOOST_SPIRIT_CATEGORY(other_punctuation)
+ BOOST_SPIRIT_CATEGORY(initial_punctuation)
+ BOOST_SPIRIT_CATEGORY(final_punctuation)
+
+ BOOST_SPIRIT_CATEGORY(math_symbol)
+ BOOST_SPIRIT_CATEGORY(currency_symbol)
+ BOOST_SPIRIT_CATEGORY(modifier_symbol)
+ BOOST_SPIRIT_CATEGORY(other_symbol)
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Derived Categories
+ ///////////////////////////////////////////////////////////////////////////
+#define BOOST_SPIRIT_DERIVED_CATEGORY(name) \
+ static bool \
+ is_##name(char_type ch) \
+ { \
+ return ucd::is_##name(ch); \
+ } \
+ /***/
+
+ BOOST_SPIRIT_DERIVED_CATEGORY(alphabetic)
+ BOOST_SPIRIT_DERIVED_CATEGORY(uppercase)
+ BOOST_SPIRIT_DERIVED_CATEGORY(lowercase)
+ BOOST_SPIRIT_DERIVED_CATEGORY(white_space)
+ BOOST_SPIRIT_DERIVED_CATEGORY(hex_digit)
+ BOOST_SPIRIT_DERIVED_CATEGORY(noncharacter_code_point)
+ BOOST_SPIRIT_DERIVED_CATEGORY(default_ignorable_code_point)
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Scripts
+ ///////////////////////////////////////////////////////////////////////////
+#define BOOST_SPIRIT_SCRIPT(name) \
+ static bool \
+ is_##name(char_type ch) \
+ { \
+ return ucd::get_script(ch) == ucd::properties::name; \
+ } \
+ /***/
+
+ BOOST_SPIRIT_SCRIPT(arabic)
+ BOOST_SPIRIT_SCRIPT(imperial_aramaic)
+ BOOST_SPIRIT_SCRIPT(armenian)
+ BOOST_SPIRIT_SCRIPT(avestan)
+ BOOST_SPIRIT_SCRIPT(balinese)
+ BOOST_SPIRIT_SCRIPT(bamum)
+ BOOST_SPIRIT_SCRIPT(bengali)
+ BOOST_SPIRIT_SCRIPT(bopomofo)
+ BOOST_SPIRIT_SCRIPT(braille)
+ BOOST_SPIRIT_SCRIPT(buginese)
+ BOOST_SPIRIT_SCRIPT(buhid)
+ BOOST_SPIRIT_SCRIPT(canadian_aboriginal)
+ BOOST_SPIRIT_SCRIPT(carian)
+ BOOST_SPIRIT_SCRIPT(cham)
+ BOOST_SPIRIT_SCRIPT(cherokee)
+ BOOST_SPIRIT_SCRIPT(coptic)
+ BOOST_SPIRIT_SCRIPT(cypriot)
+ BOOST_SPIRIT_SCRIPT(cyrillic)
+ BOOST_SPIRIT_SCRIPT(devanagari)
+ BOOST_SPIRIT_SCRIPT(deseret)
+ BOOST_SPIRIT_SCRIPT(egyptian_hieroglyphs)
+ BOOST_SPIRIT_SCRIPT(ethiopic)
+ BOOST_SPIRIT_SCRIPT(georgian)
+ BOOST_SPIRIT_SCRIPT(glagolitic)
+ BOOST_SPIRIT_SCRIPT(gothic)
+ BOOST_SPIRIT_SCRIPT(greek)
+ BOOST_SPIRIT_SCRIPT(gujarati)
+ BOOST_SPIRIT_SCRIPT(gurmukhi)
+ BOOST_SPIRIT_SCRIPT(hangul)
+ BOOST_SPIRIT_SCRIPT(han)
+ BOOST_SPIRIT_SCRIPT(hanunoo)
+ BOOST_SPIRIT_SCRIPT(hebrew)
+ BOOST_SPIRIT_SCRIPT(hiragana)
+ BOOST_SPIRIT_SCRIPT(katakana_or_hiragana)
+ BOOST_SPIRIT_SCRIPT(old_italic)
+ BOOST_SPIRIT_SCRIPT(javanese)
+ BOOST_SPIRIT_SCRIPT(kayah_li)
+ BOOST_SPIRIT_SCRIPT(katakana)
+ BOOST_SPIRIT_SCRIPT(kharoshthi)
+ BOOST_SPIRIT_SCRIPT(khmer)
+ BOOST_SPIRIT_SCRIPT(kannada)
+ BOOST_SPIRIT_SCRIPT(kaithi)
+ BOOST_SPIRIT_SCRIPT(tai_tham)
+ BOOST_SPIRIT_SCRIPT(lao)
+ BOOST_SPIRIT_SCRIPT(latin)
+ BOOST_SPIRIT_SCRIPT(lepcha)
+ BOOST_SPIRIT_SCRIPT(limbu)
+ BOOST_SPIRIT_SCRIPT(linear_b)
+ BOOST_SPIRIT_SCRIPT(lisu)
+ BOOST_SPIRIT_SCRIPT(lycian)
+ BOOST_SPIRIT_SCRIPT(lydian)
+ BOOST_SPIRIT_SCRIPT(malayalam)
+ BOOST_SPIRIT_SCRIPT(mongolian)
+ BOOST_SPIRIT_SCRIPT(meetei_mayek)
+ BOOST_SPIRIT_SCRIPT(myanmar)
+ BOOST_SPIRIT_SCRIPT(nko)
+ BOOST_SPIRIT_SCRIPT(ogham)
+ BOOST_SPIRIT_SCRIPT(ol_chiki)
+ BOOST_SPIRIT_SCRIPT(old_turkic)
+ BOOST_SPIRIT_SCRIPT(oriya)
+ BOOST_SPIRIT_SCRIPT(osmanya)
+ BOOST_SPIRIT_SCRIPT(phags_pa)
+ BOOST_SPIRIT_SCRIPT(inscriptional_pahlavi)
+ BOOST_SPIRIT_SCRIPT(phoenician)
+ BOOST_SPIRIT_SCRIPT(inscriptional_parthian)
+ BOOST_SPIRIT_SCRIPT(rejang)
+ BOOST_SPIRIT_SCRIPT(runic)
+ BOOST_SPIRIT_SCRIPT(samaritan)
+ BOOST_SPIRIT_SCRIPT(old_south_arabian)
+ BOOST_SPIRIT_SCRIPT(saurashtra)
+ BOOST_SPIRIT_SCRIPT(shavian)
+ BOOST_SPIRIT_SCRIPT(sinhala)
+ BOOST_SPIRIT_SCRIPT(sundanese)
+ BOOST_SPIRIT_SCRIPT(syloti_nagri)
+ BOOST_SPIRIT_SCRIPT(syriac)
+ BOOST_SPIRIT_SCRIPT(tagbanwa)
+ BOOST_SPIRIT_SCRIPT(tai_le)
+ BOOST_SPIRIT_SCRIPT(new_tai_lue)
+ BOOST_SPIRIT_SCRIPT(tamil)
+ BOOST_SPIRIT_SCRIPT(tai_viet)
+ BOOST_SPIRIT_SCRIPT(telugu)
+ BOOST_SPIRIT_SCRIPT(tifinagh)
+ BOOST_SPIRIT_SCRIPT(tagalog)
+ BOOST_SPIRIT_SCRIPT(thaana)
+ BOOST_SPIRIT_SCRIPT(thai)
+ BOOST_SPIRIT_SCRIPT(tibetan)
+ BOOST_SPIRIT_SCRIPT(ugaritic)
+ BOOST_SPIRIT_SCRIPT(vai)
+ BOOST_SPIRIT_SCRIPT(old_persian)
+ BOOST_SPIRIT_SCRIPT(cuneiform)
+ BOOST_SPIRIT_SCRIPT(yi)
+ BOOST_SPIRIT_SCRIPT(inherited)
+ BOOST_SPIRIT_SCRIPT(common)
+ BOOST_SPIRIT_SCRIPT(unknown)
+
+#undef BOOST_SPIRIT_MAJOR_CATEGORY
+#undef BOOST_SPIRIT_CATEGORY
+#undef BOOST_SPIRIT_DERIVED_CATEGORY
+#undef BOOST_SPIRIT_SCRIPT
+
+ };
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/char_encoding/unicode/DerivedCoreProperties.txt b/boost/spirit/home/support/char_encoding/unicode/DerivedCoreProperties.txt
new file mode 100644
index 0000000000..d1acdd7f48
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/DerivedCoreProperties.txt
@@ -0,0 +1,9247 @@
+# DerivedCoreProperties-5.2.0.txt
+# Date: 2009-08-26, 00:45:22 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2009 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see http://www.unicode.org/reports/tr44/
+
+# It is ok to redistribute this file "solely for informational
+# purposes in the creation of products supporting the Unicode Standard".
+# We don't nee to add a Boost License to this file: boostinspect:nolicense.
+
+# ================================================
+
+# Derived Property: Math
+# Generated from: Sm + Other_Math
+
+002B ; Math # Sm PLUS SIGN
+003C..003E ; Math # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN
+005E ; Math # Sk CIRCUMFLEX ACCENT
+007C ; Math # Sm VERTICAL LINE
+007E ; Math # Sm TILDE
+00AC ; Math # Sm NOT SIGN
+00B1 ; Math # Sm PLUS-MINUS SIGN
+00D7 ; Math # Sm MULTIPLICATION SIGN
+00F7 ; Math # Sm DIVISION SIGN
+03D0..03D2 ; Math # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL
+03D5 ; Math # L& GREEK PHI SYMBOL
+03F0..03F1 ; Math # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL
+03F4..03F5 ; Math # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F6 ; Math # Sm GREEK REVERSED LUNATE EPSILON SYMBOL
+0606..0608 ; Math # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY
+2016 ; Math # Po DOUBLE VERTICAL LINE
+2032..2034 ; Math # Po [3] PRIME..TRIPLE PRIME
+2040 ; Math # Pc CHARACTER TIE
+2044 ; Math # Sm FRACTION SLASH
+2052 ; Math # Sm COMMERCIAL MINUS SIGN
+2061..2064 ; Math # Cf [4] FUNCTION APPLICATION..INVISIBLE PLUS
+207A..207C ; Math # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN
+207D ; Math # Ps SUPERSCRIPT LEFT PARENTHESIS
+207E ; Math # Pe SUPERSCRIPT RIGHT PARENTHESIS
+208A..208C ; Math # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN
+208D ; Math # Ps SUBSCRIPT LEFT PARENTHESIS
+208E ; Math # Pe SUBSCRIPT RIGHT PARENTHESIS
+20D0..20DC ; Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20E1 ; Math # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E5..20E6 ; Math # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20EB..20EF ; Math # Mn [5] COMBINING LONG DOUBLE SOLIDUS OVERLAY..COMBINING RIGHT ARROW BELOW
+2102 ; Math # L& DOUBLE-STRUCK CAPITAL C
+210A..2113 ; Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; Math # L& DOUBLE-STRUCK CAPITAL N
+2119..211D ; Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; Math # L& DOUBLE-STRUCK CAPITAL Z
+2128 ; Math # L& BLACK-LETTER CAPITAL Z
+2129 ; Math # So TURNED GREEK SMALL LETTER IOTA
+212C..212D ; Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212F..2131 ; Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134 ; Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138 ; Math # Lo [4] ALEF SYMBOL..DALET SYMBOL
+213C..213F ; Math # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2140..2144 ; Math # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
+2145..2149 ; Math # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214B ; Math # Sm TURNED AMPERSAND
+2190..2194 ; Math # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199 ; Math # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B ; Math # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F ; Math # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0 ; Math # Sm RIGHTWARDS TWO HEADED ARROW
+21A1..21A2 ; Math # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3 ; Math # Sm RIGHTWARDS ARROW WITH TAIL
+21A4..21A5 ; Math # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6 ; Math # Sm RIGHTWARDS ARROW FROM BAR
+21A7 ; Math # So DOWNWARDS ARROW FROM BAR
+21A9..21AD ; Math # So [5] LEFTWARDS ARROW WITH HOOK..LEFT RIGHT WAVE ARROW
+21AE ; Math # Sm LEFT RIGHT ARROW WITH STROKE
+21B0..21B1 ; Math # So [2] UPWARDS ARROW WITH TIP LEFTWARDS..UPWARDS ARROW WITH TIP RIGHTWARDS
+21B6..21B7 ; Math # So [2] ANTICLOCKWISE TOP SEMICIRCLE ARROW..CLOCKWISE TOP SEMICIRCLE ARROW
+21BC..21CD ; Math # So [18] LEFTWARDS HARPOON WITH BARB UPWARDS..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF ; Math # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; Math # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2 ; Math # Sm RIGHTWARDS DOUBLE ARROW
+21D3 ; Math # So DOWNWARDS DOUBLE ARROW
+21D4 ; Math # Sm LEFT RIGHT DOUBLE ARROW
+21D5..21DB ; Math # So [7] UP DOWN DOUBLE ARROW..RIGHTWARDS TRIPLE ARROW
+21DD ; Math # So RIGHTWARDS SQUIGGLE ARROW
+21E4..21E5 ; Math # So [2] LEFTWARDS ARROW TO BAR..RIGHTWARDS ARROW TO BAR
+21F4..22FF ; Math # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2308..230B ; Math # Sm [4] LEFT CEILING..RIGHT FLOOR
+2320..2321 ; Math # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+237C ; Math # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+239B..23B3 ; Math # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4..23B5 ; Math # So [2] TOP SQUARE BRACKET..BOTTOM SQUARE BRACKET
+23B7 ; Math # So RADICAL SYMBOL BOTTOM
+23D0 ; Math # So VERTICAL LINE EXTENSION
+23DC..23E1 ; Math # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
+23E2 ; Math # So WHITE TRAPEZIUM
+25A0..25A1 ; Math # So [2] BLACK SQUARE..WHITE SQUARE
+25AE..25B6 ; Math # So [9] BLACK VERTICAL RECTANGLE..BLACK RIGHT-POINTING TRIANGLE
+25B7 ; Math # Sm WHITE RIGHT-POINTING TRIANGLE
+25BC..25C0 ; Math # So [5] BLACK DOWN-POINTING TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1 ; Math # Sm WHITE LEFT-POINTING TRIANGLE
+25C6..25C7 ; Math # So [2] BLACK DIAMOND..WHITE DIAMOND
+25CA..25CB ; Math # So [2] LOZENGE..WHITE CIRCLE
+25CF..25D3 ; Math # So [5] BLACK CIRCLE..CIRCLE WITH UPPER HALF BLACK
+25E2 ; Math # So BLACK LOWER RIGHT TRIANGLE
+25E4 ; Math # So BLACK UPPER LEFT TRIANGLE
+25E7..25EC ; Math # So [6] SQUARE WITH LEFT HALF BLACK..WHITE UP-POINTING TRIANGLE WITH DOT
+25F8..25FF ; Math # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2605..2606 ; Math # So [2] BLACK STAR..WHITE STAR
+2640 ; Math # So FEMALE SIGN
+2642 ; Math # So MALE SIGN
+2660..2663 ; Math # So [4] BLACK SPADE SUIT..BLACK CLUB SUIT
+266D..266E ; Math # So [2] MUSIC FLAT SIGN..MUSIC NATURAL SIGN
+266F ; Math # Sm MUSIC SHARP SIGN
+27C0..27C4 ; Math # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5 ; Math # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; Math # Pe RIGHT S-SHAPED BAG DELIMITER
+27C7..27CA ; Math # Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
+27CC ; Math # Sm LONG DIVISION
+27D0..27E5 ; Math # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; Math # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; Math # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; Math # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; Math # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; Math # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; Math # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; Math # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; Math # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; Math # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; Math # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0..27FF ; Math # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2900..2982 ; Math # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983 ; Math # Ps LEFT WHITE CURLY BRACKET
+2984 ; Math # Pe RIGHT WHITE CURLY BRACKET
+2985 ; Math # Ps LEFT WHITE PARENTHESIS
+2986 ; Math # Pe RIGHT WHITE PARENTHESIS
+2987 ; Math # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; Math # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; Math # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; Math # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; Math # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; Math # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; Math # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; Math # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; Math # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; Math # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; Math # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; Math # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; Math # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; Math # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; Math # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; Math # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; Math # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; Math # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7 ; Math # Sm [63] DOTTED FENCE..BLACK HOURGLASS
+29D8 ; Math # Ps LEFT WIGGLY FENCE
+29D9 ; Math # Pe RIGHT WIGGLY FENCE
+29DA ; Math # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; Math # Pe RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB ; Math # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC ; Math # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; Math # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF ; Math # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B30..2B44 ; Math # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET
+2B47..2B4C ; Math # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+FB29 ; Math # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN
+FE61 ; Math # Po SMALL ASTERISK
+FE62 ; Math # Sm SMALL PLUS SIGN
+FE63 ; Math # Pd SMALL HYPHEN-MINUS
+FE64..FE66 ; Math # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE68 ; Math # Po SMALL REVERSE SOLIDUS
+FF0B ; Math # Sm FULLWIDTH PLUS SIGN
+FF1C..FF1E ; Math # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF3C ; Math # Po FULLWIDTH REVERSE SOLIDUS
+FF3E ; Math # Sk FULLWIDTH CIRCUMFLEX ACCENT
+FF5C ; Math # Sm FULLWIDTH VERTICAL LINE
+FF5E ; Math # Sm FULLWIDTH TILDE
+FFE2 ; Math # Sm FULLWIDTH NOT SIGN
+FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+1D400..1D454 ; Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Math # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Math # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Math # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Math # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; Math # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Math # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; Math # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1 ; Math # Sm MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA ; Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB ; Math # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA ; Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB ; Math # Sm MATHEMATICAL ITALIC NABLA
+1D6FC..1D714 ; Math # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715 ; Math # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734 ; Math # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735 ; Math # Sm MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E ; Math # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F ; Math # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E ; Math # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F ; Math # Sm MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788 ; Math # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8 ; Math # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2 ; Math # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7CB ; Math # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+
+# Total code points: 2161
+
+# ================================================
+
+# Derived Property: Alphabetic
+# Generated from: Lu+Ll+Lt+Lm+Lo+Nl + Other_Alphabetic
+
+0041..005A ; Alphabetic # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A ; Alphabetic # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; Alphabetic # L& FEMININE ORDINAL INDICATOR
+00B5 ; Alphabetic # L& MICRO SIGN
+00BA ; Alphabetic # L& MASCULINE ORDINAL INDICATOR
+00C0..00D6 ; Alphabetic # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; Alphabetic # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA ; Alphabetic # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; Alphabetic # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; Alphabetic # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; Alphabetic # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293 ; Alphabetic # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294 ; Alphabetic # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; Alphabetic # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02C1 ; Alphabetic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C6..02D1 ; Alphabetic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02E0..02E4 ; Alphabetic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02EC ; Alphabetic # Lm MODIFIER LETTER VOICING
+02EE ; Alphabetic # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+0345 ; Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI
+0370..0373 ; Alphabetic # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0374 ; Alphabetic # Lm GREEK NUMERAL SIGN
+0376..0377 ; Alphabetic # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; Alphabetic # Lm GREEK YPOGEGRAMMENI
+037B..037D ; Alphabetic # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0386 ; Alphabetic # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; Alphabetic # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Alphabetic # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; Alphabetic # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03F5 ; Alphabetic # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
+03F7..0481 ; Alphabetic # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
+048A..0525 ; Alphabetic # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+0531..0556 ; Alphabetic # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; Alphabetic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+0561..0587 ; Alphabetic # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+05B0..05BD ; Alphabetic # Mn [14] HEBREW POINT SHEVA..HEBREW POINT METEG
+05BF ; Alphabetic # Mn HEBREW POINT RAFE
+05C1..05C2 ; Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; Alphabetic # Mn HEBREW POINT QAMATS QATAN
+05D0..05EA ; Alphabetic # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; Alphabetic # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+0610..061A ; Alphabetic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+0621..063F ; Alphabetic # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640 ; Alphabetic # Lm ARABIC TATWEEL
+0641..064A ; Alphabetic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+064B..0657 ; Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA
+0659..065E ; Alphabetic # Mn [6] ARABIC ZWARAKAY..ARABIC FATHA WITH TWO DOTS
+066E..066F ; Alphabetic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0670 ; Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF
+0671..06D3 ; Alphabetic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D5 ; Alphabetic # Lo ARABIC LETTER AE
+06D6..06DC ; Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06E1..06E4 ; Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA
+06E5..06E6 ; Alphabetic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8 ; Alphabetic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06ED ; Alphabetic # Mn ARABIC SMALL LOW MEEM
+06EE..06EF ; Alphabetic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06FA..06FC ; Alphabetic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FF ; Alphabetic # Lo ARABIC LETTER HEH WITH INVERTED V
+0710 ; Alphabetic # Lo SYRIAC LETTER ALAPH
+0711 ; Alphabetic # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0712..072F ; Alphabetic # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+0730..073F ; Alphabetic # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA
+074D..07A5 ; Alphabetic # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU
+07A6..07B0 ; Alphabetic # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07B1 ; Alphabetic # Lo THAANA LETTER NAA
+07CA..07EA ; Alphabetic # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07F4..07F5 ; Alphabetic # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07FA ; Alphabetic # Lm NKO LAJANYALAN
+0800..0815 ; Alphabetic # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
+0816..0817 ; Alphabetic # Mn [2] SAMARITAN MARK IN..SAMARITAN MARK IN-ALAF
+081A ; Alphabetic # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+081B..0823 ; Alphabetic # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0824 ; Alphabetic # Lm SAMARITAN MODIFIER LETTER SHORT A
+0825..0827 ; Alphabetic # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0828 ; Alphabetic # Lm SAMARITAN MODIFIER LETTER I
+0829..082C ; Alphabetic # Mn [4] SAMARITAN VOWEL SIGN LONG I..SAMARITAN VOWEL SIGN SUKUN
+0900..0902 ; Alphabetic # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903 ; Alphabetic # Mc DEVANAGARI SIGN VISARGA
+0904..0939 ; Alphabetic # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093D ; Alphabetic # Lo DEVANAGARI SIGN AVAGRAHA
+093E..0940 ; Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948 ; Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C ; Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094E ; Alphabetic # Mc DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+0950 ; Alphabetic # Lo DEVANAGARI OM
+0955 ; Alphabetic # Mn DEVANAGARI VOWEL SIGN CANDRA LONG E
+0958..0961 ; Alphabetic # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0962..0963 ; Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0971 ; Alphabetic # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972 ; Alphabetic # Lo DEVANAGARI LETTER CANDRA A
+0979..097F ; Alphabetic # Lo [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+0981 ; Alphabetic # Mn BENGALI SIGN CANDRABINDU
+0982..0983 ; Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C ; Alphabetic # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; Alphabetic # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; Alphabetic # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; Alphabetic # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; Alphabetic # Lo BENGALI LETTER LA
+09B6..09B9 ; Alphabetic # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BD ; Alphabetic # Lo BENGALI SIGN AVAGRAHA
+09BE..09C0 ; Alphabetic # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4 ; Alphabetic # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8 ; Alphabetic # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CE ; Alphabetic # Lo BENGALI LETTER KHANDA TA
+09D7 ; Alphabetic # Mc BENGALI AU LENGTH MARK
+09DC..09DD ; Alphabetic # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; Alphabetic # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E2..09E3 ; Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09F0..09F1 ; Alphabetic # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+0A01..0A02 ; Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; Alphabetic # Mc GURMUKHI SIGN VISARGA
+0A05..0A0A ; Alphabetic # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; Alphabetic # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; Alphabetic # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; Alphabetic # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; Alphabetic # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; Alphabetic # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; Alphabetic # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3E..0A40 ; Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42 ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4C ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU
+0A51 ; Alphabetic # Mn GURMUKHI SIGN UDAAT
+0A59..0A5C ; Alphabetic # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; Alphabetic # Lo GURMUKHI LETTER FA
+0A70..0A71 ; Alphabetic # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A72..0A74 ; Alphabetic # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A75 ; Alphabetic # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; Alphabetic # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83 ; Alphabetic # Mc GUJARATI SIGN VISARGA
+0A85..0A8D ; Alphabetic # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; Alphabetic # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; Alphabetic # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; Alphabetic # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; Alphabetic # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; Alphabetic # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABD ; Alphabetic # Lo GUJARATI SIGN AVAGRAHA
+0ABE..0AC0 ; Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5 ; Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9 ; Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0AD0 ; Alphabetic # Lo GUJARATI OM
+0AE0..0AE1 ; Alphabetic # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3 ; Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01 ; Alphabetic # Mn ORIYA SIGN CANDRABINDU
+0B02..0B03 ; Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C ; Alphabetic # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; Alphabetic # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; Alphabetic # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; Alphabetic # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; Alphabetic # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; Alphabetic # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3D ; Alphabetic # Lo ORIYA SIGN AVAGRAHA
+0B3E ; Alphabetic # Mc ORIYA VOWEL SIGN AA
+0B3F ; Alphabetic # Mn ORIYA VOWEL SIGN I
+0B40 ; Alphabetic # Mc ORIYA VOWEL SIGN II
+0B41..0B44 ; Alphabetic # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48 ; Alphabetic # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; Alphabetic # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B56 ; Alphabetic # Mn ORIYA AI LENGTH MARK
+0B57 ; Alphabetic # Mc ORIYA AU LENGTH MARK
+0B5C..0B5D ; Alphabetic # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; Alphabetic # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B62..0B63 ; Alphabetic # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B71 ; Alphabetic # Lo ORIYA LETTER WA
+0B82 ; Alphabetic # Mn TAMIL SIGN ANUSVARA
+0B83 ; Alphabetic # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; Alphabetic # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; Alphabetic # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; Alphabetic # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; Alphabetic # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; Alphabetic # Lo TAMIL LETTER JA
+0B9E..0B9F ; Alphabetic # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; Alphabetic # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; Alphabetic # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; Alphabetic # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBE..0BBF ; Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0 ; Alphabetic # Mn TAMIL VOWEL SIGN II
+0BC1..0BC2 ; Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BD0 ; Alphabetic # Lo TAMIL OM
+0BD7 ; Alphabetic # Mc TAMIL AU LENGTH MARK
+0C01..0C03 ; Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C ; Alphabetic # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; Alphabetic # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; Alphabetic # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33 ; Alphabetic # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39 ; Alphabetic # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D ; Alphabetic # Lo TELUGU SIGN AVAGRAHA
+0C3E..0C40 ; Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44 ; Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48 ; Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4C ; Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU
+0C55..0C56 ; Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C58..0C59 ; Alphabetic # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61 ; Alphabetic # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C62..0C63 ; Alphabetic # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C82..0C83 ; Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C ; Alphabetic # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; Alphabetic # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; Alphabetic # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; Alphabetic # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; Alphabetic # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBD ; Alphabetic # Lo KANNADA SIGN AVAGRAHA
+0CBE ; Alphabetic # Mc KANNADA VOWEL SIGN AA
+0CBF ; Alphabetic # Mn KANNADA VOWEL SIGN I
+0CC0..0CC4 ; Alphabetic # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; Alphabetic # Mn KANNADA VOWEL SIGN E
+0CC7..0CC8 ; Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC ; Alphabetic # Mn KANNADA VOWEL SIGN AU
+0CD5..0CD6 ; Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE ; Alphabetic # Lo KANNADA LETTER FA
+0CE0..0CE1 ; Alphabetic # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE2..0CE3 ; Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0D02..0D03 ; Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C ; Alphabetic # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; Alphabetic # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28 ; Alphabetic # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39 ; Alphabetic # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D ; Alphabetic # Lo MALAYALAM SIGN AVAGRAHA
+0D3E..0D40 ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44 ; Alphabetic # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48 ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D57 ; Alphabetic # Mc MALAYALAM AU LENGTH MARK
+0D60..0D61 ; Alphabetic # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D62..0D63 ; Alphabetic # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D7A..0D7F ; Alphabetic # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D82..0D83 ; Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96 ; Alphabetic # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; Alphabetic # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; Alphabetic # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; Alphabetic # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; Alphabetic # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCF..0DD1 ; Alphabetic # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4 ; Alphabetic # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; Alphabetic # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF ; Alphabetic # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3 ; Alphabetic # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E01..0E30 ; Alphabetic # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E31 ; Alphabetic # Mn THAI CHARACTER MAI HAN-AKAT
+0E32..0E33 ; Alphabetic # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E34..0E3A ; Alphabetic # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E40..0E45 ; Alphabetic # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; Alphabetic # Lm THAI CHARACTER MAIYAMOK
+0E4D ; Alphabetic # Mn THAI CHARACTER NIKHAHIT
+0E81..0E82 ; Alphabetic # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; Alphabetic # Lo LAO LETTER KHO TAM
+0E87..0E88 ; Alphabetic # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; Alphabetic # Lo LAO LETTER SO TAM
+0E8D ; Alphabetic # Lo LAO LETTER NYO
+0E94..0E97 ; Alphabetic # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; Alphabetic # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; Alphabetic # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; Alphabetic # Lo LAO LETTER LO LOOT
+0EA7 ; Alphabetic # Lo LAO LETTER WO
+0EAA..0EAB ; Alphabetic # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; Alphabetic # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB1 ; Alphabetic # Mn LAO VOWEL SIGN MAI KAN
+0EB2..0EB3 ; Alphabetic # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EB4..0EB9 ; Alphabetic # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; Alphabetic # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EBD ; Alphabetic # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; Alphabetic # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; Alphabetic # Lm LAO KO LA
+0ECD ; Alphabetic # Mn LAO NIGGAHITA
+0EDC..0EDD ; Alphabetic # Lo [2] LAO HO NO..LAO HO MO
+0F00 ; Alphabetic # Lo TIBETAN SYLLABLE OM
+0F40..0F47 ; Alphabetic # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; Alphabetic # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F71..0F7E ; Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F ; Alphabetic # Mc TIBETAN SIGN RNAM BCAD
+0F80..0F81 ; Alphabetic # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II
+0F88..0F8B ; Alphabetic # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0F90..0F97 ; Alphabetic # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+1000..102A ; Alphabetic # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+102B..102C ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030 ; Alphabetic # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031 ; Alphabetic # Mc MYANMAR VOWEL SIGN E
+1032..1036 ; Alphabetic # Mn [5] MYANMAR VOWEL SIGN AI..MYANMAR SIGN ANUSVARA
+1038 ; Alphabetic # Mc MYANMAR SIGN VISARGA
+103B..103C ; Alphabetic # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E ; Alphabetic # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+103F ; Alphabetic # Lo MYANMAR LETTER GREAT SA
+1050..1055 ; Alphabetic # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057 ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059 ; Alphabetic # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105A..105D ; Alphabetic # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+105E..1060 ; Alphabetic # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061 ; Alphabetic # Lo MYANMAR LETTER SGAW KAREN SHA
+1062 ; Alphabetic # Mc MYANMAR VOWEL SIGN SGAW KAREN EU
+1065..1066 ; Alphabetic # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+1067..1068 ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+106E..1070 ; Alphabetic # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071..1074 ; Alphabetic # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1075..1081 ; Alphabetic # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+1082 ; Alphabetic # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084 ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086 ; Alphabetic # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+108E ; Alphabetic # Lo MYANMAR LETTER RUMAI PALAUNG FA
+109C ; Alphabetic # Mc MYANMAR VOWEL SIGN AITON A
+109D ; Alphabetic # Mn MYANMAR VOWEL SIGN AITON AI
+10A0..10C5 ; Alphabetic # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA ; Alphabetic # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC ; Alphabetic # Lm MODIFIER LETTER GEORGIAN NAR
+1100..1248 ; Alphabetic # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA
+124A..124D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; Alphabetic # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; Alphabetic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; Alphabetic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; Alphabetic # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; Alphabetic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; Alphabetic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; Alphabetic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135F ; Alphabetic # Mn ETHIOPIC COMBINING GEMINATION MARK
+1380..138F ; Alphabetic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+13A0..13F4 ; Alphabetic # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+1401..166C ; Alphabetic # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166F..167F ; Alphabetic # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+1681..169A ; Alphabetic # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+16A0..16EA ; Alphabetic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0 ; Alphabetic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+1700..170C ; Alphabetic # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; Alphabetic # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1712..1713 ; Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U
+1720..1731 ; Alphabetic # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1732..1733 ; Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
+1740..1751 ; Alphabetic # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1752..1753 ; Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1760..176C ; Alphabetic # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; Alphabetic # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1772..1773 ; Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+1780..17B3 ; Alphabetic # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B6 ; Alphabetic # Mc KHMER VOWEL SIGN AA
+17B7..17BD ; Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5 ; Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6 ; Alphabetic # Mn KHMER SIGN NIKAHIT
+17C7..17C8 ; Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17D7 ; Alphabetic # Lm KHMER SIGN LEK TOO
+17DC ; Alphabetic # Lo KHMER SIGN AVAKRAHASANYA
+1820..1842 ; Alphabetic # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; Alphabetic # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; Alphabetic # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8 ; Alphabetic # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 ; Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+18AA ; Alphabetic # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+18B0..18F5 ; Alphabetic # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+1900..191C ; Alphabetic # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1920..1922 ; Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1950..196D ; Alphabetic # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; Alphabetic # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1980..19AB ; Alphabetic # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19B0..19C0 ; Alphabetic # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C1..19C7 ; Alphabetic # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+19C8..19C9 ; Alphabetic # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+1A00..1A16 ; Alphabetic # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A17..1A18 ; Alphabetic # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B ; Alphabetic # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A20..1A54 ; Alphabetic # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
+1A55 ; Alphabetic # Mc TAI THAM CONSONANT SIGN MEDIAL RA
+1A56 ; Alphabetic # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A57 ; Alphabetic # Mc TAI THAM CONSONANT SIGN LA TANG LAI
+1A58..1A5E ; Alphabetic # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A61 ; Alphabetic # Mc TAI THAM VOWEL SIGN A
+1A62 ; Alphabetic # Mn TAI THAM VOWEL SIGN MAI SAT
+1A63..1A64 ; Alphabetic # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA
+1A65..1A6C ; Alphabetic # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A6D..1A72 ; Alphabetic # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1A73..1A74 ; Alphabetic # Mn [2] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN MAI KANG
+1AA7 ; Alphabetic # Lm TAI THAM SIGN MAI YAMOK
+1B00..1B03 ; Alphabetic # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04 ; Alphabetic # Mc BALINESE SIGN BISAH
+1B05..1B33 ; Alphabetic # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B35 ; Alphabetic # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; Alphabetic # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B ; Alphabetic # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; Alphabetic # Mn BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41 ; Alphabetic # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; Alphabetic # Mn BALINESE VOWEL SIGN PEPET
+1B43 ; Alphabetic # Mc BALINESE VOWEL SIGN PEPET TEDUNG
+1B45..1B4B ; Alphabetic # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B80..1B81 ; Alphabetic # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82 ; Alphabetic # Mc SUNDANESE SIGN PANGWISAD
+1B83..1BA0 ; Alphabetic # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BA1 ; Alphabetic # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5 ; Alphabetic # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7 ; Alphabetic # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9 ; Alphabetic # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAE..1BAF ; Alphabetic # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1C00..1C23 ; Alphabetic # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C24..1C2B ; Alphabetic # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33 ; Alphabetic # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35 ; Alphabetic # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1C4D..1C4F ; Alphabetic # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+1C5A..1C77 ; Alphabetic # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; Alphabetic # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1CE9..1CEC ; Alphabetic # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL
+1CEE..1CF1 ; Alphabetic # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA
+1CF2 ; Alphabetic # Mc VEDIC SIGN ARDHAVISARGA
+1D00..1D2B ; Alphabetic # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61 ; Alphabetic # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D77 ; Alphabetic # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
+1D78 ; Alphabetic # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D9A ; Alphabetic # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; Alphabetic # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1E00..1F15 ; Alphabetic # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; Alphabetic # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; Alphabetic # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; Alphabetic # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Alphabetic # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; Alphabetic # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; Alphabetic # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; Alphabetic # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE ; Alphabetic # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; Alphabetic # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; Alphabetic # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3 ; Alphabetic # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; Alphabetic # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE0..1FEC ; Alphabetic # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4 ; Alphabetic # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; Alphabetic # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2071 ; Alphabetic # Lm SUPERSCRIPT LATIN SMALL LETTER I
+207F ; Alphabetic # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094 ; Alphabetic # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+2102 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL C
+2107 ; Alphabetic # L& EULER CONSTANT
+210A..2113 ; Alphabetic # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL N
+2119..211D ; Alphabetic # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL Z
+2126 ; Alphabetic # L& OHM SIGN
+2128 ; Alphabetic # L& BLACK-LETTER CAPITAL Z
+212A..212D ; Alphabetic # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212F..2134 ; Alphabetic # L& [6] SCRIPT SMALL E..SCRIPT SMALL O
+2135..2138 ; Alphabetic # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; Alphabetic # L& INFORMATION SOURCE
+213C..213F ; Alphabetic # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149 ; Alphabetic # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214E ; Alphabetic # L& TURNED SMALL F
+2160..2182 ; Alphabetic # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; Alphabetic # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; Alphabetic # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+24B6..24E9 ; Alphabetic # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2C00..2C2E ; Alphabetic # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; Alphabetic # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C7C ; Alphabetic # L& [29] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; Alphabetic # Lm MODIFIER LETTER CAPITAL V
+2C7E..2CE4 ; Alphabetic # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI
+2CEB..2CEE ; Alphabetic # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2D00..2D25 ; Alphabetic # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+2D30..2D65 ; Alphabetic # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F ; Alphabetic # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80..2D96 ; Alphabetic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+2DE0..2DFF ; Alphabetic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+2E2F ; Alphabetic # Lm VERTICAL TILDE
+3005 ; Alphabetic # Lm IDEOGRAPHIC ITERATION MARK
+3006 ; Alphabetic # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; Alphabetic # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; Alphabetic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3031..3035 ; Alphabetic # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3038..303A ; Alphabetic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; Alphabetic # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+303C ; Alphabetic # Lo MASU MARK
+3041..3096 ; Alphabetic # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309D..309E ; Alphabetic # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; Alphabetic # Lo HIRAGANA DIGRAPH YORI
+30A1..30FA ; Alphabetic # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FC..30FE ; Alphabetic # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+30FF ; Alphabetic # Lo KATAKANA DIGRAPH KOTO
+3105..312D ; Alphabetic # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+3131..318E ; Alphabetic # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+31A0..31B7 ; Alphabetic # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+31F0..31FF ; Alphabetic # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3400..4DB5 ; Alphabetic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FCB ; Alphabetic # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+A000..A014 ; Alphabetic # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; Alphabetic # Lm YI SYLLABLE WU
+A016..A48C ; Alphabetic # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A4D0..A4F7 ; Alphabetic # Lo [40] LISU LETTER BA..LISU LETTER OE
+A4F8..A4FD ; Alphabetic # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A500..A60B ; Alphabetic # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; Alphabetic # Lm VAI SYLLABLE LENGTHENER
+A610..A61F ; Alphabetic # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A62A..A62B ; Alphabetic # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+A640..A65F ; Alphabetic # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; Alphabetic # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; Alphabetic # Lo CYRILLIC LETTER MULTIOCULAR O
+A67F ; Alphabetic # Lm CYRILLIC PAYEROK
+A680..A697 ; Alphabetic # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+A6A0..A6E5 ; Alphabetic # Lo [70] BAMUM LETTER A..BAMUM LETTER KI
+A6E6..A6EF ; Alphabetic # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A717..A71F ; Alphabetic # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A722..A76F ; Alphabetic # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; Alphabetic # Lm MODIFIER LETTER US
+A771..A787 ; Alphabetic # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A788 ; Alphabetic # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A78B..A78C ; Alphabetic # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A801 ; Alphabetic # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I
+A803..A805 ; Alphabetic # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A807..A80A ; Alphabetic # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80C..A822 ; Alphabetic # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824 ; Alphabetic # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826 ; Alphabetic # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827 ; Alphabetic # Mc SYLOTI NAGRI VOWEL SIGN OO
+A840..A873 ; Alphabetic # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A880..A881 ; Alphabetic # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A882..A8B3 ; Alphabetic # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8B4..A8C3 ; Alphabetic # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A8F2..A8F7 ; Alphabetic # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8FB ; Alphabetic # Lo DEVANAGARI HEADSTROKE
+A90A..A925 ; Alphabetic # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A926..A92A ; Alphabetic # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O
+A930..A946 ; Alphabetic # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A947..A951 ; Alphabetic # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952 ; Alphabetic # Mc REJANG CONSONANT SIGN H
+A960..A97C ; Alphabetic # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+A980..A982 ; Alphabetic # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A983 ; Alphabetic # Mc JAVANESE SIGN WIGNYAN
+A984..A9B2 ; Alphabetic # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA
+A9B3 ; Alphabetic # Mn JAVANESE SIGN CECAK TELU
+A9B4..A9B5 ; Alphabetic # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9B6..A9B9 ; Alphabetic # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BA..A9BB ; Alphabetic # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BC ; Alphabetic # Mn JAVANESE VOWEL SIGN PEPET
+A9BD..A9BF ; Alphabetic # Mc [3] JAVANESE CONSONANT SIGN KERET..JAVANESE CONSONANT SIGN CAKRA
+A9CF ; Alphabetic # Lm JAVANESE PANGRANGKEP
+AA00..AA28 ; Alphabetic # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA29..AA2E ; Alphabetic # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30 ; Alphabetic # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32 ; Alphabetic # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34 ; Alphabetic # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36 ; Alphabetic # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA40..AA42 ; Alphabetic # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA43 ; Alphabetic # Mn CHAM CONSONANT SIGN FINAL NG
+AA44..AA4B ; Alphabetic # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA4C ; Alphabetic # Mn CHAM CONSONANT SIGN FINAL M
+AA4D ; Alphabetic # Mc CHAM CONSONANT SIGN FINAL H
+AA60..AA6F ; Alphabetic # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA
+AA70 ; Alphabetic # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AA71..AA76 ; Alphabetic # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM
+AA7A ; Alphabetic # Lo MYANMAR LETTER AITON RA
+AA80..AAAF ; Alphabetic # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O
+AAB0 ; Alphabetic # Mn TAI VIET MAI KANG
+AAB1 ; Alphabetic # Lo TAI VIET VOWEL AA
+AAB2..AAB4 ; Alphabetic # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB5..AAB6 ; Alphabetic # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB7..AAB8 ; Alphabetic # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AAB9..AABD ; Alphabetic # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN
+AABE ; Alphabetic # Mn TAI VIET VOWEL AM
+AAC0 ; Alphabetic # Lo TAI VIET TONE MAI NUENG
+AAC2 ; Alphabetic # Lo TAI VIET TONE MAI SONG
+AADB..AADC ; Alphabetic # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG
+AADD ; Alphabetic # Lm TAI VIET SYMBOL SAM
+ABC0..ABE2 ; Alphabetic # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
+ABE3..ABE4 ; Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE5 ; Alphabetic # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE6..ABE7 ; Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE8 ; Alphabetic # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABE9..ABEA ; Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+AC00..D7A3 ; Alphabetic # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+D7B0..D7C6 ; Alphabetic # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7CB..D7FB ; Alphabetic # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+F900..FA2D ; Alphabetic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6D ; Alphabetic # Lo [62] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA70..FAD9 ; Alphabetic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00..FB06 ; Alphabetic # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; Alphabetic # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB1D ; Alphabetic # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1E ; Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F..FB28 ; Alphabetic # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB2A..FB36 ; Alphabetic # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; Alphabetic # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; Alphabetic # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; Alphabetic # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; Alphabetic # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FBB1 ; Alphabetic # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FD3D ; Alphabetic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F ; Alphabetic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; Alphabetic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB ; Alphabetic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FE70..FE74 ; Alphabetic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC ; Alphabetic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FF21..FF3A ; Alphabetic # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A ; Alphabetic # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF66..FF6F ; Alphabetic # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 ; Alphabetic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D ; Alphabetic # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FF9E..FF9F ; Alphabetic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0..FFBE ; Alphabetic # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+10000..1000B ; Alphabetic # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; Alphabetic # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; Alphabetic # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; Alphabetic # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; Alphabetic # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; Alphabetic # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; Alphabetic # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+10140..10174 ; Alphabetic # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10280..1029C ; Alphabetic # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+102A0..102D0 ; Alphabetic # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+10300..1031E ; Alphabetic # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10330..10340 ; Alphabetic # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; Alphabetic # Nl GOTHIC LETTER NINETY
+10342..10349 ; Alphabetic # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; Alphabetic # Nl GOTHIC LETTER NINE HUNDRED
+10380..1039D ; Alphabetic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+103A0..103C3 ; Alphabetic # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; Alphabetic # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D1..103D5 ; Alphabetic # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+10400..1044F ; Alphabetic # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+10450..1049D ; Alphabetic # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO
+10800..10805 ; Alphabetic # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; Alphabetic # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; Alphabetic # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; Alphabetic # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; Alphabetic # Lo CYPRIOT SYLLABLE ZA
+1083F..10855 ; Alphabetic # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW
+10900..10915 ; Alphabetic # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10920..10939 ; Alphabetic # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+10A00 ; Alphabetic # Lo KHAROSHTHI LETTER A
+10A01..10A03 ; Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A10..10A13 ; Alphabetic # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; Alphabetic # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; Alphabetic # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A60..10A7C ; Alphabetic # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10B00..10B35 ; Alphabetic # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE
+10B40..10B55 ; Alphabetic # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B60..10B72 ; Alphabetic # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10C00..10C48 ; Alphabetic # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+11082 ; Alphabetic # Mc KAITHI SIGN VISARGA
+11083..110AF ; Alphabetic # Lo [45] KAITHI LETTER A..KAITHI LETTER HA
+110B0..110B2 ; Alphabetic # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B3..110B6 ; Alphabetic # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B7..110B8 ; Alphabetic # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+12000..1236E ; Alphabetic # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462 ; Alphabetic # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+13000..1342E ; Alphabetic # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+1D400..1D454 ; Alphabetic # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; Alphabetic # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Alphabetic # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Alphabetic # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Alphabetic # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Alphabetic # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; Alphabetic # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Alphabetic # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Alphabetic # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; Alphabetic # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Alphabetic # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Alphabetic # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Alphabetic # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; Alphabetic # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Alphabetic # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Alphabetic # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Alphabetic # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Alphabetic # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; Alphabetic # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; Alphabetic # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA ; Alphabetic # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA ; Alphabetic # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714 ; Alphabetic # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734 ; Alphabetic # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E ; Alphabetic # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E ; Alphabetic # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788 ; Alphabetic # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8 ; Alphabetic # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2 ; Alphabetic # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7CB ; Alphabetic # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+20000..2A6D6 ; Alphabetic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; Alphabetic # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2F800..2FA1D ; Alphabetic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 100520
+
+# ================================================
+
+# Derived Property: Lowercase
+# Generated from: Ll + Other_Lowercase
+
+0061..007A ; Lowercase # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; Lowercase # L& FEMININE ORDINAL INDICATOR
+00B5 ; Lowercase # L& MICRO SIGN
+00BA ; Lowercase # L& MASCULINE ORDINAL INDICATOR
+00DF..00F6 ; Lowercase # L& [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..00FF ; Lowercase # L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS
+0101 ; Lowercase # L& LATIN SMALL LETTER A WITH MACRON
+0103 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE
+0105 ; Lowercase # L& LATIN SMALL LETTER A WITH OGONEK
+0107 ; Lowercase # L& LATIN SMALL LETTER C WITH ACUTE
+0109 ; Lowercase # L& LATIN SMALL LETTER C WITH CIRCUMFLEX
+010B ; Lowercase # L& LATIN SMALL LETTER C WITH DOT ABOVE
+010D ; Lowercase # L& LATIN SMALL LETTER C WITH CARON
+010F ; Lowercase # L& LATIN SMALL LETTER D WITH CARON
+0111 ; Lowercase # L& LATIN SMALL LETTER D WITH STROKE
+0113 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON
+0115 ; Lowercase # L& LATIN SMALL LETTER E WITH BREVE
+0117 ; Lowercase # L& LATIN SMALL LETTER E WITH DOT ABOVE
+0119 ; Lowercase # L& LATIN SMALL LETTER E WITH OGONEK
+011B ; Lowercase # L& LATIN SMALL LETTER E WITH CARON
+011D ; Lowercase # L& LATIN SMALL LETTER G WITH CIRCUMFLEX
+011F ; Lowercase # L& LATIN SMALL LETTER G WITH BREVE
+0121 ; Lowercase # L& LATIN SMALL LETTER G WITH DOT ABOVE
+0123 ; Lowercase # L& LATIN SMALL LETTER G WITH CEDILLA
+0125 ; Lowercase # L& LATIN SMALL LETTER H WITH CIRCUMFLEX
+0127 ; Lowercase # L& LATIN SMALL LETTER H WITH STROKE
+0129 ; Lowercase # L& LATIN SMALL LETTER I WITH TILDE
+012B ; Lowercase # L& LATIN SMALL LETTER I WITH MACRON
+012D ; Lowercase # L& LATIN SMALL LETTER I WITH BREVE
+012F ; Lowercase # L& LATIN SMALL LETTER I WITH OGONEK
+0131 ; Lowercase # L& LATIN SMALL LETTER DOTLESS I
+0133 ; Lowercase # L& LATIN SMALL LIGATURE IJ
+0135 ; Lowercase # L& LATIN SMALL LETTER J WITH CIRCUMFLEX
+0137..0138 ; Lowercase # L& [2] LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA
+013A ; Lowercase # L& LATIN SMALL LETTER L WITH ACUTE
+013C ; Lowercase # L& LATIN SMALL LETTER L WITH CEDILLA
+013E ; Lowercase # L& LATIN SMALL LETTER L WITH CARON
+0140 ; Lowercase # L& LATIN SMALL LETTER L WITH MIDDLE DOT
+0142 ; Lowercase # L& LATIN SMALL LETTER L WITH STROKE
+0144 ; Lowercase # L& LATIN SMALL LETTER N WITH ACUTE
+0146 ; Lowercase # L& LATIN SMALL LETTER N WITH CEDILLA
+0148..0149 ; Lowercase # L& [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014B ; Lowercase # L& LATIN SMALL LETTER ENG
+014D ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON
+014F ; Lowercase # L& LATIN SMALL LETTER O WITH BREVE
+0151 ; Lowercase # L& LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0153 ; Lowercase # L& LATIN SMALL LIGATURE OE
+0155 ; Lowercase # L& LATIN SMALL LETTER R WITH ACUTE
+0157 ; Lowercase # L& LATIN SMALL LETTER R WITH CEDILLA
+0159 ; Lowercase # L& LATIN SMALL LETTER R WITH CARON
+015B ; Lowercase # L& LATIN SMALL LETTER S WITH ACUTE
+015D ; Lowercase # L& LATIN SMALL LETTER S WITH CIRCUMFLEX
+015F ; Lowercase # L& LATIN SMALL LETTER S WITH CEDILLA
+0161 ; Lowercase # L& LATIN SMALL LETTER S WITH CARON
+0163 ; Lowercase # L& LATIN SMALL LETTER T WITH CEDILLA
+0165 ; Lowercase # L& LATIN SMALL LETTER T WITH CARON
+0167 ; Lowercase # L& LATIN SMALL LETTER T WITH STROKE
+0169 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE
+016B ; Lowercase # L& LATIN SMALL LETTER U WITH MACRON
+016D ; Lowercase # L& LATIN SMALL LETTER U WITH BREVE
+016F ; Lowercase # L& LATIN SMALL LETTER U WITH RING ABOVE
+0171 ; Lowercase # L& LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0173 ; Lowercase # L& LATIN SMALL LETTER U WITH OGONEK
+0175 ; Lowercase # L& LATIN SMALL LETTER W WITH CIRCUMFLEX
+0177 ; Lowercase # L& LATIN SMALL LETTER Y WITH CIRCUMFLEX
+017A ; Lowercase # L& LATIN SMALL LETTER Z WITH ACUTE
+017C ; Lowercase # L& LATIN SMALL LETTER Z WITH DOT ABOVE
+017E..0180 ; Lowercase # L& [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE
+0183 ; Lowercase # L& LATIN SMALL LETTER B WITH TOPBAR
+0185 ; Lowercase # L& LATIN SMALL LETTER TONE SIX
+0188 ; Lowercase # L& LATIN SMALL LETTER C WITH HOOK
+018C..018D ; Lowercase # L& [2] LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA
+0192 ; Lowercase # L& LATIN SMALL LETTER F WITH HOOK
+0195 ; Lowercase # L& LATIN SMALL LETTER HV
+0199..019B ; Lowercase # L& [3] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE
+019E ; Lowercase # L& LATIN SMALL LETTER N WITH LONG RIGHT LEG
+01A1 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN
+01A3 ; Lowercase # L& LATIN SMALL LETTER OI
+01A5 ; Lowercase # L& LATIN SMALL LETTER P WITH HOOK
+01A8 ; Lowercase # L& LATIN SMALL LETTER TONE TWO
+01AA..01AB ; Lowercase # L& [2] LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK
+01AD ; Lowercase # L& LATIN SMALL LETTER T WITH HOOK
+01B0 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN
+01B4 ; Lowercase # L& LATIN SMALL LETTER Y WITH HOOK
+01B6 ; Lowercase # L& LATIN SMALL LETTER Z WITH STROKE
+01B9..01BA ; Lowercase # L& [2] LATIN SMALL LETTER EZH REVERSED..LATIN SMALL LETTER EZH WITH TAIL
+01BD..01BF ; Lowercase # L& [3] LATIN SMALL LETTER TONE FIVE..LATIN LETTER WYNN
+01C6 ; Lowercase # L& LATIN SMALL LETTER DZ WITH CARON
+01C9 ; Lowercase # L& LATIN SMALL LETTER LJ
+01CC ; Lowercase # L& LATIN SMALL LETTER NJ
+01CE ; Lowercase # L& LATIN SMALL LETTER A WITH CARON
+01D0 ; Lowercase # L& LATIN SMALL LETTER I WITH CARON
+01D2 ; Lowercase # L& LATIN SMALL LETTER O WITH CARON
+01D4 ; Lowercase # L& LATIN SMALL LETTER U WITH CARON
+01D6 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D8 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01DA ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DC..01DD ; Lowercase # L& [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E
+01DF ; Lowercase # L& LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E1 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E3 ; Lowercase # L& LATIN SMALL LETTER AE WITH MACRON
+01E5 ; Lowercase # L& LATIN SMALL LETTER G WITH STROKE
+01E7 ; Lowercase # L& LATIN SMALL LETTER G WITH CARON
+01E9 ; Lowercase # L& LATIN SMALL LETTER K WITH CARON
+01EB ; Lowercase # L& LATIN SMALL LETTER O WITH OGONEK
+01ED ; Lowercase # L& LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EF..01F0 ; Lowercase # L& [2] LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON
+01F3 ; Lowercase # L& LATIN SMALL LETTER DZ
+01F5 ; Lowercase # L& LATIN SMALL LETTER G WITH ACUTE
+01F9 ; Lowercase # L& LATIN SMALL LETTER N WITH GRAVE
+01FB ; Lowercase # L& LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FD ; Lowercase # L& LATIN SMALL LETTER AE WITH ACUTE
+01FF ; Lowercase # L& LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0201 ; Lowercase # L& LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0203 ; Lowercase # L& LATIN SMALL LETTER A WITH INVERTED BREVE
+0205 ; Lowercase # L& LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0207 ; Lowercase # L& LATIN SMALL LETTER E WITH INVERTED BREVE
+0209 ; Lowercase # L& LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020B ; Lowercase # L& LATIN SMALL LETTER I WITH INVERTED BREVE
+020D ; Lowercase # L& LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020F ; Lowercase # L& LATIN SMALL LETTER O WITH INVERTED BREVE
+0211 ; Lowercase # L& LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0213 ; Lowercase # L& LATIN SMALL LETTER R WITH INVERTED BREVE
+0215 ; Lowercase # L& LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0217 ; Lowercase # L& LATIN SMALL LETTER U WITH INVERTED BREVE
+0219 ; Lowercase # L& LATIN SMALL LETTER S WITH COMMA BELOW
+021B ; Lowercase # L& LATIN SMALL LETTER T WITH COMMA BELOW
+021D ; Lowercase # L& LATIN SMALL LETTER YOGH
+021F ; Lowercase # L& LATIN SMALL LETTER H WITH CARON
+0221 ; Lowercase # L& LATIN SMALL LETTER D WITH CURL
+0223 ; Lowercase # L& LATIN SMALL LETTER OU
+0225 ; Lowercase # L& LATIN SMALL LETTER Z WITH HOOK
+0227 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT ABOVE
+0229 ; Lowercase # L& LATIN SMALL LETTER E WITH CEDILLA
+022B ; Lowercase # L& LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022D ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND MACRON
+022F ; Lowercase # L& LATIN SMALL LETTER O WITH DOT ABOVE
+0231 ; Lowercase # L& LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0233..0239 ; Lowercase # L& [7] LATIN SMALL LETTER Y WITH MACRON..LATIN SMALL LETTER QP DIGRAPH
+023C ; Lowercase # L& LATIN SMALL LETTER C WITH STROKE
+023F..0240 ; Lowercase # L& [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL
+0242 ; Lowercase # L& LATIN SMALL LETTER GLOTTAL STOP
+0247 ; Lowercase # L& LATIN SMALL LETTER E WITH STROKE
+0249 ; Lowercase # L& LATIN SMALL LETTER J WITH STROKE
+024B ; Lowercase # L& LATIN SMALL LETTER Q WITH HOOK TAIL
+024D ; Lowercase # L& LATIN SMALL LETTER R WITH STROKE
+024F..0293 ; Lowercase # L& [69] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER EZH WITH CURL
+0295..02AF ; Lowercase # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02B8 ; Lowercase # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02C0..02C1 ; Lowercase # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP
+02E0..02E4 ; Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+0345 ; Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI
+0371 ; Lowercase # L& GREEK SMALL LETTER HETA
+0373 ; Lowercase # L& GREEK SMALL LETTER ARCHAIC SAMPI
+0377 ; Lowercase # L& GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; Lowercase # Lm GREEK YPOGEGRAMMENI
+037B..037D ; Lowercase # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0390 ; Lowercase # L& GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03AC..03CE ; Lowercase # L& [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS
+03D0..03D1 ; Lowercase # L& [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL
+03D5..03D7 ; Lowercase # L& [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL
+03D9 ; Lowercase # L& GREEK SMALL LETTER ARCHAIC KOPPA
+03DB ; Lowercase # L& GREEK SMALL LETTER STIGMA
+03DD ; Lowercase # L& GREEK SMALL LETTER DIGAMMA
+03DF ; Lowercase # L& GREEK SMALL LETTER KOPPA
+03E1 ; Lowercase # L& GREEK SMALL LETTER SAMPI
+03E3 ; Lowercase # L& COPTIC SMALL LETTER SHEI
+03E5 ; Lowercase # L& COPTIC SMALL LETTER FEI
+03E7 ; Lowercase # L& COPTIC SMALL LETTER KHEI
+03E9 ; Lowercase # L& COPTIC SMALL LETTER HORI
+03EB ; Lowercase # L& COPTIC SMALL LETTER GANGIA
+03ED ; Lowercase # L& COPTIC SMALL LETTER SHIMA
+03EF..03F3 ; Lowercase # L& [5] COPTIC SMALL LETTER DEI..GREEK LETTER YOT
+03F5 ; Lowercase # L& GREEK LUNATE EPSILON SYMBOL
+03F8 ; Lowercase # L& GREEK SMALL LETTER SHO
+03FB..03FC ; Lowercase # L& [2] GREEK SMALL LETTER SAN..GREEK RHO WITH STROKE SYMBOL
+0430..045F ; Lowercase # L& [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE
+0461 ; Lowercase # L& CYRILLIC SMALL LETTER OMEGA
+0463 ; Lowercase # L& CYRILLIC SMALL LETTER YAT
+0465 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED E
+0467 ; Lowercase # L& CYRILLIC SMALL LETTER LITTLE YUS
+0469 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046B ; Lowercase # L& CYRILLIC SMALL LETTER BIG YUS
+046D ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046F ; Lowercase # L& CYRILLIC SMALL LETTER KSI
+0471 ; Lowercase # L& CYRILLIC SMALL LETTER PSI
+0473 ; Lowercase # L& CYRILLIC SMALL LETTER FITA
+0475 ; Lowercase # L& CYRILLIC SMALL LETTER IZHITSA
+0477 ; Lowercase # L& CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0479 ; Lowercase # L& CYRILLIC SMALL LETTER UK
+047B ; Lowercase # L& CYRILLIC SMALL LETTER ROUND OMEGA
+047D ; Lowercase # L& CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047F ; Lowercase # L& CYRILLIC SMALL LETTER OT
+0481 ; Lowercase # L& CYRILLIC SMALL LETTER KOPPA
+048B ; Lowercase # L& CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048D ; Lowercase # L& CYRILLIC SMALL LETTER SEMISOFT SIGN
+048F ; Lowercase # L& CYRILLIC SMALL LETTER ER WITH TICK
+0491 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH UPTURN
+0493 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH STROKE
+0495 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0497 ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0499 ; Lowercase # L& CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049B ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH DESCENDER
+049D ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049F ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH STROKE
+04A1 ; Lowercase # L& CYRILLIC SMALL LETTER BASHKIR KA
+04A3 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A5 ; Lowercase # L& CYRILLIC SMALL LIGATURE EN GHE
+04A7 ; Lowercase # L& CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A9 ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN HA
+04AB ; Lowercase # L& CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AD ; Lowercase # L& CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AF ; Lowercase # L& CYRILLIC SMALL LETTER STRAIGHT U
+04B1 ; Lowercase # L& CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B3 ; Lowercase # L& CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B5 ; Lowercase # L& CYRILLIC SMALL LIGATURE TE TSE
+04B7 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B9 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BB ; Lowercase # L& CYRILLIC SMALL LETTER SHHA
+04BD ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BF ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C2 ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C4 ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH HOOK
+04C6 ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH TAIL
+04C8 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH HOOK
+04CA ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH TAIL
+04CC ; Lowercase # L& CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CE..04CF ; Lowercase # L& [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA
+04D1 ; Lowercase # L& CYRILLIC SMALL LETTER A WITH BREVE
+04D3 ; Lowercase # L& CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D5 ; Lowercase # L& CYRILLIC SMALL LIGATURE A IE
+04D7 ; Lowercase # L& CYRILLIC SMALL LETTER IE WITH BREVE
+04D9 ; Lowercase # L& CYRILLIC SMALL LETTER SCHWA
+04DB ; Lowercase # L& CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DD ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DF ; Lowercase # L& CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E1 ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E3 ; Lowercase # L& CYRILLIC SMALL LETTER I WITH MACRON
+04E5 ; Lowercase # L& CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E7 ; Lowercase # L& CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E9 ; Lowercase # L& CYRILLIC SMALL LETTER BARRED O
+04EB ; Lowercase # L& CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04ED ; Lowercase # L& CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EF ; Lowercase # L& CYRILLIC SMALL LETTER U WITH MACRON
+04F1 ; Lowercase # L& CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F3 ; Lowercase # L& CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F5 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F7 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F9 ; Lowercase # L& CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04FB ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FD ; Lowercase # L& CYRILLIC SMALL LETTER HA WITH HOOK
+04FF ; Lowercase # L& CYRILLIC SMALL LETTER HA WITH STROKE
+0501 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DE
+0503 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DJE
+0505 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI ZJE
+0507 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DZJE
+0509 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI LJE
+050B ; Lowercase # L& CYRILLIC SMALL LETTER KOMI NJE
+050D ; Lowercase # L& CYRILLIC SMALL LETTER KOMI SJE
+050F ; Lowercase # L& CYRILLIC SMALL LETTER KOMI TJE
+0511 ; Lowercase # L& CYRILLIC SMALL LETTER REVERSED ZE
+0513 ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH HOOK
+0515 ; Lowercase # L& CYRILLIC SMALL LETTER LHA
+0517 ; Lowercase # L& CYRILLIC SMALL LETTER RHA
+0519 ; Lowercase # L& CYRILLIC SMALL LETTER YAE
+051B ; Lowercase # L& CYRILLIC SMALL LETTER QA
+051D ; Lowercase # L& CYRILLIC SMALL LETTER WE
+051F ; Lowercase # L& CYRILLIC SMALL LETTER ALEUT KA
+0521 ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0523 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0525 ; Lowercase # L& CYRILLIC SMALL LETTER PE WITH DESCENDER
+0561..0587 ; Lowercase # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+1D00..1D2B ; Lowercase # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61 ; Lowercase # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D77 ; Lowercase # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
+1D78 ; Lowercase # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D9A ; Lowercase # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1E01 ; Lowercase # L& LATIN SMALL LETTER A WITH RING BELOW
+1E03 ; Lowercase # L& LATIN SMALL LETTER B WITH DOT ABOVE
+1E05 ; Lowercase # L& LATIN SMALL LETTER B WITH DOT BELOW
+1E07 ; Lowercase # L& LATIN SMALL LETTER B WITH LINE BELOW
+1E09 ; Lowercase # L& LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0B ; Lowercase # L& LATIN SMALL LETTER D WITH DOT ABOVE
+1E0D ; Lowercase # L& LATIN SMALL LETTER D WITH DOT BELOW
+1E0F ; Lowercase # L& LATIN SMALL LETTER D WITH LINE BELOW
+1E11 ; Lowercase # L& LATIN SMALL LETTER D WITH CEDILLA
+1E13 ; Lowercase # L& LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E15 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E17 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E19 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1B ; Lowercase # L& LATIN SMALL LETTER E WITH TILDE BELOW
+1E1D ; Lowercase # L& LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1F ; Lowercase # L& LATIN SMALL LETTER F WITH DOT ABOVE
+1E21 ; Lowercase # L& LATIN SMALL LETTER G WITH MACRON
+1E23 ; Lowercase # L& LATIN SMALL LETTER H WITH DOT ABOVE
+1E25 ; Lowercase # L& LATIN SMALL LETTER H WITH DOT BELOW
+1E27 ; Lowercase # L& LATIN SMALL LETTER H WITH DIAERESIS
+1E29 ; Lowercase # L& LATIN SMALL LETTER H WITH CEDILLA
+1E2B ; Lowercase # L& LATIN SMALL LETTER H WITH BREVE BELOW
+1E2D ; Lowercase # L& LATIN SMALL LETTER I WITH TILDE BELOW
+1E2F ; Lowercase # L& LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E31 ; Lowercase # L& LATIN SMALL LETTER K WITH ACUTE
+1E33 ; Lowercase # L& LATIN SMALL LETTER K WITH DOT BELOW
+1E35 ; Lowercase # L& LATIN SMALL LETTER K WITH LINE BELOW
+1E37 ; Lowercase # L& LATIN SMALL LETTER L WITH DOT BELOW
+1E39 ; Lowercase # L& LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3B ; Lowercase # L& LATIN SMALL LETTER L WITH LINE BELOW
+1E3D ; Lowercase # L& LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3F ; Lowercase # L& LATIN SMALL LETTER M WITH ACUTE
+1E41 ; Lowercase # L& LATIN SMALL LETTER M WITH DOT ABOVE
+1E43 ; Lowercase # L& LATIN SMALL LETTER M WITH DOT BELOW
+1E45 ; Lowercase # L& LATIN SMALL LETTER N WITH DOT ABOVE
+1E47 ; Lowercase # L& LATIN SMALL LETTER N WITH DOT BELOW
+1E49 ; Lowercase # L& LATIN SMALL LETTER N WITH LINE BELOW
+1E4B ; Lowercase # L& LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4D ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4F ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E51 ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E53 ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E55 ; Lowercase # L& LATIN SMALL LETTER P WITH ACUTE
+1E57 ; Lowercase # L& LATIN SMALL LETTER P WITH DOT ABOVE
+1E59 ; Lowercase # L& LATIN SMALL LETTER R WITH DOT ABOVE
+1E5B ; Lowercase # L& LATIN SMALL LETTER R WITH DOT BELOW
+1E5D ; Lowercase # L& LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5F ; Lowercase # L& LATIN SMALL LETTER R WITH LINE BELOW
+1E61 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT ABOVE
+1E63 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT BELOW
+1E65 ; Lowercase # L& LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E67 ; Lowercase # L& LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E69 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6B ; Lowercase # L& LATIN SMALL LETTER T WITH DOT ABOVE
+1E6D ; Lowercase # L& LATIN SMALL LETTER T WITH DOT BELOW
+1E6F ; Lowercase # L& LATIN SMALL LETTER T WITH LINE BELOW
+1E71 ; Lowercase # L& LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E73 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E75 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE BELOW
+1E77 ; Lowercase # L& LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E79 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7B ; Lowercase # L& LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7D ; Lowercase # L& LATIN SMALL LETTER V WITH TILDE
+1E7F ; Lowercase # L& LATIN SMALL LETTER V WITH DOT BELOW
+1E81 ; Lowercase # L& LATIN SMALL LETTER W WITH GRAVE
+1E83 ; Lowercase # L& LATIN SMALL LETTER W WITH ACUTE
+1E85 ; Lowercase # L& LATIN SMALL LETTER W WITH DIAERESIS
+1E87 ; Lowercase # L& LATIN SMALL LETTER W WITH DOT ABOVE
+1E89 ; Lowercase # L& LATIN SMALL LETTER W WITH DOT BELOW
+1E8B ; Lowercase # L& LATIN SMALL LETTER X WITH DOT ABOVE
+1E8D ; Lowercase # L& LATIN SMALL LETTER X WITH DIAERESIS
+1E8F ; Lowercase # L& LATIN SMALL LETTER Y WITH DOT ABOVE
+1E91 ; Lowercase # L& LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E93 ; Lowercase # L& LATIN SMALL LETTER Z WITH DOT BELOW
+1E95..1E9D ; Lowercase # L& [9] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH HIGH STROKE
+1E9F ; Lowercase # L& LATIN SMALL LETTER DELTA
+1EA1 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT BELOW
+1EA3 ; Lowercase # L& LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA5 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA7 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA9 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAB ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAD ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAF ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB1 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB3 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB5 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB7 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB9 ; Lowercase # L& LATIN SMALL LETTER E WITH DOT BELOW
+1EBB ; Lowercase # L& LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBD ; Lowercase # L& LATIN SMALL LETTER E WITH TILDE
+1EBF ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC1 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC3 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC5 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC7 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC9 ; Lowercase # L& LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECB ; Lowercase # L& LATIN SMALL LETTER I WITH DOT BELOW
+1ECD ; Lowercase # L& LATIN SMALL LETTER O WITH DOT BELOW
+1ECF ; Lowercase # L& LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED1 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED3 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED5 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED7 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED9 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDB ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDD ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDF ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE1 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE3 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE5 ; Lowercase # L& LATIN SMALL LETTER U WITH DOT BELOW
+1EE7 ; Lowercase # L& LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE9 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEB ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EED ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEF ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF1 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF3 ; Lowercase # L& LATIN SMALL LETTER Y WITH GRAVE
+1EF5 ; Lowercase # L& LATIN SMALL LETTER Y WITH DOT BELOW
+1EF7 ; Lowercase # L& LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF9 ; Lowercase # L& LATIN SMALL LETTER Y WITH TILDE
+1EFB ; Lowercase # L& LATIN SMALL LETTER MIDDLE-WELSH LL
+1EFD ; Lowercase # L& LATIN SMALL LETTER MIDDLE-WELSH V
+1EFF..1F07 ; Lowercase # L& [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10..1F15 ; Lowercase # L& [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F27 ; Lowercase # L& [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30..1F37 ; Lowercase # L& [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40..1F45 ; Lowercase # L& [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Lowercase # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60..1F67 ; Lowercase # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70..1F7D ; Lowercase # L& [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1F87 ; Lowercase # L& [8] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F90..1F97 ; Lowercase # L& [8] GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA0..1FA7 ; Lowercase # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FB0..1FB4 ; Lowercase # L& [5] GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FB7 ; Lowercase # L& [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FBE ; Lowercase # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; Lowercase # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FC7 ; Lowercase # L& [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FD0..1FD3 ; Lowercase # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FD7 ; Lowercase # L& [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FE0..1FE7 ; Lowercase # L& [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FF2..1FF4 ; Lowercase # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FF7 ; Lowercase # L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+2090..2094 ; Lowercase # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+210A ; Lowercase # L& SCRIPT SMALL G
+210E..210F ; Lowercase # L& [2] PLANCK CONSTANT..PLANCK CONSTANT OVER TWO PI
+2113 ; Lowercase # L& SCRIPT SMALL L
+212F ; Lowercase # L& SCRIPT SMALL E
+2134 ; Lowercase # L& SCRIPT SMALL O
+2139 ; Lowercase # L& INFORMATION SOURCE
+213C..213D ; Lowercase # L& [2] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK SMALL GAMMA
+2146..2149 ; Lowercase # L& [4] DOUBLE-STRUCK ITALIC SMALL D..DOUBLE-STRUCK ITALIC SMALL J
+214E ; Lowercase # L& TURNED SMALL F
+2170..217F ; Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+2184 ; Lowercase # L& LATIN SMALL LETTER REVERSED C
+24D0..24E9 ; Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2C30..2C5E ; Lowercase # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C61 ; Lowercase # L& LATIN SMALL LETTER L WITH DOUBLE BAR
+2C65..2C66 ; Lowercase # L& [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE
+2C68 ; Lowercase # L& LATIN SMALL LETTER H WITH DESCENDER
+2C6A ; Lowercase # L& LATIN SMALL LETTER K WITH DESCENDER
+2C6C ; Lowercase # L& LATIN SMALL LETTER Z WITH DESCENDER
+2C71 ; Lowercase # L& LATIN SMALL LETTER V WITH RIGHT HOOK
+2C73..2C74 ; Lowercase # L& [2] LATIN SMALL LETTER W WITH HOOK..LATIN SMALL LETTER V WITH CURL
+2C76..2C7C ; Lowercase # L& [7] LATIN SMALL LETTER HALF H..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; Lowercase # Lm MODIFIER LETTER CAPITAL V
+2C81 ; Lowercase # L& COPTIC SMALL LETTER ALFA
+2C83 ; Lowercase # L& COPTIC SMALL LETTER VIDA
+2C85 ; Lowercase # L& COPTIC SMALL LETTER GAMMA
+2C87 ; Lowercase # L& COPTIC SMALL LETTER DALDA
+2C89 ; Lowercase # L& COPTIC SMALL LETTER EIE
+2C8B ; Lowercase # L& COPTIC SMALL LETTER SOU
+2C8D ; Lowercase # L& COPTIC SMALL LETTER ZATA
+2C8F ; Lowercase # L& COPTIC SMALL LETTER HATE
+2C91 ; Lowercase # L& COPTIC SMALL LETTER THETHE
+2C93 ; Lowercase # L& COPTIC SMALL LETTER IAUDA
+2C95 ; Lowercase # L& COPTIC SMALL LETTER KAPA
+2C97 ; Lowercase # L& COPTIC SMALL LETTER LAULA
+2C99 ; Lowercase # L& COPTIC SMALL LETTER MI
+2C9B ; Lowercase # L& COPTIC SMALL LETTER NI
+2C9D ; Lowercase # L& COPTIC SMALL LETTER KSI
+2C9F ; Lowercase # L& COPTIC SMALL LETTER O
+2CA1 ; Lowercase # L& COPTIC SMALL LETTER PI
+2CA3 ; Lowercase # L& COPTIC SMALL LETTER RO
+2CA5 ; Lowercase # L& COPTIC SMALL LETTER SIMA
+2CA7 ; Lowercase # L& COPTIC SMALL LETTER TAU
+2CA9 ; Lowercase # L& COPTIC SMALL LETTER UA
+2CAB ; Lowercase # L& COPTIC SMALL LETTER FI
+2CAD ; Lowercase # L& COPTIC SMALL LETTER KHI
+2CAF ; Lowercase # L& COPTIC SMALL LETTER PSI
+2CB1 ; Lowercase # L& COPTIC SMALL LETTER OOU
+2CB3 ; Lowercase # L& COPTIC SMALL LETTER DIALECT-P ALEF
+2CB5 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC AIN
+2CB7 ; Lowercase # L& COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB9 ; Lowercase # L& COPTIC SMALL LETTER DIALECT-P KAPA
+2CBB ; Lowercase # L& COPTIC SMALL LETTER DIALECT-P NI
+2CBD ; Lowercase # L& COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBF ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC OOU
+2CC1 ; Lowercase # L& COPTIC SMALL LETTER SAMPI
+2CC3 ; Lowercase # L& COPTIC SMALL LETTER CROSSED SHEI
+2CC5 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC7 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC ESH
+2CC9 ; Lowercase # L& COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCB ; Lowercase # L& COPTIC SMALL LETTER DIALECT-P HORI
+2CCD ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC HORI
+2CCF ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC HA
+2CD1 ; Lowercase # L& COPTIC SMALL LETTER L-SHAPED HA
+2CD3 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC HEI
+2CD5 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC HAT
+2CD7 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD9 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC DJA
+2CDB ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDD ; Lowercase # L& COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDF ; Lowercase # L& COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE1 ; Lowercase # L& COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE3..2CE4 ; Lowercase # L& [2] COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI
+2CEC ; Lowercase # L& COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+2CEE ; Lowercase # L& COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2D00..2D25 ; Lowercase # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+A641 ; Lowercase # L& CYRILLIC SMALL LETTER ZEMLYA
+A643 ; Lowercase # L& CYRILLIC SMALL LETTER DZELO
+A645 ; Lowercase # L& CYRILLIC SMALL LETTER REVERSED DZE
+A647 ; Lowercase # L& CYRILLIC SMALL LETTER IOTA
+A649 ; Lowercase # L& CYRILLIC SMALL LETTER DJERV
+A64B ; Lowercase # L& CYRILLIC SMALL LETTER MONOGRAPH UK
+A64D ; Lowercase # L& CYRILLIC SMALL LETTER BROAD OMEGA
+A64F ; Lowercase # L& CYRILLIC SMALL LETTER NEUTRAL YER
+A651 ; Lowercase # L& CYRILLIC SMALL LETTER YERU WITH BACK YER
+A653 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED YAT
+A655 ; Lowercase # L& CYRILLIC SMALL LETTER REVERSED YU
+A657 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED A
+A659 ; Lowercase # L& CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A65B ; Lowercase # L& CYRILLIC SMALL LETTER BLENDED YUS
+A65D ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65F ; Lowercase # L& CYRILLIC SMALL LETTER YN
+A663 ; Lowercase # L& CYRILLIC SMALL LETTER SOFT DE
+A665 ; Lowercase # L& CYRILLIC SMALL LETTER SOFT EL
+A667 ; Lowercase # L& CYRILLIC SMALL LETTER SOFT EM
+A669 ; Lowercase # L& CYRILLIC SMALL LETTER MONOCULAR O
+A66B ; Lowercase # L& CYRILLIC SMALL LETTER BINOCULAR O
+A66D ; Lowercase # L& CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A681 ; Lowercase # L& CYRILLIC SMALL LETTER DWE
+A683 ; Lowercase # L& CYRILLIC SMALL LETTER DZWE
+A685 ; Lowercase # L& CYRILLIC SMALL LETTER ZHWE
+A687 ; Lowercase # L& CYRILLIC SMALL LETTER CCHE
+A689 ; Lowercase # L& CYRILLIC SMALL LETTER DZZE
+A68B ; Lowercase # L& CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68D ; Lowercase # L& CYRILLIC SMALL LETTER TWE
+A68F ; Lowercase # L& CYRILLIC SMALL LETTER TSWE
+A691 ; Lowercase # L& CYRILLIC SMALL LETTER TSSE
+A693 ; Lowercase # L& CYRILLIC SMALL LETTER TCHE
+A695 ; Lowercase # L& CYRILLIC SMALL LETTER HWE
+A697 ; Lowercase # L& CYRILLIC SMALL LETTER SHWE
+A723 ; Lowercase # L& LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A725 ; Lowercase # L& LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A727 ; Lowercase # L& LATIN SMALL LETTER HENG
+A729 ; Lowercase # L& LATIN SMALL LETTER TZ
+A72B ; Lowercase # L& LATIN SMALL LETTER TRESILLO
+A72D ; Lowercase # L& LATIN SMALL LETTER CUATRILLO
+A72F..A731 ; Lowercase # L& [3] LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S
+A733 ; Lowercase # L& LATIN SMALL LETTER AA
+A735 ; Lowercase # L& LATIN SMALL LETTER AO
+A737 ; Lowercase # L& LATIN SMALL LETTER AU
+A739 ; Lowercase # L& LATIN SMALL LETTER AV
+A73B ; Lowercase # L& LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+A73D ; Lowercase # L& LATIN SMALL LETTER AY
+A73F ; Lowercase # L& LATIN SMALL LETTER REVERSED C WITH DOT
+A741 ; Lowercase # L& LATIN SMALL LETTER K WITH STROKE
+A743 ; Lowercase # L& LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A745 ; Lowercase # L& LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A747 ; Lowercase # L& LATIN SMALL LETTER BROKEN L
+A749 ; Lowercase # L& LATIN SMALL LETTER L WITH HIGH STROKE
+A74B ; Lowercase # L& LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74D ; Lowercase # L& LATIN SMALL LETTER O WITH LOOP
+A74F ; Lowercase # L& LATIN SMALL LETTER OO
+A751 ; Lowercase # L& LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A753 ; Lowercase # L& LATIN SMALL LETTER P WITH FLOURISH
+A755 ; Lowercase # L& LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A757 ; Lowercase # L& LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A759 ; Lowercase # L& LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A75B ; Lowercase # L& LATIN SMALL LETTER R ROTUNDA
+A75D ; Lowercase # L& LATIN SMALL LETTER RUM ROTUNDA
+A75F ; Lowercase # L& LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A761 ; Lowercase # L& LATIN SMALL LETTER VY
+A763 ; Lowercase # L& LATIN SMALL LETTER VISIGOTHIC Z
+A765 ; Lowercase # L& LATIN SMALL LETTER THORN WITH STROKE
+A767 ; Lowercase # L& LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A769 ; Lowercase # L& LATIN SMALL LETTER VEND
+A76B ; Lowercase # L& LATIN SMALL LETTER ET
+A76D ; Lowercase # L& LATIN SMALL LETTER IS
+A76F ; Lowercase # L& LATIN SMALL LETTER CON
+A770 ; Lowercase # Lm MODIFIER LETTER US
+A771..A778 ; Lowercase # L& [8] LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM
+A77A ; Lowercase # L& LATIN SMALL LETTER INSULAR D
+A77C ; Lowercase # L& LATIN SMALL LETTER INSULAR F
+A77F ; Lowercase # L& LATIN SMALL LETTER TURNED INSULAR G
+A781 ; Lowercase # L& LATIN SMALL LETTER TURNED L
+A783 ; Lowercase # L& LATIN SMALL LETTER INSULAR R
+A785 ; Lowercase # L& LATIN SMALL LETTER INSULAR S
+A787 ; Lowercase # L& LATIN SMALL LETTER INSULAR T
+A78C ; Lowercase # L& LATIN SMALL LETTER SALTILLO
+FB00..FB06 ; Lowercase # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; Lowercase # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FF41..FF5A ; Lowercase # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+10428..1044F ; Lowercase # L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW
+1D41A..1D433 ; Lowercase # L& [26] MATHEMATICAL BOLD SMALL A..MATHEMATICAL BOLD SMALL Z
+1D44E..1D454 ; Lowercase # L& [7] MATHEMATICAL ITALIC SMALL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D467 ; Lowercase # L& [18] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL Z
+1D482..1D49B ; Lowercase # L& [26] MATHEMATICAL BOLD ITALIC SMALL A..MATHEMATICAL BOLD ITALIC SMALL Z
+1D4B6..1D4B9 ; Lowercase # L& [4] MATHEMATICAL SCRIPT SMALL A..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Lowercase # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Lowercase # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D4CF ; Lowercase # L& [11] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL SCRIPT SMALL Z
+1D4EA..1D503 ; Lowercase # L& [26] MATHEMATICAL BOLD SCRIPT SMALL A..MATHEMATICAL BOLD SCRIPT SMALL Z
+1D51E..1D537 ; Lowercase # L& [26] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL FRAKTUR SMALL Z
+1D552..1D56B ; Lowercase # L& [26] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL DOUBLE-STRUCK SMALL Z
+1D586..1D59F ; Lowercase # L& [26] MATHEMATICAL BOLD FRAKTUR SMALL A..MATHEMATICAL BOLD FRAKTUR SMALL Z
+1D5BA..1D5D3 ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF SMALL A..MATHEMATICAL SANS-SERIF SMALL Z
+1D5EE..1D607 ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF BOLD SMALL A..MATHEMATICAL SANS-SERIF BOLD SMALL Z
+1D622..1D63B ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF ITALIC SMALL A..MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+1D656..1D66F ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+1D68A..1D6A5 ; Lowercase # L& [28] MATHEMATICAL MONOSPACE SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6C2..1D6DA ; Lowercase # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6E1 ; Lowercase # L& [6] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL BOLD PI SYMBOL
+1D6FC..1D714 ; Lowercase # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D71B ; Lowercase # L& [6] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL ITALIC PI SYMBOL
+1D736..1D74E ; Lowercase # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D755 ; Lowercase # L& [6] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC PI SYMBOL
+1D770..1D788 ; Lowercase # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D78F ; Lowercase # L& [6] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+1D7AA..1D7C2 ; Lowercase # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7C9 ; Lowercase # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CB ; Lowercase # L& MATHEMATICAL BOLD SMALL DIGAMMA
+
+# Total code points: 1908
+
+# ================================================
+
+# Derived Property: Uppercase
+# Generated from: Lu + Other_Uppercase
+
+0041..005A ; Uppercase # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+00C0..00D6 ; Uppercase # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00DE ; Uppercase # L& [7] LATIN CAPITAL LETTER O WITH STROKE..LATIN CAPITAL LETTER THORN
+0100 ; Uppercase # L& LATIN CAPITAL LETTER A WITH MACRON
+0102 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE
+0104 ; Uppercase # L& LATIN CAPITAL LETTER A WITH OGONEK
+0106 ; Uppercase # L& LATIN CAPITAL LETTER C WITH ACUTE
+0108 ; Uppercase # L& LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+010A ; Uppercase # L& LATIN CAPITAL LETTER C WITH DOT ABOVE
+010C ; Uppercase # L& LATIN CAPITAL LETTER C WITH CARON
+010E ; Uppercase # L& LATIN CAPITAL LETTER D WITH CARON
+0110 ; Uppercase # L& LATIN CAPITAL LETTER D WITH STROKE
+0112 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON
+0114 ; Uppercase # L& LATIN CAPITAL LETTER E WITH BREVE
+0116 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOT ABOVE
+0118 ; Uppercase # L& LATIN CAPITAL LETTER E WITH OGONEK
+011A ; Uppercase # L& LATIN CAPITAL LETTER E WITH CARON
+011C ; Uppercase # L& LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011E ; Uppercase # L& LATIN CAPITAL LETTER G WITH BREVE
+0120 ; Uppercase # L& LATIN CAPITAL LETTER G WITH DOT ABOVE
+0122 ; Uppercase # L& LATIN CAPITAL LETTER G WITH CEDILLA
+0124 ; Uppercase # L& LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0126 ; Uppercase # L& LATIN CAPITAL LETTER H WITH STROKE
+0128 ; Uppercase # L& LATIN CAPITAL LETTER I WITH TILDE
+012A ; Uppercase # L& LATIN CAPITAL LETTER I WITH MACRON
+012C ; Uppercase # L& LATIN CAPITAL LETTER I WITH BREVE
+012E ; Uppercase # L& LATIN CAPITAL LETTER I WITH OGONEK
+0130 ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOT ABOVE
+0132 ; Uppercase # L& LATIN CAPITAL LIGATURE IJ
+0134 ; Uppercase # L& LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0136 ; Uppercase # L& LATIN CAPITAL LETTER K WITH CEDILLA
+0139 ; Uppercase # L& LATIN CAPITAL LETTER L WITH ACUTE
+013B ; Uppercase # L& LATIN CAPITAL LETTER L WITH CEDILLA
+013D ; Uppercase # L& LATIN CAPITAL LETTER L WITH CARON
+013F ; Uppercase # L& LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0141 ; Uppercase # L& LATIN CAPITAL LETTER L WITH STROKE
+0143 ; Uppercase # L& LATIN CAPITAL LETTER N WITH ACUTE
+0145 ; Uppercase # L& LATIN CAPITAL LETTER N WITH CEDILLA
+0147 ; Uppercase # L& LATIN CAPITAL LETTER N WITH CARON
+014A ; Uppercase # L& LATIN CAPITAL LETTER ENG
+014C ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON
+014E ; Uppercase # L& LATIN CAPITAL LETTER O WITH BREVE
+0150 ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0152 ; Uppercase # L& LATIN CAPITAL LIGATURE OE
+0154 ; Uppercase # L& LATIN CAPITAL LETTER R WITH ACUTE
+0156 ; Uppercase # L& LATIN CAPITAL LETTER R WITH CEDILLA
+0158 ; Uppercase # L& LATIN CAPITAL LETTER R WITH CARON
+015A ; Uppercase # L& LATIN CAPITAL LETTER S WITH ACUTE
+015C ; Uppercase # L& LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015E ; Uppercase # L& LATIN CAPITAL LETTER S WITH CEDILLA
+0160 ; Uppercase # L& LATIN CAPITAL LETTER S WITH CARON
+0162 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CEDILLA
+0164 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CARON
+0166 ; Uppercase # L& LATIN CAPITAL LETTER T WITH STROKE
+0168 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE
+016A ; Uppercase # L& LATIN CAPITAL LETTER U WITH MACRON
+016C ; Uppercase # L& LATIN CAPITAL LETTER U WITH BREVE
+016E ; Uppercase # L& LATIN CAPITAL LETTER U WITH RING ABOVE
+0170 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0172 ; Uppercase # L& LATIN CAPITAL LETTER U WITH OGONEK
+0174 ; Uppercase # L& LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0176 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0178..0179 ; Uppercase # L& [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE
+017B ; Uppercase # L& LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017D ; Uppercase # L& LATIN CAPITAL LETTER Z WITH CARON
+0181..0182 ; Uppercase # L& [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR
+0184 ; Uppercase # L& LATIN CAPITAL LETTER TONE SIX
+0186..0187 ; Uppercase # L& [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK
+0189..018B ; Uppercase # L& [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR
+018E..0191 ; Uppercase # L& [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK
+0193..0194 ; Uppercase # L& [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA
+0196..0198 ; Uppercase # L& [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK
+019C..019D ; Uppercase # L& [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK
+019F..01A0 ; Uppercase # L& [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN
+01A2 ; Uppercase # L& LATIN CAPITAL LETTER OI
+01A4 ; Uppercase # L& LATIN CAPITAL LETTER P WITH HOOK
+01A6..01A7 ; Uppercase # L& [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO
+01A9 ; Uppercase # L& LATIN CAPITAL LETTER ESH
+01AC ; Uppercase # L& LATIN CAPITAL LETTER T WITH HOOK
+01AE..01AF ; Uppercase # L& [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN
+01B1..01B3 ; Uppercase # L& [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK
+01B5 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH STROKE
+01B7..01B8 ; Uppercase # L& [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED
+01BC ; Uppercase # L& LATIN CAPITAL LETTER TONE FIVE
+01C4 ; Uppercase # L& LATIN CAPITAL LETTER DZ WITH CARON
+01C7 ; Uppercase # L& LATIN CAPITAL LETTER LJ
+01CA ; Uppercase # L& LATIN CAPITAL LETTER NJ
+01CD ; Uppercase # L& LATIN CAPITAL LETTER A WITH CARON
+01CF ; Uppercase # L& LATIN CAPITAL LETTER I WITH CARON
+01D1 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CARON
+01D3 ; Uppercase # L& LATIN CAPITAL LETTER U WITH CARON
+01D5 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D7 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D9 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DB ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DE ; Uppercase # L& LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01E0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E2 ; Uppercase # L& LATIN CAPITAL LETTER AE WITH MACRON
+01E4 ; Uppercase # L& LATIN CAPITAL LETTER G WITH STROKE
+01E6 ; Uppercase # L& LATIN CAPITAL LETTER G WITH CARON
+01E8 ; Uppercase # L& LATIN CAPITAL LETTER K WITH CARON
+01EA ; Uppercase # L& LATIN CAPITAL LETTER O WITH OGONEK
+01EC ; Uppercase # L& LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01EE ; Uppercase # L& LATIN CAPITAL LETTER EZH WITH CARON
+01F1 ; Uppercase # L& LATIN CAPITAL LETTER DZ
+01F4 ; Uppercase # L& LATIN CAPITAL LETTER G WITH ACUTE
+01F6..01F8 ; Uppercase # L& [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE
+01FA ; Uppercase # L& LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FC ; Uppercase # L& LATIN CAPITAL LETTER AE WITH ACUTE
+01FE ; Uppercase # L& LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+0200 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0202 ; Uppercase # L& LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0204 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0206 ; Uppercase # L& LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0208 ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+020A ; Uppercase # L& LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020C ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020E ; Uppercase # L& LATIN CAPITAL LETTER O WITH INVERTED BREVE
+0210 ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0212 ; Uppercase # L& LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0214 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0216 ; Uppercase # L& LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0218 ; Uppercase # L& LATIN CAPITAL LETTER S WITH COMMA BELOW
+021A ; Uppercase # L& LATIN CAPITAL LETTER T WITH COMMA BELOW
+021C ; Uppercase # L& LATIN CAPITAL LETTER YOGH
+021E ; Uppercase # L& LATIN CAPITAL LETTER H WITH CARON
+0220 ; Uppercase # L& LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0222 ; Uppercase # L& LATIN CAPITAL LETTER OU
+0224 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH HOOK
+0226 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT ABOVE
+0228 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CEDILLA
+022A ; Uppercase # L& LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022C ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022E ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT ABOVE
+0230 ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0232 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH MACRON
+023A..023B ; Uppercase # L& [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE
+023D..023E ; Uppercase # L& [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+0241 ; Uppercase # L& LATIN CAPITAL LETTER GLOTTAL STOP
+0243..0246 ; Uppercase # L& [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE
+0248 ; Uppercase # L& LATIN CAPITAL LETTER J WITH STROKE
+024A ; Uppercase # L& LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024C ; Uppercase # L& LATIN CAPITAL LETTER R WITH STROKE
+024E ; Uppercase # L& LATIN CAPITAL LETTER Y WITH STROKE
+0370 ; Uppercase # L& GREEK CAPITAL LETTER HETA
+0372 ; Uppercase # L& GREEK CAPITAL LETTER ARCHAIC SAMPI
+0376 ; Uppercase # L& GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0386 ; Uppercase # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; Uppercase # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Uppercase # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..038F ; Uppercase # L& [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS
+0391..03A1 ; Uppercase # L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO
+03A3..03AB ; Uppercase # L& [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03CF ; Uppercase # L& GREEK CAPITAL KAI SYMBOL
+03D2..03D4 ; Uppercase # L& [3] GREEK UPSILON WITH HOOK SYMBOL..GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D8 ; Uppercase # L& GREEK LETTER ARCHAIC KOPPA
+03DA ; Uppercase # L& GREEK LETTER STIGMA
+03DC ; Uppercase # L& GREEK LETTER DIGAMMA
+03DE ; Uppercase # L& GREEK LETTER KOPPA
+03E0 ; Uppercase # L& GREEK LETTER SAMPI
+03E2 ; Uppercase # L& COPTIC CAPITAL LETTER SHEI
+03E4 ; Uppercase # L& COPTIC CAPITAL LETTER FEI
+03E6 ; Uppercase # L& COPTIC CAPITAL LETTER KHEI
+03E8 ; Uppercase # L& COPTIC CAPITAL LETTER HORI
+03EA ; Uppercase # L& COPTIC CAPITAL LETTER GANGIA
+03EC ; Uppercase # L& COPTIC CAPITAL LETTER SHIMA
+03EE ; Uppercase # L& COPTIC CAPITAL LETTER DEI
+03F4 ; Uppercase # L& GREEK CAPITAL THETA SYMBOL
+03F7 ; Uppercase # L& GREEK CAPITAL LETTER SHO
+03F9..03FA ; Uppercase # L& [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN
+03FD..042F ; Uppercase # L& [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA
+0460 ; Uppercase # L& CYRILLIC CAPITAL LETTER OMEGA
+0462 ; Uppercase # L& CYRILLIC CAPITAL LETTER YAT
+0464 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED E
+0466 ; Uppercase # L& CYRILLIC CAPITAL LETTER LITTLE YUS
+0468 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046A ; Uppercase # L& CYRILLIC CAPITAL LETTER BIG YUS
+046C ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046E ; Uppercase # L& CYRILLIC CAPITAL LETTER KSI
+0470 ; Uppercase # L& CYRILLIC CAPITAL LETTER PSI
+0472 ; Uppercase # L& CYRILLIC CAPITAL LETTER FITA
+0474 ; Uppercase # L& CYRILLIC CAPITAL LETTER IZHITSA
+0476 ; Uppercase # L& CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478 ; Uppercase # L& CYRILLIC CAPITAL LETTER UK
+047A ; Uppercase # L& CYRILLIC CAPITAL LETTER ROUND OMEGA
+047C ; Uppercase # L& CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047E ; Uppercase # L& CYRILLIC CAPITAL LETTER OT
+0480 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOPPA
+048A ; Uppercase # L& CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048C ; Uppercase # L& CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048E ; Uppercase # L& CYRILLIC CAPITAL LETTER ER WITH TICK
+0490 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0492 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0494 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0496 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0498 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+049A ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049C ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049E ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH STROKE
+04A0 ; Uppercase # L& CYRILLIC CAPITAL LETTER BASHKIR KA
+04A2 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE EN GHE
+04A6 ; Uppercase # L& CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A8 ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04AA ; Uppercase # L& CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AC ; Uppercase # L& CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AE ; Uppercase # L& CYRILLIC CAPITAL LETTER STRAIGHT U
+04B0 ; Uppercase # L& CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B2 ; Uppercase # L& CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE TE TSE
+04B6 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B8 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BA ; Uppercase # L& CYRILLIC CAPITAL LETTER SHHA
+04BC ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BE ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0..04C1 ; Uppercase # L& [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C3 ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C5 ; Uppercase # L& CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C7 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C9 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CB ; Uppercase # L& CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CD ; Uppercase # L& CYRILLIC CAPITAL LETTER EM WITH TAIL
+04D0 ; Uppercase # L& CYRILLIC CAPITAL LETTER A WITH BREVE
+04D2 ; Uppercase # L& CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE A IE
+04D6 ; Uppercase # L& CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D8 ; Uppercase # L& CYRILLIC CAPITAL LETTER SCHWA
+04DA ; Uppercase # L& CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DC ; Uppercase # L& CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DE ; Uppercase # L& CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04E0 ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E2 ; Uppercase # L& CYRILLIC CAPITAL LETTER I WITH MACRON
+04E4 ; Uppercase # L& CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E6 ; Uppercase # L& CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E8 ; Uppercase # L& CYRILLIC CAPITAL LETTER BARRED O
+04EA ; Uppercase # L& CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EC ; Uppercase # L& CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04EE ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH MACRON
+04F0 ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F2 ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F4 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F6 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F8 ; Uppercase # L& CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04FA ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FC ; Uppercase # L& CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FE ; Uppercase # L& CYRILLIC CAPITAL LETTER HA WITH STROKE
+0500 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DE
+0502 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DJE
+0504 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI ZJE
+0506 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DZJE
+0508 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI LJE
+050A ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI NJE
+050C ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI SJE
+050E ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI TJE
+0510 ; Uppercase # L& CYRILLIC CAPITAL LETTER REVERSED ZE
+0512 ; Uppercase # L& CYRILLIC CAPITAL LETTER EL WITH HOOK
+0514 ; Uppercase # L& CYRILLIC CAPITAL LETTER LHA
+0516 ; Uppercase # L& CYRILLIC CAPITAL LETTER RHA
+0518 ; Uppercase # L& CYRILLIC CAPITAL LETTER YAE
+051A ; Uppercase # L& CYRILLIC CAPITAL LETTER QA
+051C ; Uppercase # L& CYRILLIC CAPITAL LETTER WE
+051E ; Uppercase # L& CYRILLIC CAPITAL LETTER ALEUT KA
+0520 ; Uppercase # L& CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0522 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0524 ; Uppercase # L& CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+0531..0556 ; Uppercase # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+10A0..10C5 ; Uppercase # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+1E00 ; Uppercase # L& LATIN CAPITAL LETTER A WITH RING BELOW
+1E02 ; Uppercase # L& LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E04 ; Uppercase # L& LATIN CAPITAL LETTER B WITH DOT BELOW
+1E06 ; Uppercase # L& LATIN CAPITAL LETTER B WITH LINE BELOW
+1E08 ; Uppercase # L& LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E0A ; Uppercase # L& LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0C ; Uppercase # L& LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0E ; Uppercase # L& LATIN CAPITAL LETTER D WITH LINE BELOW
+1E10 ; Uppercase # L& LATIN CAPITAL LETTER D WITH CEDILLA
+1E12 ; Uppercase # L& LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E14 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E16 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E18 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E1A ; Uppercase # L& LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1C ; Uppercase # L& LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1E ; Uppercase # L& LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E20 ; Uppercase # L& LATIN CAPITAL LETTER G WITH MACRON
+1E22 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E24 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DOT BELOW
+1E26 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DIAERESIS
+1E28 ; Uppercase # L& LATIN CAPITAL LETTER H WITH CEDILLA
+1E2A ; Uppercase # L& LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2C ; Uppercase # L& LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2E ; Uppercase # L& LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E30 ; Uppercase # L& LATIN CAPITAL LETTER K WITH ACUTE
+1E32 ; Uppercase # L& LATIN CAPITAL LETTER K WITH DOT BELOW
+1E34 ; Uppercase # L& LATIN CAPITAL LETTER K WITH LINE BELOW
+1E36 ; Uppercase # L& LATIN CAPITAL LETTER L WITH DOT BELOW
+1E38 ; Uppercase # L& LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E3A ; Uppercase # L& LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3C ; Uppercase # L& LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3E ; Uppercase # L& LATIN CAPITAL LETTER M WITH ACUTE
+1E40 ; Uppercase # L& LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E42 ; Uppercase # L& LATIN CAPITAL LETTER M WITH DOT BELOW
+1E44 ; Uppercase # L& LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E46 ; Uppercase # L& LATIN CAPITAL LETTER N WITH DOT BELOW
+1E48 ; Uppercase # L& LATIN CAPITAL LETTER N WITH LINE BELOW
+1E4A ; Uppercase # L& LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4C ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4E ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E50 ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E52 ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E54 ; Uppercase # L& LATIN CAPITAL LETTER P WITH ACUTE
+1E56 ; Uppercase # L& LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E58 ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E5A ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5C ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5E ; Uppercase # L& LATIN CAPITAL LETTER R WITH LINE BELOW
+1E60 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E62 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT BELOW
+1E64 ; Uppercase # L& LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E66 ; Uppercase # L& LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E68 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A ; Uppercase # L& LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6C ; Uppercase # L& LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6E ; Uppercase # L& LATIN CAPITAL LETTER T WITH LINE BELOW
+1E70 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E72 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E74 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E76 ; Uppercase # L& LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E78 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E7A ; Uppercase # L& LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7C ; Uppercase # L& LATIN CAPITAL LETTER V WITH TILDE
+1E7E ; Uppercase # L& LATIN CAPITAL LETTER V WITH DOT BELOW
+1E80 ; Uppercase # L& LATIN CAPITAL LETTER W WITH GRAVE
+1E82 ; Uppercase # L& LATIN CAPITAL LETTER W WITH ACUTE
+1E84 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DIAERESIS
+1E86 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E88 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DOT BELOW
+1E8A ; Uppercase # L& LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8C ; Uppercase # L& LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8E ; Uppercase # L& LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E90 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E92 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E94 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E9E ; Uppercase # L& LATIN CAPITAL LETTER SHARP S
+1EA0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA2 ; Uppercase # L& LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA4 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EB0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB2 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB6 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB8 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOT BELOW
+1EBA ; Uppercase # L& LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBC ; Uppercase # L& LATIN CAPITAL LETTER E WITH TILDE
+1EBE ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8 ; Uppercase # L& LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1ECA ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECC ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECE ; Uppercase # L& LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ED0 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDC ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDE ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EE0 ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE2 ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE4 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE6 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE8 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EEA ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEC ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EEE ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EF0 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF2 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH GRAVE
+1EF4 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF6 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF8 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH TILDE
+1EFA ; Uppercase # L& LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFC ; Uppercase # L& LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFE ; Uppercase # L& LATIN CAPITAL LETTER Y WITH LOOP
+1F08..1F0F ; Uppercase # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F18..1F1D ; Uppercase # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F28..1F2F ; Uppercase # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F38..1F3F ; Uppercase # L& [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F48..1F4D ; Uppercase # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F59 ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F68..1F6F ; Uppercase # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1FB8..1FBB ; Uppercase # L& [4] GREEK CAPITAL LETTER ALPHA WITH VRACHY..GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FC8..1FCB ; Uppercase # L& [4] GREEK CAPITAL LETTER EPSILON WITH VARIA..GREEK CAPITAL LETTER ETA WITH OXIA
+1FD8..1FDB ; Uppercase # L& [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE8..1FEC ; Uppercase # L& [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF8..1FFB ; Uppercase # L& [4] GREEK CAPITAL LETTER OMICRON WITH VARIA..GREEK CAPITAL LETTER OMEGA WITH OXIA
+2102 ; Uppercase # L& DOUBLE-STRUCK CAPITAL C
+2107 ; Uppercase # L& EULER CONSTANT
+210B..210D ; Uppercase # L& [3] SCRIPT CAPITAL H..DOUBLE-STRUCK CAPITAL H
+2110..2112 ; Uppercase # L& [3] SCRIPT CAPITAL I..SCRIPT CAPITAL L
+2115 ; Uppercase # L& DOUBLE-STRUCK CAPITAL N
+2119..211D ; Uppercase # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; Uppercase # L& DOUBLE-STRUCK CAPITAL Z
+2126 ; Uppercase # L& OHM SIGN
+2128 ; Uppercase # L& BLACK-LETTER CAPITAL Z
+212A..212D ; Uppercase # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+2130..2133 ; Uppercase # L& [4] SCRIPT CAPITAL E..SCRIPT CAPITAL M
+213E..213F ; Uppercase # L& [2] DOUBLE-STRUCK CAPITAL GAMMA..DOUBLE-STRUCK CAPITAL PI
+2145 ; Uppercase # L& DOUBLE-STRUCK ITALIC CAPITAL D
+2160..216F ; Uppercase # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND
+2183 ; Uppercase # L& ROMAN NUMERAL REVERSED ONE HUNDRED
+24B6..24CF ; Uppercase # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z
+2C00..2C2E ; Uppercase # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C60 ; Uppercase # L& LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C62..2C64 ; Uppercase # L& [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL
+2C67 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DESCENDER
+2C69 ; Uppercase # L& LATIN CAPITAL LETTER K WITH DESCENDER
+2C6B ; Uppercase # L& LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6D..2C70 ; Uppercase # L& [4] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA
+2C72 ; Uppercase # L& LATIN CAPITAL LETTER W WITH HOOK
+2C75 ; Uppercase # L& LATIN CAPITAL LETTER HALF H
+2C7E..2C80 ; Uppercase # L& [3] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC CAPITAL LETTER ALFA
+2C82 ; Uppercase # L& COPTIC CAPITAL LETTER VIDA
+2C84 ; Uppercase # L& COPTIC CAPITAL LETTER GAMMA
+2C86 ; Uppercase # L& COPTIC CAPITAL LETTER DALDA
+2C88 ; Uppercase # L& COPTIC CAPITAL LETTER EIE
+2C8A ; Uppercase # L& COPTIC CAPITAL LETTER SOU
+2C8C ; Uppercase # L& COPTIC CAPITAL LETTER ZATA
+2C8E ; Uppercase # L& COPTIC CAPITAL LETTER HATE
+2C90 ; Uppercase # L& COPTIC CAPITAL LETTER THETHE
+2C92 ; Uppercase # L& COPTIC CAPITAL LETTER IAUDA
+2C94 ; Uppercase # L& COPTIC CAPITAL LETTER KAPA
+2C96 ; Uppercase # L& COPTIC CAPITAL LETTER LAULA
+2C98 ; Uppercase # L& COPTIC CAPITAL LETTER MI
+2C9A ; Uppercase # L& COPTIC CAPITAL LETTER NI
+2C9C ; Uppercase # L& COPTIC CAPITAL LETTER KSI
+2C9E ; Uppercase # L& COPTIC CAPITAL LETTER O
+2CA0 ; Uppercase # L& COPTIC CAPITAL LETTER PI
+2CA2 ; Uppercase # L& COPTIC CAPITAL LETTER RO
+2CA4 ; Uppercase # L& COPTIC CAPITAL LETTER SIMA
+2CA6 ; Uppercase # L& COPTIC CAPITAL LETTER TAU
+2CA8 ; Uppercase # L& COPTIC CAPITAL LETTER UA
+2CAA ; Uppercase # L& COPTIC CAPITAL LETTER FI
+2CAC ; Uppercase # L& COPTIC CAPITAL LETTER KHI
+2CAE ; Uppercase # L& COPTIC CAPITAL LETTER PSI
+2CB0 ; Uppercase # L& COPTIC CAPITAL LETTER OOU
+2CB2 ; Uppercase # L& COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB4 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB6 ; Uppercase # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB8 ; Uppercase # L& COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CBA ; Uppercase # L& COPTIC CAPITAL LETTER DIALECT-P NI
+2CBC ; Uppercase # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBE ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CC0 ; Uppercase # L& COPTIC CAPITAL LETTER SAMPI
+2CC2 ; Uppercase # L& COPTIC CAPITAL LETTER CROSSED SHEI
+2CC4 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC6 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC8 ; Uppercase # L& COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CCA ; Uppercase # L& COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCC ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCE ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC HA
+2CD0 ; Uppercase # L& COPTIC CAPITAL LETTER L-SHAPED HA
+2CD2 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD4 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD6 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD8 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CDA ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDC ; Uppercase # L& COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDE ; Uppercase # L& COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CE0 ; Uppercase # L& COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE2 ; Uppercase # L& COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CEB ; Uppercase # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+2CED ; Uppercase # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+A640 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZEMLYA
+A642 ; Uppercase # L& CYRILLIC CAPITAL LETTER DZELO
+A644 ; Uppercase # L& CYRILLIC CAPITAL LETTER REVERSED DZE
+A646 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTA
+A648 ; Uppercase # L& CYRILLIC CAPITAL LETTER DJERV
+A64A ; Uppercase # L& CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64C ; Uppercase # L& CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64E ; Uppercase # L& CYRILLIC CAPITAL LETTER NEUTRAL YER
+A650 ; Uppercase # L& CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A652 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A654 ; Uppercase # L& CYRILLIC CAPITAL LETTER REVERSED YU
+A656 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED A
+A658 ; Uppercase # L& CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A65A ; Uppercase # L& CYRILLIC CAPITAL LETTER BLENDED YUS
+A65C ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65E ; Uppercase # L& CYRILLIC CAPITAL LETTER YN
+A662 ; Uppercase # L& CYRILLIC CAPITAL LETTER SOFT DE
+A664 ; Uppercase # L& CYRILLIC CAPITAL LETTER SOFT EL
+A666 ; Uppercase # L& CYRILLIC CAPITAL LETTER SOFT EM
+A668 ; Uppercase # L& CYRILLIC CAPITAL LETTER MONOCULAR O
+A66A ; Uppercase # L& CYRILLIC CAPITAL LETTER BINOCULAR O
+A66C ; Uppercase # L& CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A680 ; Uppercase # L& CYRILLIC CAPITAL LETTER DWE
+A682 ; Uppercase # L& CYRILLIC CAPITAL LETTER DZWE
+A684 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZHWE
+A686 ; Uppercase # L& CYRILLIC CAPITAL LETTER CCHE
+A688 ; Uppercase # L& CYRILLIC CAPITAL LETTER DZZE
+A68A ; Uppercase # L& CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68C ; Uppercase # L& CYRILLIC CAPITAL LETTER TWE
+A68E ; Uppercase # L& CYRILLIC CAPITAL LETTER TSWE
+A690 ; Uppercase # L& CYRILLIC CAPITAL LETTER TSSE
+A692 ; Uppercase # L& CYRILLIC CAPITAL LETTER TCHE
+A694 ; Uppercase # L& CYRILLIC CAPITAL LETTER HWE
+A696 ; Uppercase # L& CYRILLIC CAPITAL LETTER SHWE
+A722 ; Uppercase # L& LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A724 ; Uppercase # L& LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A726 ; Uppercase # L& LATIN CAPITAL LETTER HENG
+A728 ; Uppercase # L& LATIN CAPITAL LETTER TZ
+A72A ; Uppercase # L& LATIN CAPITAL LETTER TRESILLO
+A72C ; Uppercase # L& LATIN CAPITAL LETTER CUATRILLO
+A72E ; Uppercase # L& LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A732 ; Uppercase # L& LATIN CAPITAL LETTER AA
+A734 ; Uppercase # L& LATIN CAPITAL LETTER AO
+A736 ; Uppercase # L& LATIN CAPITAL LETTER AU
+A738 ; Uppercase # L& LATIN CAPITAL LETTER AV
+A73A ; Uppercase # L& LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73C ; Uppercase # L& LATIN CAPITAL LETTER AY
+A73E ; Uppercase # L& LATIN CAPITAL LETTER REVERSED C WITH DOT
+A740 ; Uppercase # L& LATIN CAPITAL LETTER K WITH STROKE
+A742 ; Uppercase # L& LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A744 ; Uppercase # L& LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746 ; Uppercase # L& LATIN CAPITAL LETTER BROKEN L
+A748 ; Uppercase # L& LATIN CAPITAL LETTER L WITH HIGH STROKE
+A74A ; Uppercase # L& LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74C ; Uppercase # L& LATIN CAPITAL LETTER O WITH LOOP
+A74E ; Uppercase # L& LATIN CAPITAL LETTER OO
+A750 ; Uppercase # L& LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A752 ; Uppercase # L& LATIN CAPITAL LETTER P WITH FLOURISH
+A754 ; Uppercase # L& LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A756 ; Uppercase # L& LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A758 ; Uppercase # L& LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A75A ; Uppercase # L& LATIN CAPITAL LETTER R ROTUNDA
+A75C ; Uppercase # L& LATIN CAPITAL LETTER RUM ROTUNDA
+A75E ; Uppercase # L& LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A760 ; Uppercase # L& LATIN CAPITAL LETTER VY
+A762 ; Uppercase # L& LATIN CAPITAL LETTER VISIGOTHIC Z
+A764 ; Uppercase # L& LATIN CAPITAL LETTER THORN WITH STROKE
+A766 ; Uppercase # L& LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768 ; Uppercase # L& LATIN CAPITAL LETTER VEND
+A76A ; Uppercase # L& LATIN CAPITAL LETTER ET
+A76C ; Uppercase # L& LATIN CAPITAL LETTER IS
+A76E ; Uppercase # L& LATIN CAPITAL LETTER CON
+A779 ; Uppercase # L& LATIN CAPITAL LETTER INSULAR D
+A77B ; Uppercase # L& LATIN CAPITAL LETTER INSULAR F
+A77D..A77E ; Uppercase # L& [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G
+A780 ; Uppercase # L& LATIN CAPITAL LETTER TURNED L
+A782 ; Uppercase # L& LATIN CAPITAL LETTER INSULAR R
+A784 ; Uppercase # L& LATIN CAPITAL LETTER INSULAR S
+A786 ; Uppercase # L& LATIN CAPITAL LETTER INSULAR T
+A78B ; Uppercase # L& LATIN CAPITAL LETTER SALTILLO
+FF21..FF3A ; Uppercase # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+10400..10427 ; Uppercase # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW
+1D400..1D419 ; Uppercase # L& [26] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL BOLD CAPITAL Z
+1D434..1D44D ; Uppercase # L& [26] MATHEMATICAL ITALIC CAPITAL A..MATHEMATICAL ITALIC CAPITAL Z
+1D468..1D481 ; Uppercase # L& [26] MATHEMATICAL BOLD ITALIC CAPITAL A..MATHEMATICAL BOLD ITALIC CAPITAL Z
+1D49C ; Uppercase # L& MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Uppercase # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Uppercase # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Uppercase # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Uppercase # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B5 ; Uppercase # L& [8] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT CAPITAL Z
+1D4D0..1D4E9 ; Uppercase # L& [26] MATHEMATICAL BOLD SCRIPT CAPITAL A..MATHEMATICAL BOLD SCRIPT CAPITAL Z
+1D504..1D505 ; Uppercase # L& [2] MATHEMATICAL FRAKTUR CAPITAL A..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Uppercase # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Uppercase # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Uppercase # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D538..1D539 ; Uppercase # L& [2] MATHEMATICAL DOUBLE-STRUCK CAPITAL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Uppercase # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Uppercase # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Uppercase # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Uppercase # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D56C..1D585 ; Uppercase # L& [26] MATHEMATICAL BOLD FRAKTUR CAPITAL A..MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+1D5A0..1D5B9 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF CAPITAL A..MATHEMATICAL SANS-SERIF CAPITAL Z
+1D5D4..1D5ED ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF BOLD CAPITAL A..MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+1D608..1D621 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+1D63C..1D655 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+1D670..1D689 ; Uppercase # L& [26] MATHEMATICAL MONOSPACE CAPITAL A..MATHEMATICAL MONOSPACE CAPITAL Z
+1D6A8..1D6C0 ; Uppercase # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6E2..1D6FA ; Uppercase # L& [25] MATHEMATICAL ITALIC CAPITAL ALPHA..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D71C..1D734 ; Uppercase # L& [25] MATHEMATICAL BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D756..1D76E ; Uppercase # L& [25] MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D790..1D7A8 ; Uppercase # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7CA ; Uppercase # L& MATHEMATICAL BOLD CAPITAL DIGAMMA
+
+# Total code points: 1469
+
+# ================================================
+
+# Derived Property: Cased (Cased)
+# As defined by Unicode Standard Definition D120
+# C has the Lowercase or Uppercase property or has a General_Category value of Titlecase_Letter.
+
+0041..005A ; Cased # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A ; Cased # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; Cased # L& FEMININE ORDINAL INDICATOR
+00B5 ; Cased # L& MICRO SIGN
+00BA ; Cased # L& MASCULINE ORDINAL INDICATOR
+00C0..00D6 ; Cased # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; Cased # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA ; Cased # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BC..01BF ; Cased # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C4..0293 ; Cased # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0295..02AF ; Cased # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02B8 ; Cased # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02C0..02C1 ; Cased # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP
+02E0..02E4 ; Cased # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+0345 ; Cased # Mn COMBINING GREEK YPOGEGRAMMENI
+0370..0373 ; Cased # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0376..0377 ; Cased # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; Cased # Lm GREEK YPOGEGRAMMENI
+037B..037D ; Cased # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0386 ; Cased # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; Cased # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Cased # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; Cased # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03F5 ; Cased # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
+03F7..0481 ; Cased # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
+048A..0525 ; Cased # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+0531..0556 ; Cased # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0561..0587 ; Cased # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+10A0..10C5 ; Cased # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+1D00..1D2B ; Cased # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61 ; Cased # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D77 ; Cased # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
+1D78 ; Cased # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D9A ; Cased # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; Cased # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1E00..1F15 ; Cased # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; Cased # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; Cased # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; Cased # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Cased # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; Cased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Cased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Cased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; Cased # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; Cased # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; Cased # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE ; Cased # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; Cased # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; Cased # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3 ; Cased # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; Cased # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE0..1FEC ; Cased # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4 ; Cased # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; Cased # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2090..2094 ; Cased # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+2102 ; Cased # L& DOUBLE-STRUCK CAPITAL C
+2107 ; Cased # L& EULER CONSTANT
+210A..2113 ; Cased # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; Cased # L& DOUBLE-STRUCK CAPITAL N
+2119..211D ; Cased # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; Cased # L& DOUBLE-STRUCK CAPITAL Z
+2126 ; Cased # L& OHM SIGN
+2128 ; Cased # L& BLACK-LETTER CAPITAL Z
+212A..212D ; Cased # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212F..2134 ; Cased # L& [6] SCRIPT SMALL E..SCRIPT SMALL O
+2139 ; Cased # L& INFORMATION SOURCE
+213C..213F ; Cased # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149 ; Cased # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214E ; Cased # L& TURNED SMALL F
+2160..217F ; Cased # Nl [32] ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+2183..2184 ; Cased # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+24B6..24E9 ; Cased # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2C00..2C2E ; Cased # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; Cased # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C7C ; Cased # L& [29] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; Cased # Lm MODIFIER LETTER CAPITAL V
+2C7E..2CE4 ; Cased # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI
+2CEB..2CEE ; Cased # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2D00..2D25 ; Cased # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+A640..A65F ; Cased # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; Cased # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A680..A697 ; Cased # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+A722..A76F ; Cased # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; Cased # Lm MODIFIER LETTER US
+A771..A787 ; Cased # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A78B..A78C ; Cased # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+FB00..FB06 ; Cased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; Cased # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FF21..FF3A ; Cased # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+10400..1044F ; Cased # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+1D400..1D454 ; Cased # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; Cased # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Cased # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Cased # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Cased # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Cased # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; Cased # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Cased # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Cased # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; Cased # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Cased # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Cased # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Cased # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; Cased # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Cased # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Cased # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Cased # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Cased # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; Cased # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; Cased # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA ; Cased # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA ; Cased # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714 ; Cased # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734 ; Cased # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E ; Cased # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E ; Cased # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788 ; Cased # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8 ; Cased # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2 ; Cased # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7CB ; Cased # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+
+# Total code points: 3408
+
+# ================================================
+
+# Derived Property: Case_Ignorable (CI)
+# As defined by Unicode Standard Definition D121
+# C is defined to be case-ignorable if
+# Word_Break(C) = MidLetter or MidNumLet, or
+# General_Category(C) = Nonspacing_Mark (Mn), Enclosing_Mark (Me), Format (Cf), Modifier_Letter (Lm), or Modifier_Symbol (Sk).
+
+0027 ; Case_Ignorable # Po APOSTROPHE
+002E ; Case_Ignorable # Po FULL STOP
+003A ; Case_Ignorable # Po COLON
+005E ; Case_Ignorable # Sk CIRCUMFLEX ACCENT
+0060 ; Case_Ignorable # Sk GRAVE ACCENT
+00A8 ; Case_Ignorable # Sk DIAERESIS
+00AD ; Case_Ignorable # Cf SOFT HYPHEN
+00AF ; Case_Ignorable # Sk MACRON
+00B4 ; Case_Ignorable # Sk ACUTE ACCENT
+00B7 ; Case_Ignorable # Po MIDDLE DOT
+00B8 ; Case_Ignorable # Sk CEDILLA
+02B0..02C1 ; Case_Ignorable # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5 ; Case_Ignorable # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1 ; Case_Ignorable # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF ; Case_Ignorable # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E0..02E4 ; Case_Ignorable # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5..02EB ; Case_Ignorable # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; Case_Ignorable # Lm MODIFIER LETTER VOICING
+02ED ; Case_Ignorable # Sk MODIFIER LETTER UNASPIRATED
+02EE ; Case_Ignorable # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF ; Case_Ignorable # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0300..036F ; Case_Ignorable # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0374 ; Case_Ignorable # Lm GREEK NUMERAL SIGN
+0375 ; Case_Ignorable # Sk GREEK LOWER NUMERAL SIGN
+037A ; Case_Ignorable # Lm GREEK YPOGEGRAMMENI
+0384..0385 ; Case_Ignorable # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS
+0387 ; Case_Ignorable # Po GREEK ANO TELEIA
+0483..0487 ; Case_Ignorable # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488..0489 ; Case_Ignorable # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+0559 ; Case_Ignorable # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+0591..05BD ; Case_Ignorable # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BF ; Case_Ignorable # Mn HEBREW POINT RAFE
+05C1..05C2 ; Case_Ignorable # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; Case_Ignorable # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; Case_Ignorable # Mn HEBREW POINT QAMATS QATAN
+05F4 ; Case_Ignorable # Po HEBREW PUNCTUATION GERSHAYIM
+0600..0603 ; Case_Ignorable # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
+0610..061A ; Case_Ignorable # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+0640 ; Case_Ignorable # Lm ARABIC TATWEEL
+064B..065E ; Case_Ignorable # Mn [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS
+0670 ; Case_Ignorable # Mn ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC ; Case_Ignorable # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DD ; Case_Ignorable # Cf ARABIC END OF AYAH
+06DE ; Case_Ignorable # Me ARABIC START OF RUB EL HIZB
+06DF..06E4 ; Case_Ignorable # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E5..06E6 ; Case_Ignorable # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8 ; Case_Ignorable # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED ; Case_Ignorable # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+070F ; Case_Ignorable # Cf SYRIAC ABBREVIATION MARK
+0711 ; Case_Ignorable # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..074A ; Case_Ignorable # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0 ; Case_Ignorable # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07EB..07F3 ; Case_Ignorable # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5 ; Case_Ignorable # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07FA ; Case_Ignorable # Lm NKO LAJANYALAN
+0816..0819 ; Case_Ignorable # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081A ; Case_Ignorable # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+081B..0823 ; Case_Ignorable # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0824 ; Case_Ignorable # Lm SAMARITAN MODIFIER LETTER SHORT A
+0825..0827 ; Case_Ignorable # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0828 ; Case_Ignorable # Lm SAMARITAN MODIFIER LETTER I
+0829..082D ; Case_Ignorable # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0900..0902 ; Case_Ignorable # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+093C ; Case_Ignorable # Mn DEVANAGARI SIGN NUKTA
+0941..0948 ; Case_Ignorable # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+094D ; Case_Ignorable # Mn DEVANAGARI SIGN VIRAMA
+0951..0955 ; Case_Ignorable # Mn [5] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN CANDRA LONG E
+0962..0963 ; Case_Ignorable # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0971 ; Case_Ignorable # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0981 ; Case_Ignorable # Mn BENGALI SIGN CANDRABINDU
+09BC ; Case_Ignorable # Mn BENGALI SIGN NUKTA
+09C1..09C4 ; Case_Ignorable # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09CD ; Case_Ignorable # Mn BENGALI SIGN VIRAMA
+09E2..09E3 ; Case_Ignorable # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+0A01..0A02 ; Case_Ignorable # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A3C ; Case_Ignorable # Mn GURMUKHI SIGN NUKTA
+0A41..0A42 ; Case_Ignorable # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; Case_Ignorable # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; Case_Ignorable # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; Case_Ignorable # Mn GURMUKHI SIGN UDAAT
+0A70..0A71 ; Case_Ignorable # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A75 ; Case_Ignorable # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; Case_Ignorable # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0ABC ; Case_Ignorable # Mn GUJARATI SIGN NUKTA
+0AC1..0AC5 ; Case_Ignorable # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; Case_Ignorable # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0ACD ; Case_Ignorable # Mn GUJARATI SIGN VIRAMA
+0AE2..0AE3 ; Case_Ignorable # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01 ; Case_Ignorable # Mn ORIYA SIGN CANDRABINDU
+0B3C ; Case_Ignorable # Mn ORIYA SIGN NUKTA
+0B3F ; Case_Ignorable # Mn ORIYA VOWEL SIGN I
+0B41..0B44 ; Case_Ignorable # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B4D ; Case_Ignorable # Mn ORIYA SIGN VIRAMA
+0B56 ; Case_Ignorable # Mn ORIYA AI LENGTH MARK
+0B62..0B63 ; Case_Ignorable # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B82 ; Case_Ignorable # Mn TAMIL SIGN ANUSVARA
+0BC0 ; Case_Ignorable # Mn TAMIL VOWEL SIGN II
+0BCD ; Case_Ignorable # Mn TAMIL SIGN VIRAMA
+0C3E..0C40 ; Case_Ignorable # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C46..0C48 ; Case_Ignorable # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; Case_Ignorable # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; Case_Ignorable # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C62..0C63 ; Case_Ignorable # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0CBC ; Case_Ignorable # Mn KANNADA SIGN NUKTA
+0CBF ; Case_Ignorable # Mn KANNADA VOWEL SIGN I
+0CC6 ; Case_Ignorable # Mn KANNADA VOWEL SIGN E
+0CCC..0CCD ; Case_Ignorable # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CE2..0CE3 ; Case_Ignorable # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0D41..0D44 ; Case_Ignorable # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D4D ; Case_Ignorable # Mn MALAYALAM SIGN VIRAMA
+0D62..0D63 ; Case_Ignorable # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0DCA ; Case_Ignorable # Mn SINHALA SIGN AL-LAKUNA
+0DD2..0DD4 ; Case_Ignorable # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; Case_Ignorable # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0E31 ; Case_Ignorable # Mn THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A ; Case_Ignorable # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E46 ; Case_Ignorable # Lm THAI CHARACTER MAIYAMOK
+0E47..0E4E ; Case_Ignorable # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0EB1 ; Case_Ignorable # Mn LAO VOWEL SIGN MAI KAN
+0EB4..0EB9 ; Case_Ignorable # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; Case_Ignorable # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EC6 ; Case_Ignorable # Lm LAO KO LA
+0EC8..0ECD ; Case_Ignorable # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
+0F18..0F19 ; Case_Ignorable # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35 ; Case_Ignorable # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37 ; Case_Ignorable # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39 ; Case_Ignorable # Mn TIBETAN MARK TSA -PHRU
+0F71..0F7E ; Case_Ignorable # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F80..0F84 ; Case_Ignorable # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87 ; Case_Ignorable # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F90..0F97 ; Case_Ignorable # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; Case_Ignorable # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6 ; Case_Ignorable # Mn TIBETAN SYMBOL PADMA GDAN
+102D..1030 ; Case_Ignorable # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1032..1037 ; Case_Ignorable # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1039..103A ; Case_Ignorable # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103D..103E ; Case_Ignorable # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+1058..1059 ; Case_Ignorable # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105E..1060 ; Case_Ignorable # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1071..1074 ; Case_Ignorable # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1082 ; Case_Ignorable # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1085..1086 ; Case_Ignorable # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+108D ; Case_Ignorable # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+109D ; Case_Ignorable # Mn MYANMAR VOWEL SIGN AITON AI
+10FC ; Case_Ignorable # Lm MODIFIER LETTER GEORGIAN NAR
+135F ; Case_Ignorable # Mn ETHIOPIC COMBINING GEMINATION MARK
+1712..1714 ; Case_Ignorable # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1732..1734 ; Case_Ignorable # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1752..1753 ; Case_Ignorable # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773 ; Case_Ignorable # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B4..17B5 ; Case_Ignorable # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B7..17BD ; Case_Ignorable # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17C6 ; Case_Ignorable # Mn KHMER SIGN NIKAHIT
+17C9..17D3 ; Case_Ignorable # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17D7 ; Case_Ignorable # Lm KHMER SIGN LEK TOO
+17DD ; Case_Ignorable # Mn KHMER SIGN ATTHACAN
+180B..180D ; Case_Ignorable # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+1843 ; Case_Ignorable # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+18A9 ; Case_Ignorable # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922 ; Case_Ignorable # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1927..1928 ; Case_Ignorable # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1932 ; Case_Ignorable # Mn LIMBU SMALL LETTER ANUSVARA
+1939..193B ; Case_Ignorable # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1A17..1A18 ; Case_Ignorable # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A56 ; Case_Ignorable # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A58..1A5E ; Case_Ignorable # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60 ; Case_Ignorable # Mn TAI THAM SIGN SAKOT
+1A62 ; Case_Ignorable # Mn TAI THAM VOWEL SIGN MAI SAT
+1A65..1A6C ; Case_Ignorable # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A73..1A7C ; Case_Ignorable # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; Case_Ignorable # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1AA7 ; Case_Ignorable # Lm TAI THAM SIGN MAI YAMOK
+1B00..1B03 ; Case_Ignorable # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B34 ; Case_Ignorable # Mn BALINESE SIGN REREKAN
+1B36..1B3A ; Case_Ignorable # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3C ; Case_Ignorable # Mn BALINESE VOWEL SIGN LA LENGA
+1B42 ; Case_Ignorable # Mn BALINESE VOWEL SIGN PEPET
+1B6B..1B73 ; Case_Ignorable # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B80..1B81 ; Case_Ignorable # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1BA2..1BA5 ; Case_Ignorable # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA8..1BA9 ; Case_Ignorable # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1C2C..1C33 ; Case_Ignorable # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C36..1C37 ; Case_Ignorable # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C78..1C7D ; Case_Ignorable # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1CD0..1CD2 ; Case_Ignorable # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD4..1CE0 ; Case_Ignorable # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE2..1CE8 ; Case_Ignorable # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CED ; Case_Ignorable # Mn VEDIC SIGN TIRYAK
+1D2C..1D61 ; Case_Ignorable # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D78 ; Case_Ignorable # Lm MODIFIER LETTER CYRILLIC EN
+1D9B..1DBF ; Case_Ignorable # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1DC0..1DE6 ; Case_Ignorable # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DFD..1DFF ; Case_Ignorable # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1FBD ; Case_Ignorable # Sk GREEK KORONIS
+1FBF..1FC1 ; Case_Ignorable # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FCD..1FCF ; Case_Ignorable # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FDD..1FDF ; Case_Ignorable # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FED..1FEF ; Case_Ignorable # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FFD..1FFE ; Case_Ignorable # Sk [2] GREEK OXIA..GREEK DASIA
+200B..200F ; Case_Ignorable # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK
+2018 ; Case_Ignorable # Pi LEFT SINGLE QUOTATION MARK
+2019 ; Case_Ignorable # Pf RIGHT SINGLE QUOTATION MARK
+2024 ; Case_Ignorable # Po ONE DOT LEADER
+2027 ; Case_Ignorable # Po HYPHENATION POINT
+202A..202E ; Case_Ignorable # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+2060..2064 ; Case_Ignorable # Cf [5] WORD JOINER..INVISIBLE PLUS
+206A..206F ; Case_Ignorable # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+2071 ; Case_Ignorable # Lm SUPERSCRIPT LATIN SMALL LETTER I
+207F ; Case_Ignorable # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094 ; Case_Ignorable # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+20D0..20DC ; Case_Ignorable # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0 ; Case_Ignorable # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; Case_Ignorable # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4 ; Case_Ignorable # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0 ; Case_Ignorable # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+2C7D ; Case_Ignorable # Lm MODIFIER LETTER CAPITAL V
+2CEF..2CF1 ; Case_Ignorable # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2D6F ; Case_Ignorable # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2DE0..2DFF ; Case_Ignorable # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+2E2F ; Case_Ignorable # Lm VERTICAL TILDE
+3005 ; Case_Ignorable # Lm IDEOGRAPHIC ITERATION MARK
+302A..302F ; Case_Ignorable # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3031..3035 ; Case_Ignorable # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+303B ; Case_Ignorable # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+3099..309A ; Case_Ignorable # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B..309C ; Case_Ignorable # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D..309E ; Case_Ignorable # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+30FC..30FE ; Case_Ignorable # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+A015 ; Case_Ignorable # Lm YI SYLLABLE WU
+A4F8..A4FD ; Case_Ignorable # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A60C ; Case_Ignorable # Lm VAI SYLLABLE LENGTHENER
+A66F ; Case_Ignorable # Mn COMBINING CYRILLIC VZMET
+A670..A672 ; Case_Ignorable # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A67C..A67D ; Case_Ignorable # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67F ; Case_Ignorable # Lm CYRILLIC PAYEROK
+A6F0..A6F1 ; Case_Ignorable # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A700..A716 ; Case_Ignorable # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717..A71F ; Case_Ignorable # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720..A721 ; Case_Ignorable # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+A770 ; Case_Ignorable # Lm MODIFIER LETTER US
+A788 ; Case_Ignorable # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789..A78A ; Case_Ignorable # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN
+A802 ; Case_Ignorable # Mn SYLOTI NAGRI SIGN DVISVARA
+A806 ; Case_Ignorable # Mn SYLOTI NAGRI SIGN HASANTA
+A80B ; Case_Ignorable # Mn SYLOTI NAGRI SIGN ANUSVARA
+A825..A826 ; Case_Ignorable # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A8C4 ; Case_Ignorable # Mn SAURASHTRA SIGN VIRAMA
+A8E0..A8F1 ; Case_Ignorable # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A926..A92D ; Case_Ignorable # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A947..A951 ; Case_Ignorable # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A980..A982 ; Case_Ignorable # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A9B3 ; Case_Ignorable # Mn JAVANESE SIGN CECAK TELU
+A9B6..A9B9 ; Case_Ignorable # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BC ; Case_Ignorable # Mn JAVANESE VOWEL SIGN PEPET
+A9CF ; Case_Ignorable # Lm JAVANESE PANGRANGKEP
+AA29..AA2E ; Case_Ignorable # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA31..AA32 ; Case_Ignorable # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA35..AA36 ; Case_Ignorable # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA43 ; Case_Ignorable # Mn CHAM CONSONANT SIGN FINAL NG
+AA4C ; Case_Ignorable # Mn CHAM CONSONANT SIGN FINAL M
+AA70 ; Case_Ignorable # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AAB0 ; Case_Ignorable # Mn TAI VIET MAI KANG
+AAB2..AAB4 ; Case_Ignorable # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB7..AAB8 ; Case_Ignorable # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AABE..AABF ; Case_Ignorable # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC1 ; Case_Ignorable # Mn TAI VIET TONE MAI THO
+AADD ; Case_Ignorable # Lm TAI VIET SYMBOL SAM
+ABE5 ; Case_Ignorable # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE8 ; Case_Ignorable # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABED ; Case_Ignorable # Mn MEETEI MAYEK APUN IYEK
+FB1E ; Case_Ignorable # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FE00..FE0F ; Case_Ignorable # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE13 ; Case_Ignorable # Po PRESENTATION FORM FOR VERTICAL COLON
+FE20..FE26 ; Case_Ignorable # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+FE52 ; Case_Ignorable # Po SMALL FULL STOP
+FE55 ; Case_Ignorable # Po SMALL COLON
+FEFF ; Case_Ignorable # Cf ZERO WIDTH NO-BREAK SPACE
+FF07 ; Case_Ignorable # Po FULLWIDTH APOSTROPHE
+FF0E ; Case_Ignorable # Po FULLWIDTH FULL STOP
+FF1A ; Case_Ignorable # Po FULLWIDTH COLON
+FF3E ; Case_Ignorable # Sk FULLWIDTH CIRCUMFLEX ACCENT
+FF40 ; Case_Ignorable # Sk FULLWIDTH GRAVE ACCENT
+FF70 ; Case_Ignorable # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF9E..FF9F ; Case_Ignorable # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFE3 ; Case_Ignorable # Sk FULLWIDTH MACRON
+FFF9..FFFB ; Case_Ignorable # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+101FD ; Case_Ignorable # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10A01..10A03 ; Case_Ignorable # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; Case_Ignorable # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; Case_Ignorable # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A38..10A3A ; Case_Ignorable # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; Case_Ignorable # Mn KHAROSHTHI VIRAMA
+11080..11081 ; Case_Ignorable # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
+110B3..110B6 ; Case_Ignorable # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B9..110BA ; Case_Ignorable # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+110BD ; Case_Ignorable # Cf KAITHI NUMBER SIGN
+1D167..1D169 ; Case_Ignorable # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D173..1D17A ; Case_Ignorable # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1D17B..1D182 ; Case_Ignorable # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; Case_Ignorable # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; Case_Ignorable # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D242..1D244 ; Case_Ignorable # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+E0001 ; Case_Ignorable # Cf LANGUAGE TAG
+E0020..E007F ; Case_Ignorable # Cf [96] TAG SPACE..CANCEL TAG
+E0100..E01EF ; Case_Ignorable # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 1632
+
+# ================================================
+
+# Derived Property: Changes_When_Lowercased (CWL)
+# Characters whose normalized forms are not stable under a toLowercase mapping.
+# For more information, see D124 in Section 3.13, "Default Case Algorithms".
+# Changes_When_Lowercased(X) is true when toLowercase(toNFD(X)) != toNFD(X)
+
+0041..005A ; Changes_When_Lowercased # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+00C0..00D6 ; Changes_When_Lowercased # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00DE ; Changes_When_Lowercased # L& [7] LATIN CAPITAL LETTER O WITH STROKE..LATIN CAPITAL LETTER THORN
+0100 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH MACRON
+0102 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE
+0104 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH OGONEK
+0106 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH ACUTE
+0108 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+010A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH DOT ABOVE
+010C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH CARON
+010E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH CARON
+0110 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH STROKE
+0112 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH MACRON
+0114 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH BREVE
+0116 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH DOT ABOVE
+0118 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH OGONEK
+011A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CARON
+011C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH BREVE
+0120 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH DOT ABOVE
+0122 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH CEDILLA
+0124 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0126 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH STROKE
+0128 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH TILDE
+012A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH MACRON
+012C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH BREVE
+012E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH OGONEK
+0130 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH DOT ABOVE
+0132 ; Changes_When_Lowercased # L& LATIN CAPITAL LIGATURE IJ
+0134 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0136 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH CEDILLA
+0139 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH ACUTE
+013B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH CEDILLA
+013D ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH CARON
+013F ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0141 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH STROKE
+0143 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH ACUTE
+0145 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH CEDILLA
+0147 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH CARON
+014A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER ENG
+014C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH MACRON
+014E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH BREVE
+0150 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0152 ; Changes_When_Lowercased # L& LATIN CAPITAL LIGATURE OE
+0154 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH ACUTE
+0156 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH CEDILLA
+0158 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH CARON
+015A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH ACUTE
+015C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH CEDILLA
+0160 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH CARON
+0162 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH CEDILLA
+0164 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH CARON
+0166 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH STROKE
+0168 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH TILDE
+016A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH MACRON
+016C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH BREVE
+016E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH RING ABOVE
+0170 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0172 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH OGONEK
+0174 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0176 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0178..0179 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE
+017B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017D ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH CARON
+0181..0182 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR
+0184 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TONE SIX
+0186..0187 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK
+0189..018B ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR
+018E..0191 ; Changes_When_Lowercased # L& [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK
+0193..0194 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA
+0196..0198 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK
+019C..019D ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK
+019F..01A0 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN
+01A2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER OI
+01A4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH HOOK
+01A6..01A7 ; Changes_When_Lowercased # L& [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO
+01A9 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER ESH
+01AC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH HOOK
+01AE..01AF ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN
+01B1..01B3 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK
+01B5 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH STROKE
+01B7..01B8 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED
+01BC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TONE FIVE
+01C4..01C5 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C7..01C8 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER LJ..LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01CA..01CB ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER NJ..LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CD ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CARON
+01CF ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH CARON
+01D1 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CARON
+01D3 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH CARON
+01D5 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D7 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D9 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DB ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01E0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AE WITH MACRON
+01E4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH STROKE
+01E6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH CARON
+01E8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH CARON
+01EA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH OGONEK
+01EC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01EE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER EZH WITH CARON
+01F1..01F2 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER DZ..LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH ACUTE
+01F6..01F8 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE
+01FA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AE WITH ACUTE
+01FE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+0200 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0202 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0204 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0206 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0208 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+020A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH INVERTED BREVE
+0210 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0212 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0214 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0216 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0218 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH COMMA BELOW
+021A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH COMMA BELOW
+021C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER YOGH
+021E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH CARON
+0220 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0222 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER OU
+0224 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH HOOK
+0226 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DOT ABOVE
+0228 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CEDILLA
+022A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOT ABOVE
+0230 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0232 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH MACRON
+023A..023B ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE
+023D..023E ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+0241 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER GLOTTAL STOP
+0243..0246 ; Changes_When_Lowercased # L& [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE
+0248 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER J WITH STROKE
+024A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH STROKE
+024E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH STROKE
+0370 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER HETA
+0372 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER ARCHAIC SAMPI
+0376 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0386 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; Changes_When_Lowercased # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..038F ; Changes_When_Lowercased # L& [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS
+0391..03A1 ; Changes_When_Lowercased # L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO
+03A3..03AB ; Changes_When_Lowercased # L& [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03CF ; Changes_When_Lowercased # L& GREEK CAPITAL KAI SYMBOL
+03D8 ; Changes_When_Lowercased # L& GREEK LETTER ARCHAIC KOPPA
+03DA ; Changes_When_Lowercased # L& GREEK LETTER STIGMA
+03DC ; Changes_When_Lowercased # L& GREEK LETTER DIGAMMA
+03DE ; Changes_When_Lowercased # L& GREEK LETTER KOPPA
+03E0 ; Changes_When_Lowercased # L& GREEK LETTER SAMPI
+03E2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SHEI
+03E4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER FEI
+03E6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER KHEI
+03E8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER HORI
+03EA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER GANGIA
+03EC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SHIMA
+03EE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DEI
+03F4 ; Changes_When_Lowercased # L& GREEK CAPITAL THETA SYMBOL
+03F7 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER SHO
+03F9..03FA ; Changes_When_Lowercased # L& [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN
+03FD..042F ; Changes_When_Lowercased # L& [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA
+0460 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER OMEGA
+0462 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YAT
+0464 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED E
+0466 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER LITTLE YUS
+0468 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BIG YUS
+046C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KSI
+0470 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER PSI
+0472 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER FITA
+0474 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IZHITSA
+0476 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER UK
+047A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ROUND OMEGA
+047C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER OT
+0480 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOPPA
+048A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ER WITH TICK
+0490 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0492 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0494 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0496 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0498 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+049A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KA WITH STROKE
+04A0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BASHKIR KA
+04A2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LIGATURE EN GHE
+04A6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04AA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER STRAIGHT U
+04B0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LIGATURE TE TSE
+04B6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SHHA
+04BC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0..04C1 ; Changes_When_Lowercased # L& [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C3 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C5 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C7 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C9 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CB ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CD ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EM WITH TAIL
+04D0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER A WITH BREVE
+04D2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LIGATURE A IE
+04D6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SCHWA
+04DA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04E0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER I WITH MACRON
+04E4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BARRED O
+04EA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04EE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER U WITH MACRON
+04F0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04FA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER HA WITH STROKE
+0500 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI DE
+0502 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI DJE
+0504 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI ZJE
+0506 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI DZJE
+0508 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI LJE
+050A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI NJE
+050C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI SJE
+050E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI TJE
+0510 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER REVERSED ZE
+0512 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EL WITH HOOK
+0514 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER LHA
+0516 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER RHA
+0518 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YAE
+051A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER QA
+051C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER WE
+051E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ALEUT KA
+0520 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0522 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0524 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+0531..0556 ; Changes_When_Lowercased # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+10A0..10C5 ; Changes_When_Lowercased # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+1E00 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH RING BELOW
+1E02 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E04 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER B WITH DOT BELOW
+1E06 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER B WITH LINE BELOW
+1E08 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E0A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH LINE BELOW
+1E10 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH CEDILLA
+1E12 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E14 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E16 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E18 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E1A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E20 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH MACRON
+1E22 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E24 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH DOT BELOW
+1E26 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH DIAERESIS
+1E28 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH CEDILLA
+1E2A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E30 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH ACUTE
+1E32 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH DOT BELOW
+1E34 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH LINE BELOW
+1E36 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH DOT BELOW
+1E38 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E3A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER M WITH ACUTE
+1E40 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E42 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER M WITH DOT BELOW
+1E44 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E46 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH DOT BELOW
+1E48 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH LINE BELOW
+1E4A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E50 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E52 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E54 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH ACUTE
+1E56 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E58 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E5A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH LINE BELOW
+1E60 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E62 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH DOT BELOW
+1E64 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E66 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E68 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH LINE BELOW
+1E70 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E72 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E74 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E76 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E78 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E7A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER V WITH TILDE
+1E7E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER V WITH DOT BELOW
+1E80 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH GRAVE
+1E82 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH ACUTE
+1E84 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH DIAERESIS
+1E86 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E88 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH DOT BELOW
+1E8A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E90 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E92 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E94 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E9E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER SHARP S
+1EA0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EB0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH DOT BELOW
+1EBA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH TILDE
+1EBE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1ECA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ED0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EE0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EEA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EEE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EF0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH GRAVE
+1EF4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH TILDE
+1EFA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH LOOP
+1F08..1F0F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F18..1F1D ; Changes_When_Lowercased # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F28..1F2F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F38..1F3F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F48..1F4D ; Changes_When_Lowercased # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F59 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F68..1F6F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F88..1F8F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F98..1F9F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA8..1FAF ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB8..1FBC ; Changes_When_Lowercased # L& [5] GREEK CAPITAL LETTER ALPHA WITH VRACHY..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FC8..1FCC ; Changes_When_Lowercased # L& [5] GREEK CAPITAL LETTER EPSILON WITH VARIA..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD8..1FDB ; Changes_When_Lowercased # L& [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE8..1FEC ; Changes_When_Lowercased # L& [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF8..1FFC ; Changes_When_Lowercased # L& [5] GREEK CAPITAL LETTER OMICRON WITH VARIA..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2126 ; Changes_When_Lowercased # L& OHM SIGN
+212A..212B ; Changes_When_Lowercased # L& [2] KELVIN SIGN..ANGSTROM SIGN
+2132 ; Changes_When_Lowercased # L& TURNED CAPITAL F
+2160..216F ; Changes_When_Lowercased # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND
+2183 ; Changes_When_Lowercased # L& ROMAN NUMERAL REVERSED ONE HUNDRED
+24B6..24CF ; Changes_When_Lowercased # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z
+2C00..2C2E ; Changes_When_Lowercased # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C60 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C62..2C64 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL
+2C67 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH DESCENDER
+2C69 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH DESCENDER
+2C6B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6D..2C70 ; Changes_When_Lowercased # L& [4] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA
+2C72 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH HOOK
+2C75 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER HALF H
+2C7E..2C80 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC CAPITAL LETTER ALFA
+2C82 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER VIDA
+2C84 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER GAMMA
+2C86 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DALDA
+2C88 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER EIE
+2C8A ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SOU
+2C8C ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER ZATA
+2C8E ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER HATE
+2C90 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER THETHE
+2C92 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER IAUDA
+2C94 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER KAPA
+2C96 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER LAULA
+2C98 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER MI
+2C9A ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER NI
+2C9C ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER KSI
+2C9E ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER O
+2CA0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER PI
+2CA2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER RO
+2CA4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SIMA
+2CA6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER TAU
+2CA8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER UA
+2CAA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER FI
+2CAC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER KHI
+2CAE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER PSI
+2CB0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OOU
+2CB2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CBA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DIALECT-P NI
+2CBC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CC0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SAMPI
+2CC2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CROSSED SHEI
+2CC4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CCA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC HA
+2CD0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER L-SHAPED HA
+2CD2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CDA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CE0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CEB ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+2CED ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+A640 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZEMLYA
+A642 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DZELO
+A644 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER REVERSED DZE
+A646 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTA
+A648 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DJERV
+A64A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER NEUTRAL YER
+A650 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A652 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A654 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER REVERSED YU
+A656 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED A
+A658 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A65A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BLENDED YUS
+A65C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YN
+A662 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SOFT DE
+A664 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SOFT EL
+A666 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SOFT EM
+A668 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER MONOCULAR O
+A66A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BINOCULAR O
+A66C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A680 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DWE
+A682 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DZWE
+A684 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZHWE
+A686 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CCHE
+A688 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DZZE
+A68A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TWE
+A68E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TSWE
+A690 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TSSE
+A692 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TCHE
+A694 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER HWE
+A696 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SHWE
+A722 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A724 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A726 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER HENG
+A728 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TZ
+A72A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TRESILLO
+A72C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER CUATRILLO
+A72E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A732 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AA
+A734 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AO
+A736 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AU
+A738 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AV
+A73A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AY
+A73E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER REVERSED C WITH DOT
+A740 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH STROKE
+A742 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A744 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER BROKEN L
+A748 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH HIGH STROKE
+A74A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH LOOP
+A74E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER OO
+A750 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A752 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH FLOURISH
+A754 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A756 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A758 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A75A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R ROTUNDA
+A75C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER RUM ROTUNDA
+A75E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A760 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VY
+A762 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VISIGOTHIC Z
+A764 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER THORN WITH STROKE
+A766 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VEND
+A76A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER ET
+A76C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER IS
+A76E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER CON
+A779 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR D
+A77B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR F
+A77D..A77E ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G
+A780 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TURNED L
+A782 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR R
+A784 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR S
+A786 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR T
+A78B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER SALTILLO
+FF21..FF3A ; Changes_When_Lowercased # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+10400..10427 ; Changes_When_Lowercased # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW
+
+# Total code points: 1029
+
+# ================================================
+
+# Derived Property: Changes_When_Uppercased (CWU)
+# Characters whose normalized forms are not stable under a toUppercase mapping.
+# For more information, see D125 in Section 3.13, "Default Case Algorithms".
+# Changes_When_Uppercased(X) is true when toUppercase(toNFD(X)) != toNFD(X)
+
+0061..007A ; Changes_When_Uppercased # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00B5 ; Changes_When_Uppercased # L& MICRO SIGN
+00DF..00F6 ; Changes_When_Uppercased # L& [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..00FF ; Changes_When_Uppercased # L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS
+0101 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH MACRON
+0103 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE
+0105 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH OGONEK
+0107 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH ACUTE
+0109 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH CIRCUMFLEX
+010B ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH DOT ABOVE
+010D ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH CARON
+010F ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH CARON
+0111 ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH STROKE
+0113 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH MACRON
+0115 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH BREVE
+0117 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH DOT ABOVE
+0119 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH OGONEK
+011B ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CARON
+011D ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH CIRCUMFLEX
+011F ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH BREVE
+0121 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH DOT ABOVE
+0123 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH CEDILLA
+0125 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH CIRCUMFLEX
+0127 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH STROKE
+0129 ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH TILDE
+012B ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH MACRON
+012D ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH BREVE
+012F ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH OGONEK
+0131 ; Changes_When_Uppercased # L& LATIN SMALL LETTER DOTLESS I
+0133 ; Changes_When_Uppercased # L& LATIN SMALL LIGATURE IJ
+0135 ; Changes_When_Uppercased # L& LATIN SMALL LETTER J WITH CIRCUMFLEX
+0137 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH CEDILLA
+013A ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH ACUTE
+013C ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH CEDILLA
+013E ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH CARON
+0140 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH MIDDLE DOT
+0142 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH STROKE
+0144 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH ACUTE
+0146 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH CEDILLA
+0148..0149 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014B ; Changes_When_Uppercased # L& LATIN SMALL LETTER ENG
+014D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH MACRON
+014F ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH BREVE
+0151 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0153 ; Changes_When_Uppercased # L& LATIN SMALL LIGATURE OE
+0155 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH ACUTE
+0157 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH CEDILLA
+0159 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH CARON
+015B ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH ACUTE
+015D ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH CIRCUMFLEX
+015F ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH CEDILLA
+0161 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH CARON
+0163 ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH CEDILLA
+0165 ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH CARON
+0167 ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH STROKE
+0169 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH TILDE
+016B ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH MACRON
+016D ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH BREVE
+016F ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH RING ABOVE
+0171 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0173 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH OGONEK
+0175 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH CIRCUMFLEX
+0177 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH CIRCUMFLEX
+017A ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH ACUTE
+017C ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH DOT ABOVE
+017E..0180 ; Changes_When_Uppercased # L& [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE
+0183 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH TOPBAR
+0185 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TONE SIX
+0188 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH HOOK
+018C ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH TOPBAR
+0192 ; Changes_When_Uppercased # L& LATIN SMALL LETTER F WITH HOOK
+0195 ; Changes_When_Uppercased # L& LATIN SMALL LETTER HV
+0199..019A ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER L WITH BAR
+019E ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH LONG RIGHT LEG
+01A1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN
+01A3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER OI
+01A5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH HOOK
+01A8 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TONE TWO
+01AD ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH HOOK
+01B0 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN
+01B4 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH HOOK
+01B6 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH STROKE
+01B9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER EZH REVERSED
+01BD ; Changes_When_Uppercased # L& LATIN SMALL LETTER TONE FIVE
+01BF ; Changes_When_Uppercased # L& LATIN LETTER WYNN
+01C5..01C6 ; Changes_When_Uppercased # L& [2] LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON..LATIN SMALL LETTER DZ WITH CARON
+01C8..01C9 ; Changes_When_Uppercased # L& [2] LATIN CAPITAL LETTER L WITH SMALL LETTER J..LATIN SMALL LETTER LJ
+01CB..01CC ; Changes_When_Uppercased # L& [2] LATIN CAPITAL LETTER N WITH SMALL LETTER J..LATIN SMALL LETTER NJ
+01CE ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CARON
+01D0 ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH CARON
+01D2 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CARON
+01D4 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH CARON
+01D6 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D8 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01DA ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DC..01DD ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E
+01DF ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AE WITH MACRON
+01E5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH STROKE
+01E7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH CARON
+01E9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH CARON
+01EB ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH OGONEK
+01ED ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EF..01F0 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON
+01F2..01F3 ; Changes_When_Uppercased # L& [2] LATIN CAPITAL LETTER D WITH SMALL LETTER Z..LATIN SMALL LETTER DZ
+01F5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH ACUTE
+01F9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH GRAVE
+01FB ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FD ; Changes_When_Uppercased # L& LATIN SMALL LETTER AE WITH ACUTE
+01FF ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0201 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0203 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH INVERTED BREVE
+0205 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0207 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH INVERTED BREVE
+0209 ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020B ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH INVERTED BREVE
+020D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020F ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH INVERTED BREVE
+0211 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0213 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH INVERTED BREVE
+0215 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0217 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH INVERTED BREVE
+0219 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH COMMA BELOW
+021B ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH COMMA BELOW
+021D ; Changes_When_Uppercased # L& LATIN SMALL LETTER YOGH
+021F ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH CARON
+0223 ; Changes_When_Uppercased # L& LATIN SMALL LETTER OU
+0225 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH HOOK
+0227 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DOT ABOVE
+0229 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CEDILLA
+022B ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH TILDE AND MACRON
+022F ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOT ABOVE
+0231 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0233 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH MACRON
+023C ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH STROKE
+023F..0240 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL
+0242 ; Changes_When_Uppercased # L& LATIN SMALL LETTER GLOTTAL STOP
+0247 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH STROKE
+0249 ; Changes_When_Uppercased # L& LATIN SMALL LETTER J WITH STROKE
+024B ; Changes_When_Uppercased # L& LATIN SMALL LETTER Q WITH HOOK TAIL
+024D ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH STROKE
+024F..0254 ; Changes_When_Uppercased # L& [6] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER OPEN O
+0256..0257 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER D WITH TAIL..LATIN SMALL LETTER D WITH HOOK
+0259 ; Changes_When_Uppercased # L& LATIN SMALL LETTER SCHWA
+025B ; Changes_When_Uppercased # L& LATIN SMALL LETTER OPEN E
+0260 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH HOOK
+0263 ; Changes_When_Uppercased # L& LATIN SMALL LETTER GAMMA
+0268..0269 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER I WITH STROKE..LATIN SMALL LETTER IOTA
+026B ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH MIDDLE TILDE
+026F ; Changes_When_Uppercased # L& LATIN SMALL LETTER TURNED M
+0271..0272 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK
+0275 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BARRED O
+027D ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH TAIL
+0280 ; Changes_When_Uppercased # L& LATIN LETTER SMALL CAPITAL R
+0283 ; Changes_When_Uppercased # L& LATIN SMALL LETTER ESH
+0288..028C ; Changes_When_Uppercased # L& [5] LATIN SMALL LETTER T WITH RETROFLEX HOOK..LATIN SMALL LETTER TURNED V
+0292 ; Changes_When_Uppercased # L& LATIN SMALL LETTER EZH
+0345 ; Changes_When_Uppercased # Mn COMBINING GREEK YPOGEGRAMMENI
+0371 ; Changes_When_Uppercased # L& GREEK SMALL LETTER HETA
+0373 ; Changes_When_Uppercased # L& GREEK SMALL LETTER ARCHAIC SAMPI
+0377 ; Changes_When_Uppercased # L& GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037B..037D ; Changes_When_Uppercased # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0390 ; Changes_When_Uppercased # L& GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03AC..03CE ; Changes_When_Uppercased # L& [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS
+03D0..03D1 ; Changes_When_Uppercased # L& [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL
+03D5..03D7 ; Changes_When_Uppercased # L& [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL
+03D9 ; Changes_When_Uppercased # L& GREEK SMALL LETTER ARCHAIC KOPPA
+03DB ; Changes_When_Uppercased # L& GREEK SMALL LETTER STIGMA
+03DD ; Changes_When_Uppercased # L& GREEK SMALL LETTER DIGAMMA
+03DF ; Changes_When_Uppercased # L& GREEK SMALL LETTER KOPPA
+03E1 ; Changes_When_Uppercased # L& GREEK SMALL LETTER SAMPI
+03E3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SHEI
+03E5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER FEI
+03E7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER KHEI
+03E9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER HORI
+03EB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER GANGIA
+03ED ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SHIMA
+03EF..03F2 ; Changes_When_Uppercased # L& [4] COPTIC SMALL LETTER DEI..GREEK LUNATE SIGMA SYMBOL
+03F5 ; Changes_When_Uppercased # L& GREEK LUNATE EPSILON SYMBOL
+03F8 ; Changes_When_Uppercased # L& GREEK SMALL LETTER SHO
+03FB ; Changes_When_Uppercased # L& GREEK SMALL LETTER SAN
+0430..045F ; Changes_When_Uppercased # L& [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE
+0461 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER OMEGA
+0463 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YAT
+0465 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED E
+0467 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER LITTLE YUS
+0469 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BIG YUS
+046D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KSI
+0471 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER PSI
+0473 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER FITA
+0475 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IZHITSA
+0477 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0479 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER UK
+047B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ROUND OMEGA
+047D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER OT
+0481 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOPPA
+048B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SEMISOFT SIGN
+048F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ER WITH TICK
+0491 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH UPTURN
+0493 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH STROKE
+0495 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0497 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0499 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KA WITH DESCENDER
+049D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KA WITH STROKE
+04A1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BASHKIR KA
+04A3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LIGATURE EN GHE
+04A7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ABKHASIAN HA
+04AB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AD ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER STRAIGHT U
+04B1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LIGATURE TE TSE
+04B7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SHHA
+04BD ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C2 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C4 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KA WITH HOOK
+04C6 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EL WITH TAIL
+04C8 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH HOOK
+04CA ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH TAIL
+04CC ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CE..04CF ; Changes_When_Uppercased # L& [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA
+04D1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER A WITH BREVE
+04D3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LIGATURE A IE
+04D7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IE WITH BREVE
+04D9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SCHWA
+04DB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DD ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER I WITH MACRON
+04E5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BARRED O
+04EB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04ED ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER U WITH MACRON
+04F1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04FB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FD ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER HA WITH HOOK
+04FF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER HA WITH STROKE
+0501 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI DE
+0503 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI DJE
+0505 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI ZJE
+0507 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI DZJE
+0509 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI LJE
+050B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI NJE
+050D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI SJE
+050F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI TJE
+0511 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER REVERSED ZE
+0513 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EL WITH HOOK
+0515 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER LHA
+0517 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER RHA
+0519 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YAE
+051B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER QA
+051D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER WE
+051F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ALEUT KA
+0521 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0523 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0525 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER PE WITH DESCENDER
+0561..0587 ; Changes_When_Uppercased # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+1D79 ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR G
+1D7D ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH STROKE
+1E01 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH RING BELOW
+1E03 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH DOT ABOVE
+1E05 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH DOT BELOW
+1E07 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH LINE BELOW
+1E09 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0B ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH DOT ABOVE
+1E0D ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH DOT BELOW
+1E0F ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH LINE BELOW
+1E11 ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH CEDILLA
+1E13 ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E15 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E17 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E19 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1B ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH TILDE BELOW
+1E1D ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1F ; Changes_When_Uppercased # L& LATIN SMALL LETTER F WITH DOT ABOVE
+1E21 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH MACRON
+1E23 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH DOT ABOVE
+1E25 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH DOT BELOW
+1E27 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH DIAERESIS
+1E29 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH CEDILLA
+1E2B ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH BREVE BELOW
+1E2D ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH TILDE BELOW
+1E2F ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E31 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH ACUTE
+1E33 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH DOT BELOW
+1E35 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH LINE BELOW
+1E37 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH DOT BELOW
+1E39 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3B ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH LINE BELOW
+1E3D ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3F ; Changes_When_Uppercased # L& LATIN SMALL LETTER M WITH ACUTE
+1E41 ; Changes_When_Uppercased # L& LATIN SMALL LETTER M WITH DOT ABOVE
+1E43 ; Changes_When_Uppercased # L& LATIN SMALL LETTER M WITH DOT BELOW
+1E45 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH DOT ABOVE
+1E47 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH DOT BELOW
+1E49 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH LINE BELOW
+1E4B ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4F ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E51 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E53 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E55 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH ACUTE
+1E57 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH DOT ABOVE
+1E59 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH DOT ABOVE
+1E5B ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH DOT BELOW
+1E5D ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5F ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH LINE BELOW
+1E61 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH DOT ABOVE
+1E63 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH DOT BELOW
+1E65 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E67 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E69 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6B ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH DOT ABOVE
+1E6D ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH DOT BELOW
+1E6F ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH LINE BELOW
+1E71 ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E73 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E75 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH TILDE BELOW
+1E77 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E79 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7B ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7D ; Changes_When_Uppercased # L& LATIN SMALL LETTER V WITH TILDE
+1E7F ; Changes_When_Uppercased # L& LATIN SMALL LETTER V WITH DOT BELOW
+1E81 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH GRAVE
+1E83 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH ACUTE
+1E85 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH DIAERESIS
+1E87 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH DOT ABOVE
+1E89 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH DOT BELOW
+1E8B ; Changes_When_Uppercased # L& LATIN SMALL LETTER X WITH DOT ABOVE
+1E8D ; Changes_When_Uppercased # L& LATIN SMALL LETTER X WITH DIAERESIS
+1E8F ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH DOT ABOVE
+1E91 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E93 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH DOT BELOW
+1E95..1E9B ; Changes_When_Uppercased # L& [7] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DOT BELOW
+1EA3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAB ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAD ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAF ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH DOT BELOW
+1EBB ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBD ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH TILDE
+1EBF ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECB ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH DOT BELOW
+1ECD ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOT BELOW
+1ECF ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDB ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDD ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDF ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DOT BELOW
+1EE7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEB ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EED ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEF ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH GRAVE
+1EF5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH DOT BELOW
+1EF7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH TILDE
+1EFB ; Changes_When_Uppercased # L& LATIN SMALL LETTER MIDDLE-WELSH LL
+1EFD ; Changes_When_Uppercased # L& LATIN SMALL LETTER MIDDLE-WELSH V
+1EFF..1F07 ; Changes_When_Uppercased # L& [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10..1F15 ; Changes_When_Uppercased # L& [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F27 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30..1F37 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40..1F45 ; Changes_When_Uppercased # L& [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60..1F67 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70..1F7D ; Changes_When_Uppercased # L& [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; Changes_When_Uppercased # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FB7 ; Changes_When_Uppercased # L& [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FBC ; Changes_When_Uppercased # L& GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE ; Changes_When_Uppercased # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; Changes_When_Uppercased # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FC7 ; Changes_When_Uppercased # L& [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FCC ; Changes_When_Uppercased # L& GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3 ; Changes_When_Uppercased # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FD7 ; Changes_When_Uppercased # L& [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FE0..1FE7 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FF2..1FF4 ; Changes_When_Uppercased # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FF7 ; Changes_When_Uppercased # L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FFC ; Changes_When_Uppercased # L& GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+214E ; Changes_When_Uppercased # L& TURNED SMALL F
+2170..217F ; Changes_When_Uppercased # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+2184 ; Changes_When_Uppercased # L& LATIN SMALL LETTER REVERSED C
+24D0..24E9 ; Changes_When_Uppercased # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2C30..2C5E ; Changes_When_Uppercased # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C61 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH DOUBLE BAR
+2C65..2C66 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE
+2C68 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH DESCENDER
+2C6A ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH DESCENDER
+2C6C ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH DESCENDER
+2C73 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH HOOK
+2C76 ; Changes_When_Uppercased # L& LATIN SMALL LETTER HALF H
+2C81 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER ALFA
+2C83 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER VIDA
+2C85 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER GAMMA
+2C87 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DALDA
+2C89 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER EIE
+2C8B ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SOU
+2C8D ; Changes_When_Uppercased # L& COPTIC SMALL LETTER ZATA
+2C8F ; Changes_When_Uppercased # L& COPTIC SMALL LETTER HATE
+2C91 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER THETHE
+2C93 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER IAUDA
+2C95 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER KAPA
+2C97 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER LAULA
+2C99 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER MI
+2C9B ; Changes_When_Uppercased # L& COPTIC SMALL LETTER NI
+2C9D ; Changes_When_Uppercased # L& COPTIC SMALL LETTER KSI
+2C9F ; Changes_When_Uppercased # L& COPTIC SMALL LETTER O
+2CA1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER PI
+2CA3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER RO
+2CA5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SIMA
+2CA7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER TAU
+2CA9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER UA
+2CAB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER FI
+2CAD ; Changes_When_Uppercased # L& COPTIC SMALL LETTER KHI
+2CAF ; Changes_When_Uppercased # L& COPTIC SMALL LETTER PSI
+2CB1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OOU
+2CB3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DIALECT-P ALEF
+2CB5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC AIN
+2CB7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DIALECT-P KAPA
+2CBB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DIALECT-P NI
+2CBD ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBF ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC OOU
+2CC1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SAMPI
+2CC3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CROSSED SHEI
+2CC5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC ESH
+2CC9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DIALECT-P HORI
+2CCD ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC HORI
+2CCF ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC HA
+2CD1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER L-SHAPED HA
+2CD3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC HEI
+2CD5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC HAT
+2CD7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC DJA
+2CDB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDD ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDF ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD NUBIAN WAU
+2CEC ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+2CEE ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2D00..2D25 ; Changes_When_Uppercased # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+A641 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZEMLYA
+A643 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DZELO
+A645 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER REVERSED DZE
+A647 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTA
+A649 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DJERV
+A64B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER MONOGRAPH UK
+A64D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BROAD OMEGA
+A64F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER NEUTRAL YER
+A651 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YERU WITH BACK YER
+A653 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED YAT
+A655 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER REVERSED YU
+A657 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED A
+A659 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A65B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BLENDED YUS
+A65D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YN
+A663 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SOFT DE
+A665 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SOFT EL
+A667 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SOFT EM
+A669 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER MONOCULAR O
+A66B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BINOCULAR O
+A66D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A681 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DWE
+A683 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DZWE
+A685 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZHWE
+A687 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CCHE
+A689 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DZZE
+A68B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TWE
+A68F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TSWE
+A691 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TSSE
+A693 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TCHE
+A695 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER HWE
+A697 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SHWE
+A723 ; Changes_When_Uppercased # L& LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A725 ; Changes_When_Uppercased # L& LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A727 ; Changes_When_Uppercased # L& LATIN SMALL LETTER HENG
+A729 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TZ
+A72B ; Changes_When_Uppercased # L& LATIN SMALL LETTER TRESILLO
+A72D ; Changes_When_Uppercased # L& LATIN SMALL LETTER CUATRILLO
+A72F ; Changes_When_Uppercased # L& LATIN SMALL LETTER CUATRILLO WITH COMMA
+A733 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AA
+A735 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AO
+A737 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AU
+A739 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AV
+A73B ; Changes_When_Uppercased # L& LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+A73D ; Changes_When_Uppercased # L& LATIN SMALL LETTER AY
+A73F ; Changes_When_Uppercased # L& LATIN SMALL LETTER REVERSED C WITH DOT
+A741 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH STROKE
+A743 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A745 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A747 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BROKEN L
+A749 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH HIGH STROKE
+A74B ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH LOOP
+A74F ; Changes_When_Uppercased # L& LATIN SMALL LETTER OO
+A751 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A753 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH FLOURISH
+A755 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A757 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A759 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A75B ; Changes_When_Uppercased # L& LATIN SMALL LETTER R ROTUNDA
+A75D ; Changes_When_Uppercased # L& LATIN SMALL LETTER RUM ROTUNDA
+A75F ; Changes_When_Uppercased # L& LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A761 ; Changes_When_Uppercased # L& LATIN SMALL LETTER VY
+A763 ; Changes_When_Uppercased # L& LATIN SMALL LETTER VISIGOTHIC Z
+A765 ; Changes_When_Uppercased # L& LATIN SMALL LETTER THORN WITH STROKE
+A767 ; Changes_When_Uppercased # L& LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A769 ; Changes_When_Uppercased # L& LATIN SMALL LETTER VEND
+A76B ; Changes_When_Uppercased # L& LATIN SMALL LETTER ET
+A76D ; Changes_When_Uppercased # L& LATIN SMALL LETTER IS
+A76F ; Changes_When_Uppercased # L& LATIN SMALL LETTER CON
+A77A ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR D
+A77C ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR F
+A77F ; Changes_When_Uppercased # L& LATIN SMALL LETTER TURNED INSULAR G
+A781 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TURNED L
+A783 ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR R
+A785 ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR S
+A787 ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR T
+A78C ; Changes_When_Uppercased # L& LATIN SMALL LETTER SALTILLO
+FB00..FB06 ; Changes_When_Uppercased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; Changes_When_Uppercased # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FF41..FF5A ; Changes_When_Uppercased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+10428..1044F ; Changes_When_Uppercased # L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW
+
+# Total code points: 1112
+
+# ================================================
+
+# Derived Property: Changes_When_Titlecased (CWT)
+# Characters whose normalized forms are not stable under a toTitlecase mapping.
+# For more information, see D126 in Section 3.13, "Default Case Algorithms".
+# Changes_When_Titlecased(X) is true when toTitlecase(toNFD(X)) != toNFD(X)
+
+0061..007A ; Changes_When_Titlecased # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00B5 ; Changes_When_Titlecased # L& MICRO SIGN
+00DF..00F6 ; Changes_When_Titlecased # L& [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..00FF ; Changes_When_Titlecased # L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS
+0101 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH MACRON
+0103 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE
+0105 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH OGONEK
+0107 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH ACUTE
+0109 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH CIRCUMFLEX
+010B ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH DOT ABOVE
+010D ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH CARON
+010F ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH CARON
+0111 ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH STROKE
+0113 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH MACRON
+0115 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH BREVE
+0117 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH DOT ABOVE
+0119 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH OGONEK
+011B ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CARON
+011D ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH CIRCUMFLEX
+011F ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH BREVE
+0121 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH DOT ABOVE
+0123 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH CEDILLA
+0125 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH CIRCUMFLEX
+0127 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH STROKE
+0129 ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH TILDE
+012B ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH MACRON
+012D ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH BREVE
+012F ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH OGONEK
+0131 ; Changes_When_Titlecased # L& LATIN SMALL LETTER DOTLESS I
+0133 ; Changes_When_Titlecased # L& LATIN SMALL LIGATURE IJ
+0135 ; Changes_When_Titlecased # L& LATIN SMALL LETTER J WITH CIRCUMFLEX
+0137 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH CEDILLA
+013A ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH ACUTE
+013C ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH CEDILLA
+013E ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH CARON
+0140 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH MIDDLE DOT
+0142 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH STROKE
+0144 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH ACUTE
+0146 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH CEDILLA
+0148..0149 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014B ; Changes_When_Titlecased # L& LATIN SMALL LETTER ENG
+014D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH MACRON
+014F ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH BREVE
+0151 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0153 ; Changes_When_Titlecased # L& LATIN SMALL LIGATURE OE
+0155 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH ACUTE
+0157 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH CEDILLA
+0159 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH CARON
+015B ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH ACUTE
+015D ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH CIRCUMFLEX
+015F ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH CEDILLA
+0161 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH CARON
+0163 ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH CEDILLA
+0165 ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH CARON
+0167 ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH STROKE
+0169 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH TILDE
+016B ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH MACRON
+016D ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH BREVE
+016F ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH RING ABOVE
+0171 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0173 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH OGONEK
+0175 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH CIRCUMFLEX
+0177 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH CIRCUMFLEX
+017A ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH ACUTE
+017C ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH DOT ABOVE
+017E..0180 ; Changes_When_Titlecased # L& [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE
+0183 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH TOPBAR
+0185 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TONE SIX
+0188 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH HOOK
+018C ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH TOPBAR
+0192 ; Changes_When_Titlecased # L& LATIN SMALL LETTER F WITH HOOK
+0195 ; Changes_When_Titlecased # L& LATIN SMALL LETTER HV
+0199..019A ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER L WITH BAR
+019E ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH LONG RIGHT LEG
+01A1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN
+01A3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER OI
+01A5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH HOOK
+01A8 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TONE TWO
+01AD ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH HOOK
+01B0 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN
+01B4 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH HOOK
+01B6 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH STROKE
+01B9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER EZH REVERSED
+01BD ; Changes_When_Titlecased # L& LATIN SMALL LETTER TONE FIVE
+01BF ; Changes_When_Titlecased # L& LATIN LETTER WYNN
+01C4 ; Changes_When_Titlecased # L& LATIN CAPITAL LETTER DZ WITH CARON
+01C6..01C7 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER DZ WITH CARON..LATIN CAPITAL LETTER LJ
+01C9..01CA ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER LJ..LATIN CAPITAL LETTER NJ
+01CC ; Changes_When_Titlecased # L& LATIN SMALL LETTER NJ
+01CE ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CARON
+01D0 ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH CARON
+01D2 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CARON
+01D4 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH CARON
+01D6 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D8 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01DA ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DC..01DD ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E
+01DF ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AE WITH MACRON
+01E5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH STROKE
+01E7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH CARON
+01E9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH CARON
+01EB ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH OGONEK
+01ED ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EF..01F1 ; Changes_When_Titlecased # L& [3] LATIN SMALL LETTER EZH WITH CARON..LATIN CAPITAL LETTER DZ
+01F3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER DZ
+01F5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH ACUTE
+01F9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH GRAVE
+01FB ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FD ; Changes_When_Titlecased # L& LATIN SMALL LETTER AE WITH ACUTE
+01FF ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0201 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0203 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH INVERTED BREVE
+0205 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0207 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH INVERTED BREVE
+0209 ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020B ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH INVERTED BREVE
+020D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020F ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH INVERTED BREVE
+0211 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0213 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH INVERTED BREVE
+0215 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0217 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH INVERTED BREVE
+0219 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH COMMA BELOW
+021B ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH COMMA BELOW
+021D ; Changes_When_Titlecased # L& LATIN SMALL LETTER YOGH
+021F ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH CARON
+0223 ; Changes_When_Titlecased # L& LATIN SMALL LETTER OU
+0225 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH HOOK
+0227 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DOT ABOVE
+0229 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CEDILLA
+022B ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH TILDE AND MACRON
+022F ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOT ABOVE
+0231 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0233 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH MACRON
+023C ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH STROKE
+023F..0240 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL
+0242 ; Changes_When_Titlecased # L& LATIN SMALL LETTER GLOTTAL STOP
+0247 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH STROKE
+0249 ; Changes_When_Titlecased # L& LATIN SMALL LETTER J WITH STROKE
+024B ; Changes_When_Titlecased # L& LATIN SMALL LETTER Q WITH HOOK TAIL
+024D ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH STROKE
+024F..0254 ; Changes_When_Titlecased # L& [6] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER OPEN O
+0256..0257 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER D WITH TAIL..LATIN SMALL LETTER D WITH HOOK
+0259 ; Changes_When_Titlecased # L& LATIN SMALL LETTER SCHWA
+025B ; Changes_When_Titlecased # L& LATIN SMALL LETTER OPEN E
+0260 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH HOOK
+0263 ; Changes_When_Titlecased # L& LATIN SMALL LETTER GAMMA
+0268..0269 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER I WITH STROKE..LATIN SMALL LETTER IOTA
+026B ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH MIDDLE TILDE
+026F ; Changes_When_Titlecased # L& LATIN SMALL LETTER TURNED M
+0271..0272 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK
+0275 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BARRED O
+027D ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH TAIL
+0280 ; Changes_When_Titlecased # L& LATIN LETTER SMALL CAPITAL R
+0283 ; Changes_When_Titlecased # L& LATIN SMALL LETTER ESH
+0288..028C ; Changes_When_Titlecased # L& [5] LATIN SMALL LETTER T WITH RETROFLEX HOOK..LATIN SMALL LETTER TURNED V
+0292 ; Changes_When_Titlecased # L& LATIN SMALL LETTER EZH
+0345 ; Changes_When_Titlecased # Mn COMBINING GREEK YPOGEGRAMMENI
+0371 ; Changes_When_Titlecased # L& GREEK SMALL LETTER HETA
+0373 ; Changes_When_Titlecased # L& GREEK SMALL LETTER ARCHAIC SAMPI
+0377 ; Changes_When_Titlecased # L& GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037B..037D ; Changes_When_Titlecased # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0390 ; Changes_When_Titlecased # L& GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03AC..03CE ; Changes_When_Titlecased # L& [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS
+03D0..03D1 ; Changes_When_Titlecased # L& [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL
+03D5..03D7 ; Changes_When_Titlecased # L& [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL
+03D9 ; Changes_When_Titlecased # L& GREEK SMALL LETTER ARCHAIC KOPPA
+03DB ; Changes_When_Titlecased # L& GREEK SMALL LETTER STIGMA
+03DD ; Changes_When_Titlecased # L& GREEK SMALL LETTER DIGAMMA
+03DF ; Changes_When_Titlecased # L& GREEK SMALL LETTER KOPPA
+03E1 ; Changes_When_Titlecased # L& GREEK SMALL LETTER SAMPI
+03E3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SHEI
+03E5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER FEI
+03E7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER KHEI
+03E9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER HORI
+03EB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER GANGIA
+03ED ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SHIMA
+03EF..03F2 ; Changes_When_Titlecased # L& [4] COPTIC SMALL LETTER DEI..GREEK LUNATE SIGMA SYMBOL
+03F5 ; Changes_When_Titlecased # L& GREEK LUNATE EPSILON SYMBOL
+03F8 ; Changes_When_Titlecased # L& GREEK SMALL LETTER SHO
+03FB ; Changes_When_Titlecased # L& GREEK SMALL LETTER SAN
+0430..045F ; Changes_When_Titlecased # L& [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE
+0461 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER OMEGA
+0463 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YAT
+0465 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED E
+0467 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER LITTLE YUS
+0469 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BIG YUS
+046D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KSI
+0471 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER PSI
+0473 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER FITA
+0475 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IZHITSA
+0477 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0479 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER UK
+047B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ROUND OMEGA
+047D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER OT
+0481 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOPPA
+048B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SEMISOFT SIGN
+048F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ER WITH TICK
+0491 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH UPTURN
+0493 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH STROKE
+0495 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0497 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0499 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KA WITH DESCENDER
+049D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KA WITH STROKE
+04A1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BASHKIR KA
+04A3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LIGATURE EN GHE
+04A7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ABKHASIAN HA
+04AB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AD ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER STRAIGHT U
+04B1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LIGATURE TE TSE
+04B7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SHHA
+04BD ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C2 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C4 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KA WITH HOOK
+04C6 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EL WITH TAIL
+04C8 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH HOOK
+04CA ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH TAIL
+04CC ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CE..04CF ; Changes_When_Titlecased # L& [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA
+04D1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER A WITH BREVE
+04D3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LIGATURE A IE
+04D7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IE WITH BREVE
+04D9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SCHWA
+04DB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DD ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER I WITH MACRON
+04E5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BARRED O
+04EB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04ED ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER U WITH MACRON
+04F1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04FB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FD ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER HA WITH HOOK
+04FF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER HA WITH STROKE
+0501 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI DE
+0503 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI DJE
+0505 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI ZJE
+0507 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI DZJE
+0509 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI LJE
+050B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI NJE
+050D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI SJE
+050F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI TJE
+0511 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER REVERSED ZE
+0513 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EL WITH HOOK
+0515 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER LHA
+0517 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER RHA
+0519 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YAE
+051B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER QA
+051D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER WE
+051F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ALEUT KA
+0521 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0523 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0525 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER PE WITH DESCENDER
+0561..0587 ; Changes_When_Titlecased # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+1D79 ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR G
+1D7D ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH STROKE
+1E01 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH RING BELOW
+1E03 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH DOT ABOVE
+1E05 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH DOT BELOW
+1E07 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH LINE BELOW
+1E09 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0B ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH DOT ABOVE
+1E0D ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH DOT BELOW
+1E0F ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH LINE BELOW
+1E11 ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH CEDILLA
+1E13 ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E15 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E17 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E19 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1B ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH TILDE BELOW
+1E1D ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1F ; Changes_When_Titlecased # L& LATIN SMALL LETTER F WITH DOT ABOVE
+1E21 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH MACRON
+1E23 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH DOT ABOVE
+1E25 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH DOT BELOW
+1E27 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH DIAERESIS
+1E29 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH CEDILLA
+1E2B ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH BREVE BELOW
+1E2D ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH TILDE BELOW
+1E2F ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E31 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH ACUTE
+1E33 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH DOT BELOW
+1E35 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH LINE BELOW
+1E37 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH DOT BELOW
+1E39 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3B ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH LINE BELOW
+1E3D ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3F ; Changes_When_Titlecased # L& LATIN SMALL LETTER M WITH ACUTE
+1E41 ; Changes_When_Titlecased # L& LATIN SMALL LETTER M WITH DOT ABOVE
+1E43 ; Changes_When_Titlecased # L& LATIN SMALL LETTER M WITH DOT BELOW
+1E45 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH DOT ABOVE
+1E47 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH DOT BELOW
+1E49 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH LINE BELOW
+1E4B ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4F ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E51 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E53 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E55 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH ACUTE
+1E57 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH DOT ABOVE
+1E59 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH DOT ABOVE
+1E5B ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH DOT BELOW
+1E5D ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5F ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH LINE BELOW
+1E61 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH DOT ABOVE
+1E63 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH DOT BELOW
+1E65 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E67 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E69 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6B ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH DOT ABOVE
+1E6D ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH DOT BELOW
+1E6F ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH LINE BELOW
+1E71 ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E73 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E75 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH TILDE BELOW
+1E77 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E79 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7B ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7D ; Changes_When_Titlecased # L& LATIN SMALL LETTER V WITH TILDE
+1E7F ; Changes_When_Titlecased # L& LATIN SMALL LETTER V WITH DOT BELOW
+1E81 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH GRAVE
+1E83 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH ACUTE
+1E85 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH DIAERESIS
+1E87 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH DOT ABOVE
+1E89 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH DOT BELOW
+1E8B ; Changes_When_Titlecased # L& LATIN SMALL LETTER X WITH DOT ABOVE
+1E8D ; Changes_When_Titlecased # L& LATIN SMALL LETTER X WITH DIAERESIS
+1E8F ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH DOT ABOVE
+1E91 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E93 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH DOT BELOW
+1E95..1E9B ; Changes_When_Titlecased # L& [7] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DOT BELOW
+1EA3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAB ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAD ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAF ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH DOT BELOW
+1EBB ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBD ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH TILDE
+1EBF ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECB ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH DOT BELOW
+1ECD ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOT BELOW
+1ECF ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDB ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDD ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDF ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DOT BELOW
+1EE7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEB ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EED ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEF ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH GRAVE
+1EF5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH DOT BELOW
+1EF7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH TILDE
+1EFB ; Changes_When_Titlecased # L& LATIN SMALL LETTER MIDDLE-WELSH LL
+1EFD ; Changes_When_Titlecased # L& LATIN SMALL LETTER MIDDLE-WELSH V
+1EFF..1F07 ; Changes_When_Titlecased # L& [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10..1F15 ; Changes_When_Titlecased # L& [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F27 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30..1F37 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40..1F45 ; Changes_When_Titlecased # L& [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60..1F67 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70..1F7D ; Changes_When_Titlecased # L& [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1F87 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F90..1F97 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA0..1FA7 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FB0..1FB4 ; Changes_When_Titlecased # L& [5] GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FB7 ; Changes_When_Titlecased # L& [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FBE ; Changes_When_Titlecased # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; Changes_When_Titlecased # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FC7 ; Changes_When_Titlecased # L& [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FD0..1FD3 ; Changes_When_Titlecased # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FD7 ; Changes_When_Titlecased # L& [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FE0..1FE7 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FF2..1FF4 ; Changes_When_Titlecased # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FF7 ; Changes_When_Titlecased # L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+214E ; Changes_When_Titlecased # L& TURNED SMALL F
+2170..217F ; Changes_When_Titlecased # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+2184 ; Changes_When_Titlecased # L& LATIN SMALL LETTER REVERSED C
+24D0..24E9 ; Changes_When_Titlecased # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2C30..2C5E ; Changes_When_Titlecased # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C61 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH DOUBLE BAR
+2C65..2C66 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE
+2C68 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH DESCENDER
+2C6A ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH DESCENDER
+2C6C ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH DESCENDER
+2C73 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH HOOK
+2C76 ; Changes_When_Titlecased # L& LATIN SMALL LETTER HALF H
+2C81 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER ALFA
+2C83 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER VIDA
+2C85 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER GAMMA
+2C87 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DALDA
+2C89 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER EIE
+2C8B ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SOU
+2C8D ; Changes_When_Titlecased # L& COPTIC SMALL LETTER ZATA
+2C8F ; Changes_When_Titlecased # L& COPTIC SMALL LETTER HATE
+2C91 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER THETHE
+2C93 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER IAUDA
+2C95 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER KAPA
+2C97 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER LAULA
+2C99 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER MI
+2C9B ; Changes_When_Titlecased # L& COPTIC SMALL LETTER NI
+2C9D ; Changes_When_Titlecased # L& COPTIC SMALL LETTER KSI
+2C9F ; Changes_When_Titlecased # L& COPTIC SMALL LETTER O
+2CA1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER PI
+2CA3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER RO
+2CA5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SIMA
+2CA7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER TAU
+2CA9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER UA
+2CAB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER FI
+2CAD ; Changes_When_Titlecased # L& COPTIC SMALL LETTER KHI
+2CAF ; Changes_When_Titlecased # L& COPTIC SMALL LETTER PSI
+2CB1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OOU
+2CB3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DIALECT-P ALEF
+2CB5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC AIN
+2CB7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DIALECT-P KAPA
+2CBB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DIALECT-P NI
+2CBD ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBF ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC OOU
+2CC1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SAMPI
+2CC3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CROSSED SHEI
+2CC5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC ESH
+2CC9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DIALECT-P HORI
+2CCD ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC HORI
+2CCF ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC HA
+2CD1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER L-SHAPED HA
+2CD3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC HEI
+2CD5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC HAT
+2CD7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC DJA
+2CDB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDD ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDF ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD NUBIAN WAU
+2CEC ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+2CEE ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2D00..2D25 ; Changes_When_Titlecased # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+A641 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZEMLYA
+A643 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DZELO
+A645 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER REVERSED DZE
+A647 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTA
+A649 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DJERV
+A64B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER MONOGRAPH UK
+A64D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BROAD OMEGA
+A64F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER NEUTRAL YER
+A651 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YERU WITH BACK YER
+A653 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED YAT
+A655 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER REVERSED YU
+A657 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED A
+A659 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A65B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BLENDED YUS
+A65D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YN
+A663 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SOFT DE
+A665 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SOFT EL
+A667 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SOFT EM
+A669 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER MONOCULAR O
+A66B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BINOCULAR O
+A66D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A681 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DWE
+A683 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DZWE
+A685 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZHWE
+A687 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CCHE
+A689 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DZZE
+A68B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TWE
+A68F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TSWE
+A691 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TSSE
+A693 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TCHE
+A695 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER HWE
+A697 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SHWE
+A723 ; Changes_When_Titlecased # L& LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A725 ; Changes_When_Titlecased # L& LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A727 ; Changes_When_Titlecased # L& LATIN SMALL LETTER HENG
+A729 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TZ
+A72B ; Changes_When_Titlecased # L& LATIN SMALL LETTER TRESILLO
+A72D ; Changes_When_Titlecased # L& LATIN SMALL LETTER CUATRILLO
+A72F ; Changes_When_Titlecased # L& LATIN SMALL LETTER CUATRILLO WITH COMMA
+A733 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AA
+A735 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AO
+A737 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AU
+A739 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AV
+A73B ; Changes_When_Titlecased # L& LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+A73D ; Changes_When_Titlecased # L& LATIN SMALL LETTER AY
+A73F ; Changes_When_Titlecased # L& LATIN SMALL LETTER REVERSED C WITH DOT
+A741 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH STROKE
+A743 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A745 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A747 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BROKEN L
+A749 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH HIGH STROKE
+A74B ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH LOOP
+A74F ; Changes_When_Titlecased # L& LATIN SMALL LETTER OO
+A751 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A753 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH FLOURISH
+A755 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A757 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A759 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A75B ; Changes_When_Titlecased # L& LATIN SMALL LETTER R ROTUNDA
+A75D ; Changes_When_Titlecased # L& LATIN SMALL LETTER RUM ROTUNDA
+A75F ; Changes_When_Titlecased # L& LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A761 ; Changes_When_Titlecased # L& LATIN SMALL LETTER VY
+A763 ; Changes_When_Titlecased # L& LATIN SMALL LETTER VISIGOTHIC Z
+A765 ; Changes_When_Titlecased # L& LATIN SMALL LETTER THORN WITH STROKE
+A767 ; Changes_When_Titlecased # L& LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A769 ; Changes_When_Titlecased # L& LATIN SMALL LETTER VEND
+A76B ; Changes_When_Titlecased # L& LATIN SMALL LETTER ET
+A76D ; Changes_When_Titlecased # L& LATIN SMALL LETTER IS
+A76F ; Changes_When_Titlecased # L& LATIN SMALL LETTER CON
+A77A ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR D
+A77C ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR F
+A77F ; Changes_When_Titlecased # L& LATIN SMALL LETTER TURNED INSULAR G
+A781 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TURNED L
+A783 ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR R
+A785 ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR S
+A787 ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR T
+A78C ; Changes_When_Titlecased # L& LATIN SMALL LETTER SALTILLO
+FB00..FB06 ; Changes_When_Titlecased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; Changes_When_Titlecased # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FF41..FF5A ; Changes_When_Titlecased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+10428..1044F ; Changes_When_Titlecased # L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW
+
+# Total code points: 1085
+
+# ================================================
+
+# Derived Property: Changes_When_Casefolded (CWCF)
+# Characters whose normalized forms are not stable under case folding.
+# For more information, see D127 in Section 3.13, "Default Case Algorithms".
+# Changes_When_Casefolded(X) is true when toCasefold(toNFD(X)) != toNFD(X)
+
+0041..005A ; Changes_When_Casefolded # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+00B5 ; Changes_When_Casefolded # L& MICRO SIGN
+00C0..00D6 ; Changes_When_Casefolded # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00DF ; Changes_When_Casefolded # L& [8] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER SHARP S
+0100 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH MACRON
+0102 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE
+0104 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH OGONEK
+0106 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH ACUTE
+0108 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+010A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH DOT ABOVE
+010C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH CARON
+010E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH CARON
+0110 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH STROKE
+0112 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH MACRON
+0114 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH BREVE
+0116 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH DOT ABOVE
+0118 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH OGONEK
+011A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CARON
+011C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH BREVE
+0120 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH DOT ABOVE
+0122 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH CEDILLA
+0124 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0126 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH STROKE
+0128 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH TILDE
+012A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH MACRON
+012C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH BREVE
+012E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH OGONEK
+0130 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH DOT ABOVE
+0132 ; Changes_When_Casefolded # L& LATIN CAPITAL LIGATURE IJ
+0134 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0136 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH CEDILLA
+0139 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH ACUTE
+013B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH CEDILLA
+013D ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH CARON
+013F ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0141 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH STROKE
+0143 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH ACUTE
+0145 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH CEDILLA
+0147 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH CARON
+0149..014A ; Changes_When_Casefolded # L& [2] LATIN SMALL LETTER N PRECEDED BY APOSTROPHE..LATIN CAPITAL LETTER ENG
+014C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH MACRON
+014E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH BREVE
+0150 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0152 ; Changes_When_Casefolded # L& LATIN CAPITAL LIGATURE OE
+0154 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH ACUTE
+0156 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH CEDILLA
+0158 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH CARON
+015A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH ACUTE
+015C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH CEDILLA
+0160 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH CARON
+0162 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH CEDILLA
+0164 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH CARON
+0166 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH STROKE
+0168 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH TILDE
+016A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH MACRON
+016C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH BREVE
+016E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH RING ABOVE
+0170 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0172 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH OGONEK
+0174 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0176 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0178..0179 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE
+017B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017D ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH CARON
+017F ; Changes_When_Casefolded # L& LATIN SMALL LETTER LONG S
+0181..0182 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR
+0184 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TONE SIX
+0186..0187 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK
+0189..018B ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR
+018E..0191 ; Changes_When_Casefolded # L& [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK
+0193..0194 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA
+0196..0198 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK
+019C..019D ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK
+019F..01A0 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN
+01A2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER OI
+01A4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH HOOK
+01A6..01A7 ; Changes_When_Casefolded # L& [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO
+01A9 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER ESH
+01AC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH HOOK
+01AE..01AF ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN
+01B1..01B3 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK
+01B5 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH STROKE
+01B7..01B8 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED
+01BC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TONE FIVE
+01C4..01C5 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C7..01C8 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER LJ..LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01CA..01CB ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER NJ..LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CD ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CARON
+01CF ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH CARON
+01D1 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CARON
+01D3 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH CARON
+01D5 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D7 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D9 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DB ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01E0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AE WITH MACRON
+01E4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH STROKE
+01E6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH CARON
+01E8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH CARON
+01EA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH OGONEK
+01EC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01EE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER EZH WITH CARON
+01F1..01F2 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER DZ..LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH ACUTE
+01F6..01F8 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE
+01FA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AE WITH ACUTE
+01FE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+0200 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0202 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0204 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0206 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0208 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+020A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH INVERTED BREVE
+0210 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0212 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0214 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0216 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0218 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH COMMA BELOW
+021A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH COMMA BELOW
+021C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER YOGH
+021E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH CARON
+0220 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0222 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER OU
+0224 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH HOOK
+0226 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DOT ABOVE
+0228 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CEDILLA
+022A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOT ABOVE
+0230 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0232 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH MACRON
+023A..023B ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE
+023D..023E ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+0241 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER GLOTTAL STOP
+0243..0246 ; Changes_When_Casefolded # L& [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE
+0248 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER J WITH STROKE
+024A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH STROKE
+024E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH STROKE
+0345 ; Changes_When_Casefolded # Mn COMBINING GREEK YPOGEGRAMMENI
+0370 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER HETA
+0372 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER ARCHAIC SAMPI
+0376 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0386 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; Changes_When_Casefolded # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..038F ; Changes_When_Casefolded # L& [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS
+0391..03A1 ; Changes_When_Casefolded # L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO
+03A3..03AB ; Changes_When_Casefolded # L& [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03C2 ; Changes_When_Casefolded # L& GREEK SMALL LETTER FINAL SIGMA
+03CF..03D1 ; Changes_When_Casefolded # L& [3] GREEK CAPITAL KAI SYMBOL..GREEK THETA SYMBOL
+03D5..03D6 ; Changes_When_Casefolded # L& [2] GREEK PHI SYMBOL..GREEK PI SYMBOL
+03D8 ; Changes_When_Casefolded # L& GREEK LETTER ARCHAIC KOPPA
+03DA ; Changes_When_Casefolded # L& GREEK LETTER STIGMA
+03DC ; Changes_When_Casefolded # L& GREEK LETTER DIGAMMA
+03DE ; Changes_When_Casefolded # L& GREEK LETTER KOPPA
+03E0 ; Changes_When_Casefolded # L& GREEK LETTER SAMPI
+03E2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SHEI
+03E4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER FEI
+03E6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER KHEI
+03E8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER HORI
+03EA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER GANGIA
+03EC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SHIMA
+03EE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DEI
+03F0..03F1 ; Changes_When_Casefolded # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL
+03F4..03F5 ; Changes_When_Casefolded # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F7 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER SHO
+03F9..03FA ; Changes_When_Casefolded # L& [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN
+03FD..042F ; Changes_When_Casefolded # L& [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA
+0460 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER OMEGA
+0462 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YAT
+0464 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED E
+0466 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER LITTLE YUS
+0468 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BIG YUS
+046C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KSI
+0470 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER PSI
+0472 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER FITA
+0474 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IZHITSA
+0476 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER UK
+047A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ROUND OMEGA
+047C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER OT
+0480 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOPPA
+048A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ER WITH TICK
+0490 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0492 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0494 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0496 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0498 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+049A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KA WITH STROKE
+04A0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BASHKIR KA
+04A2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LIGATURE EN GHE
+04A6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04AA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER STRAIGHT U
+04B0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LIGATURE TE TSE
+04B6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SHHA
+04BC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0..04C1 ; Changes_When_Casefolded # L& [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C3 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C5 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C7 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C9 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CB ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CD ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EM WITH TAIL
+04D0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER A WITH BREVE
+04D2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LIGATURE A IE
+04D6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SCHWA
+04DA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04E0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER I WITH MACRON
+04E4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BARRED O
+04EA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04EE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER U WITH MACRON
+04F0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04FA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER HA WITH STROKE
+0500 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI DE
+0502 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI DJE
+0504 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI ZJE
+0506 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI DZJE
+0508 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI LJE
+050A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI NJE
+050C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI SJE
+050E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI TJE
+0510 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER REVERSED ZE
+0512 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EL WITH HOOK
+0514 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER LHA
+0516 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER RHA
+0518 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YAE
+051A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER QA
+051C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER WE
+051E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ALEUT KA
+0520 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0522 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0524 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+0531..0556 ; Changes_When_Casefolded # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0587 ; Changes_When_Casefolded # L& ARMENIAN SMALL LIGATURE ECH YIWN
+10A0..10C5 ; Changes_When_Casefolded # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+1E00 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH RING BELOW
+1E02 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E04 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER B WITH DOT BELOW
+1E06 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER B WITH LINE BELOW
+1E08 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E0A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH LINE BELOW
+1E10 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH CEDILLA
+1E12 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E14 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E16 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E18 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E1A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E20 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH MACRON
+1E22 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E24 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH DOT BELOW
+1E26 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH DIAERESIS
+1E28 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH CEDILLA
+1E2A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E30 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH ACUTE
+1E32 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH DOT BELOW
+1E34 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH LINE BELOW
+1E36 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH DOT BELOW
+1E38 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E3A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER M WITH ACUTE
+1E40 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E42 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER M WITH DOT BELOW
+1E44 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E46 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH DOT BELOW
+1E48 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH LINE BELOW
+1E4A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E50 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E52 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E54 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH ACUTE
+1E56 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E58 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E5A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH LINE BELOW
+1E60 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E62 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH DOT BELOW
+1E64 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E66 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E68 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH LINE BELOW
+1E70 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E72 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E74 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E76 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E78 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E7A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER V WITH TILDE
+1E7E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER V WITH DOT BELOW
+1E80 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH GRAVE
+1E82 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH ACUTE
+1E84 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH DIAERESIS
+1E86 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E88 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH DOT BELOW
+1E8A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E90 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E92 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E94 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E9A..1E9B ; Changes_When_Casefolded # L& [2] LATIN SMALL LETTER A WITH RIGHT HALF RING..LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1E9E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER SHARP S
+1EA0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EB0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH DOT BELOW
+1EBA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH TILDE
+1EBE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1ECA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ED0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EE0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EEA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EEE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EF0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH GRAVE
+1EF4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH TILDE
+1EFA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH LOOP
+1F08..1F0F ; Changes_When_Casefolded # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F18..1F1D ; Changes_When_Casefolded # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F28..1F2F ; Changes_When_Casefolded # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F38..1F3F ; Changes_When_Casefolded # L& [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F48..1F4D ; Changes_When_Casefolded # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F59 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F68..1F6F ; Changes_When_Casefolded # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F80..1FAF ; Changes_When_Casefolded # L& [48] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB2..1FB4 ; Changes_When_Casefolded # L& [3] GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB7..1FBC ; Changes_When_Casefolded # L& [6] GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FC2..1FC4 ; Changes_When_Casefolded # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC7..1FCC ; Changes_When_Casefolded # L& [6] GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD8..1FDB ; Changes_When_Casefolded # L& [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE8..1FEC ; Changes_When_Casefolded # L& [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4 ; Changes_When_Casefolded # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF7..1FFC ; Changes_When_Casefolded # L& [6] GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2126 ; Changes_When_Casefolded # L& OHM SIGN
+212A..212B ; Changes_When_Casefolded # L& [2] KELVIN SIGN..ANGSTROM SIGN
+2132 ; Changes_When_Casefolded # L& TURNED CAPITAL F
+2160..216F ; Changes_When_Casefolded # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND
+2183 ; Changes_When_Casefolded # L& ROMAN NUMERAL REVERSED ONE HUNDRED
+24B6..24CF ; Changes_When_Casefolded # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z
+2C00..2C2E ; Changes_When_Casefolded # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C60 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C62..2C64 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL
+2C67 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH DESCENDER
+2C69 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH DESCENDER
+2C6B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6D..2C70 ; Changes_When_Casefolded # L& [4] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA
+2C72 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH HOOK
+2C75 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER HALF H
+2C7E..2C80 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC CAPITAL LETTER ALFA
+2C82 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER VIDA
+2C84 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER GAMMA
+2C86 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DALDA
+2C88 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER EIE
+2C8A ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SOU
+2C8C ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER ZATA
+2C8E ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER HATE
+2C90 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER THETHE
+2C92 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER IAUDA
+2C94 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER KAPA
+2C96 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER LAULA
+2C98 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER MI
+2C9A ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER NI
+2C9C ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER KSI
+2C9E ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER O
+2CA0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER PI
+2CA2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER RO
+2CA4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SIMA
+2CA6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER TAU
+2CA8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER UA
+2CAA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER FI
+2CAC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER KHI
+2CAE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER PSI
+2CB0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OOU
+2CB2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CBA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DIALECT-P NI
+2CBC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CC0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SAMPI
+2CC2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CROSSED SHEI
+2CC4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CCA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC HA
+2CD0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER L-SHAPED HA
+2CD2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CDA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CE0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CEB ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+2CED ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+A640 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZEMLYA
+A642 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DZELO
+A644 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER REVERSED DZE
+A646 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTA
+A648 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DJERV
+A64A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER NEUTRAL YER
+A650 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A652 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A654 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER REVERSED YU
+A656 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED A
+A658 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A65A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BLENDED YUS
+A65C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YN
+A662 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SOFT DE
+A664 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SOFT EL
+A666 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SOFT EM
+A668 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER MONOCULAR O
+A66A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BINOCULAR O
+A66C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A680 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DWE
+A682 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DZWE
+A684 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZHWE
+A686 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CCHE
+A688 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DZZE
+A68A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TWE
+A68E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TSWE
+A690 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TSSE
+A692 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TCHE
+A694 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER HWE
+A696 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SHWE
+A722 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A724 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A726 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER HENG
+A728 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TZ
+A72A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TRESILLO
+A72C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER CUATRILLO
+A72E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A732 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AA
+A734 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AO
+A736 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AU
+A738 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AV
+A73A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AY
+A73E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER REVERSED C WITH DOT
+A740 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH STROKE
+A742 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A744 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER BROKEN L
+A748 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH HIGH STROKE
+A74A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH LOOP
+A74E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER OO
+A750 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A752 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH FLOURISH
+A754 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A756 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A758 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A75A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R ROTUNDA
+A75C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER RUM ROTUNDA
+A75E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A760 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VY
+A762 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VISIGOTHIC Z
+A764 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER THORN WITH STROKE
+A766 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VEND
+A76A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER ET
+A76C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER IS
+A76E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER CON
+A779 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR D
+A77B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR F
+A77D..A77E ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G
+A780 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TURNED L
+A782 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR R
+A784 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR S
+A786 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR T
+A78B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER SALTILLO
+FB00..FB06 ; Changes_When_Casefolded # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; Changes_When_Casefolded # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FF21..FF3A ; Changes_When_Casefolded # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+10400..10427 ; Changes_When_Casefolded # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW
+
+# Total code points: 1093
+
+# ================================================
+
+# Derived Property: Changes_When_Casemapped (CWCM)
+# Characters whose normalized forms are not stable under case mapping.
+# For more information, see D128 in Section 3.13, "Default Case Algorithms".
+# Changes_When_Casemapped(X) is true when CWL(X), or CWT(X), or CWU(X)
+
+0041..005A ; Changes_When_Casemapped # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A ; Changes_When_Casemapped # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00B5 ; Changes_When_Casemapped # L& MICRO SIGN
+00C0..00D6 ; Changes_When_Casemapped # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; Changes_When_Casemapped # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..0137 ; Changes_When_Casemapped # L& [64] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER K WITH CEDILLA
+0139..018C ; Changes_When_Casemapped # L& [84] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER D WITH TOPBAR
+018E..019A ; Changes_When_Casemapped # L& [13] LATIN CAPITAL LETTER REVERSED E..LATIN SMALL LETTER L WITH BAR
+019C..01A9 ; Changes_When_Casemapped # L& [14] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER ESH
+01AC..01B9 ; Changes_When_Casemapped # L& [14] LATIN CAPITAL LETTER T WITH HOOK..LATIN SMALL LETTER EZH REVERSED
+01BC..01BD ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER TONE FIVE..LATIN SMALL LETTER TONE FIVE
+01BF ; Changes_When_Casemapped # L& LATIN LETTER WYNN
+01C4..0220 ; Changes_When_Casemapped # L& [93] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0222..0233 ; Changes_When_Casemapped # L& [18] LATIN CAPITAL LETTER OU..LATIN SMALL LETTER Y WITH MACRON
+023A..0254 ; Changes_When_Casemapped # L& [27] LATIN CAPITAL LETTER A WITH STROKE..LATIN SMALL LETTER OPEN O
+0256..0257 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER D WITH TAIL..LATIN SMALL LETTER D WITH HOOK
+0259 ; Changes_When_Casemapped # L& LATIN SMALL LETTER SCHWA
+025B ; Changes_When_Casemapped # L& LATIN SMALL LETTER OPEN E
+0260 ; Changes_When_Casemapped # L& LATIN SMALL LETTER G WITH HOOK
+0263 ; Changes_When_Casemapped # L& LATIN SMALL LETTER GAMMA
+0268..0269 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER I WITH STROKE..LATIN SMALL LETTER IOTA
+026B ; Changes_When_Casemapped # L& LATIN SMALL LETTER L WITH MIDDLE TILDE
+026F ; Changes_When_Casemapped # L& LATIN SMALL LETTER TURNED M
+0271..0272 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK
+0275 ; Changes_When_Casemapped # L& LATIN SMALL LETTER BARRED O
+027D ; Changes_When_Casemapped # L& LATIN SMALL LETTER R WITH TAIL
+0280 ; Changes_When_Casemapped # L& LATIN LETTER SMALL CAPITAL R
+0283 ; Changes_When_Casemapped # L& LATIN SMALL LETTER ESH
+0288..028C ; Changes_When_Casemapped # L& [5] LATIN SMALL LETTER T WITH RETROFLEX HOOK..LATIN SMALL LETTER TURNED V
+0292 ; Changes_When_Casemapped # L& LATIN SMALL LETTER EZH
+0345 ; Changes_When_Casemapped # Mn COMBINING GREEK YPOGEGRAMMENI
+0370..0373 ; Changes_When_Casemapped # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0376..0377 ; Changes_When_Casemapped # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037B..037D ; Changes_When_Casemapped # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0386 ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; Changes_When_Casemapped # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; Changes_When_Casemapped # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03D1 ; Changes_When_Casemapped # L& [47] GREEK CAPITAL LETTER SIGMA..GREEK THETA SYMBOL
+03D5..03F2 ; Changes_When_Casemapped # L& [30] GREEK PHI SYMBOL..GREEK LUNATE SIGMA SYMBOL
+03F4..03F5 ; Changes_When_Casemapped # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F7..03FB ; Changes_When_Casemapped # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN
+03FD..0481 ; Changes_When_Casemapped # L& [133] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC SMALL LETTER KOPPA
+048A..0525 ; Changes_When_Casemapped # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+0531..0556 ; Changes_When_Casemapped # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0561..0587 ; Changes_When_Casemapped # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+10A0..10C5 ; Changes_When_Casemapped # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+1D79 ; Changes_When_Casemapped # L& LATIN SMALL LETTER INSULAR G
+1D7D ; Changes_When_Casemapped # L& LATIN SMALL LETTER P WITH STROKE
+1E00..1E9B ; Changes_When_Casemapped # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1E9E ; Changes_When_Casemapped # L& LATIN CAPITAL LETTER SHARP S
+1EA0..1F15 ; Changes_When_Casemapped # L& [118] LATIN CAPITAL LETTER A WITH DOT BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; Changes_When_Casemapped # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; Changes_When_Casemapped # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; Changes_When_Casemapped # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Changes_When_Casemapped # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; Changes_When_Casemapped # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; Changes_When_Casemapped # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; Changes_When_Casemapped # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE ; Changes_When_Casemapped # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; Changes_When_Casemapped # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; Changes_When_Casemapped # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3 ; Changes_When_Casemapped # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; Changes_When_Casemapped # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE0..1FEC ; Changes_When_Casemapped # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4 ; Changes_When_Casemapped # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; Changes_When_Casemapped # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2126 ; Changes_When_Casemapped # L& OHM SIGN
+212A..212B ; Changes_When_Casemapped # L& [2] KELVIN SIGN..ANGSTROM SIGN
+2132 ; Changes_When_Casemapped # L& TURNED CAPITAL F
+214E ; Changes_When_Casemapped # L& TURNED SMALL F
+2160..217F ; Changes_When_Casemapped # Nl [32] ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+2183..2184 ; Changes_When_Casemapped # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+24B6..24E9 ; Changes_When_Casemapped # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2C00..2C2E ; Changes_When_Casemapped # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; Changes_When_Casemapped # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C70 ; Changes_When_Casemapped # L& [17] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN CAPITAL LETTER TURNED ALPHA
+2C72..2C73 ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER W WITH HOOK..LATIN SMALL LETTER W WITH HOOK
+2C75..2C76 ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER HALF H..LATIN SMALL LETTER HALF H
+2C7E..2CE3 ; Changes_When_Casemapped # L& [102] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SMALL LETTER OLD NUBIAN WAU
+2CEB..2CEE ; Changes_When_Casemapped # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2D00..2D25 ; Changes_When_Casemapped # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+A640..A65F ; Changes_When_Casemapped # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; Changes_When_Casemapped # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A680..A697 ; Changes_When_Casemapped # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+A722..A72F ; Changes_When_Casemapped # L& [14] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CUATRILLO WITH COMMA
+A732..A76F ; Changes_When_Casemapped # L& [62] LATIN CAPITAL LETTER AA..LATIN SMALL LETTER CON
+A779..A787 ; Changes_When_Casemapped # L& [15] LATIN CAPITAL LETTER INSULAR D..LATIN SMALL LETTER INSULAR T
+A78B..A78C ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+FB00..FB06 ; Changes_When_Casemapped # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; Changes_When_Casemapped # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FF21..FF3A ; Changes_When_Casemapped # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A ; Changes_When_Casemapped # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+10400..1044F ; Changes_When_Casemapped # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+
+# Total code points: 2110
+
+# ================================================
+
+# Derived Property: ID_Start
+# Characters that can start an identifier.
+# Generated from:
+# Lu + Ll + Lt + Lm + Lo + Nl
+# + Other_ID_Start
+# - Pattern_Syntax
+# - Pattern_White_Space
+# NOTE: See UAX #31 for more information
+
+0041..005A ; ID_Start # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A ; ID_Start # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; ID_Start # L& FEMININE ORDINAL INDICATOR
+00B5 ; ID_Start # L& MICRO SIGN
+00BA ; ID_Start # L& MASCULINE ORDINAL INDICATOR
+00C0..00D6 ; ID_Start # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; ID_Start # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA ; ID_Start # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; ID_Start # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; ID_Start # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; ID_Start # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293 ; ID_Start # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294 ; ID_Start # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; ID_Start # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02C1 ; ID_Start # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C6..02D1 ; ID_Start # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02E0..02E4 ; ID_Start # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02EC ; ID_Start # Lm MODIFIER LETTER VOICING
+02EE ; ID_Start # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+0370..0373 ; ID_Start # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0374 ; ID_Start # Lm GREEK NUMERAL SIGN
+0376..0377 ; ID_Start # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; ID_Start # Lm GREEK YPOGEGRAMMENI
+037B..037D ; ID_Start # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0386 ; ID_Start # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; ID_Start # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; ID_Start # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; ID_Start # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03F5 ; ID_Start # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
+03F7..0481 ; ID_Start # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
+048A..0525 ; ID_Start # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+0531..0556 ; ID_Start # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; ID_Start # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+0561..0587 ; ID_Start # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+05D0..05EA ; ID_Start # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; ID_Start # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+0621..063F ; ID_Start # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640 ; ID_Start # Lm ARABIC TATWEEL
+0641..064A ; ID_Start # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+066E..066F ; ID_Start # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0671..06D3 ; ID_Start # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D5 ; ID_Start # Lo ARABIC LETTER AE
+06E5..06E6 ; ID_Start # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06EE..06EF ; ID_Start # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06FA..06FC ; ID_Start # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FF ; ID_Start # Lo ARABIC LETTER HEH WITH INVERTED V
+0710 ; ID_Start # Lo SYRIAC LETTER ALAPH
+0712..072F ; ID_Start # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+074D..07A5 ; ID_Start # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU
+07B1 ; ID_Start # Lo THAANA LETTER NAA
+07CA..07EA ; ID_Start # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07F4..07F5 ; ID_Start # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07FA ; ID_Start # Lm NKO LAJANYALAN
+0800..0815 ; ID_Start # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
+081A ; ID_Start # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+0824 ; ID_Start # Lm SAMARITAN MODIFIER LETTER SHORT A
+0828 ; ID_Start # Lm SAMARITAN MODIFIER LETTER I
+0904..0939 ; ID_Start # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093D ; ID_Start # Lo DEVANAGARI SIGN AVAGRAHA
+0950 ; ID_Start # Lo DEVANAGARI OM
+0958..0961 ; ID_Start # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0971 ; ID_Start # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972 ; ID_Start # Lo DEVANAGARI LETTER CANDRA A
+0979..097F ; ID_Start # Lo [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+0985..098C ; ID_Start # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; ID_Start # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; ID_Start # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; ID_Start # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; ID_Start # Lo BENGALI LETTER LA
+09B6..09B9 ; ID_Start # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BD ; ID_Start # Lo BENGALI SIGN AVAGRAHA
+09CE ; ID_Start # Lo BENGALI LETTER KHANDA TA
+09DC..09DD ; ID_Start # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; ID_Start # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09F0..09F1 ; ID_Start # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+0A05..0A0A ; ID_Start # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; ID_Start # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; ID_Start # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; ID_Start # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; ID_Start # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; ID_Start # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; ID_Start # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A59..0A5C ; ID_Start # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; ID_Start # Lo GURMUKHI LETTER FA
+0A72..0A74 ; ID_Start # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A85..0A8D ; ID_Start # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; ID_Start # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; ID_Start # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; ID_Start # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; ID_Start # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; ID_Start # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABD ; ID_Start # Lo GUJARATI SIGN AVAGRAHA
+0AD0 ; ID_Start # Lo GUJARATI OM
+0AE0..0AE1 ; ID_Start # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0B05..0B0C ; ID_Start # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; ID_Start # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; ID_Start # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; ID_Start # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; ID_Start # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; ID_Start # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3D ; ID_Start # Lo ORIYA SIGN AVAGRAHA
+0B5C..0B5D ; ID_Start # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; ID_Start # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B71 ; ID_Start # Lo ORIYA LETTER WA
+0B83 ; ID_Start # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; ID_Start # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; ID_Start # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; ID_Start # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; ID_Start # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; ID_Start # Lo TAMIL LETTER JA
+0B9E..0B9F ; ID_Start # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; ID_Start # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; ID_Start # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; ID_Start # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BD0 ; ID_Start # Lo TAMIL OM
+0C05..0C0C ; ID_Start # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; ID_Start # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; ID_Start # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33 ; ID_Start # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39 ; ID_Start # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D ; ID_Start # Lo TELUGU SIGN AVAGRAHA
+0C58..0C59 ; ID_Start # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61 ; ID_Start # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C85..0C8C ; ID_Start # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; ID_Start # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; ID_Start # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; ID_Start # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; ID_Start # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBD ; ID_Start # Lo KANNADA SIGN AVAGRAHA
+0CDE ; ID_Start # Lo KANNADA LETTER FA
+0CE0..0CE1 ; ID_Start # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0D05..0D0C ; ID_Start # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; ID_Start # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28 ; ID_Start # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39 ; ID_Start # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D ; ID_Start # Lo MALAYALAM SIGN AVAGRAHA
+0D60..0D61 ; ID_Start # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D7A..0D7F ; ID_Start # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D85..0D96 ; ID_Start # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; ID_Start # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; ID_Start # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; ID_Start # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; ID_Start # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0E01..0E30 ; ID_Start # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E32..0E33 ; ID_Start # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E40..0E45 ; ID_Start # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; ID_Start # Lm THAI CHARACTER MAIYAMOK
+0E81..0E82 ; ID_Start # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; ID_Start # Lo LAO LETTER KHO TAM
+0E87..0E88 ; ID_Start # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; ID_Start # Lo LAO LETTER SO TAM
+0E8D ; ID_Start # Lo LAO LETTER NYO
+0E94..0E97 ; ID_Start # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; ID_Start # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; ID_Start # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; ID_Start # Lo LAO LETTER LO LOOT
+0EA7 ; ID_Start # Lo LAO LETTER WO
+0EAA..0EAB ; ID_Start # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; ID_Start # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB2..0EB3 ; ID_Start # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EBD ; ID_Start # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; ID_Start # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; ID_Start # Lm LAO KO LA
+0EDC..0EDD ; ID_Start # Lo [2] LAO HO NO..LAO HO MO
+0F00 ; ID_Start # Lo TIBETAN SYLLABLE OM
+0F40..0F47 ; ID_Start # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; ID_Start # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F88..0F8B ; ID_Start # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+1000..102A ; ID_Start # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+103F ; ID_Start # Lo MYANMAR LETTER GREAT SA
+1050..1055 ; ID_Start # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+105A..105D ; ID_Start # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+1061 ; ID_Start # Lo MYANMAR LETTER SGAW KAREN SHA
+1065..1066 ; ID_Start # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+106E..1070 ; ID_Start # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1075..1081 ; ID_Start # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+108E ; ID_Start # Lo MYANMAR LETTER RUMAI PALAUNG FA
+10A0..10C5 ; ID_Start # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA ; ID_Start # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC ; ID_Start # Lm MODIFIER LETTER GEORGIAN NAR
+1100..1248 ; ID_Start # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA
+124A..124D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; ID_Start # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; ID_Start # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; ID_Start # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; ID_Start # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; ID_Start # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; ID_Start # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; ID_Start # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+1380..138F ; ID_Start # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+13A0..13F4 ; ID_Start # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+1401..166C ; ID_Start # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166F..167F ; ID_Start # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+1681..169A ; ID_Start # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+16A0..16EA ; ID_Start # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0 ; ID_Start # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+1700..170C ; ID_Start # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; ID_Start # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1720..1731 ; ID_Start # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1740..1751 ; ID_Start # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1760..176C ; ID_Start # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; ID_Start # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1780..17B3 ; ID_Start # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17D7 ; ID_Start # Lm KHMER SIGN LEK TOO
+17DC ; ID_Start # Lo KHMER SIGN AVAKRAHASANYA
+1820..1842 ; ID_Start # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; ID_Start # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; ID_Start # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8 ; ID_Start # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18AA ; ID_Start # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+18B0..18F5 ; ID_Start # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+1900..191C ; ID_Start # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1950..196D ; ID_Start # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; ID_Start # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1980..19AB ; ID_Start # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19C1..19C7 ; ID_Start # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+1A00..1A16 ; ID_Start # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A20..1A54 ; ID_Start # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
+1AA7 ; ID_Start # Lm TAI THAM SIGN MAI YAMOK
+1B05..1B33 ; ID_Start # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B45..1B4B ; ID_Start # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B83..1BA0 ; ID_Start # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BAE..1BAF ; ID_Start # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1C00..1C23 ; ID_Start # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C4D..1C4F ; ID_Start # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+1C5A..1C77 ; ID_Start # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; ID_Start # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1CE9..1CEC ; ID_Start # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL
+1CEE..1CF1 ; ID_Start # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA
+1D00..1D2B ; ID_Start # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61 ; ID_Start # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D77 ; ID_Start # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
+1D78 ; ID_Start # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D9A ; ID_Start # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; ID_Start # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1E00..1F15 ; ID_Start # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; ID_Start # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; ID_Start # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; ID_Start # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; ID_Start # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; ID_Start # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; ID_Start # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; ID_Start # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE ; ID_Start # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; ID_Start # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; ID_Start # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3 ; ID_Start # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; ID_Start # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE0..1FEC ; ID_Start # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4 ; ID_Start # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; ID_Start # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2071 ; ID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER I
+207F ; ID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094 ; ID_Start # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+2102 ; ID_Start # L& DOUBLE-STRUCK CAPITAL C
+2107 ; ID_Start # L& EULER CONSTANT
+210A..2113 ; ID_Start # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; ID_Start # L& DOUBLE-STRUCK CAPITAL N
+2118 ; ID_Start # So SCRIPT CAPITAL P
+2119..211D ; ID_Start # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; ID_Start # L& DOUBLE-STRUCK CAPITAL Z
+2126 ; ID_Start # L& OHM SIGN
+2128 ; ID_Start # L& BLACK-LETTER CAPITAL Z
+212A..212D ; ID_Start # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212E ; ID_Start # So ESTIMATED SYMBOL
+212F..2134 ; ID_Start # L& [6] SCRIPT SMALL E..SCRIPT SMALL O
+2135..2138 ; ID_Start # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; ID_Start # L& INFORMATION SOURCE
+213C..213F ; ID_Start # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149 ; ID_Start # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214E ; ID_Start # L& TURNED SMALL F
+2160..2182 ; ID_Start # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; ID_Start # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; ID_Start # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2C00..2C2E ; ID_Start # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; ID_Start # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C7C ; ID_Start # L& [29] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; ID_Start # Lm MODIFIER LETTER CAPITAL V
+2C7E..2CE4 ; ID_Start # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI
+2CEB..2CEE ; ID_Start # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2D00..2D25 ; ID_Start # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+2D30..2D65 ; ID_Start # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F ; ID_Start # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80..2D96 ; ID_Start # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+3005 ; ID_Start # Lm IDEOGRAPHIC ITERATION MARK
+3006 ; ID_Start # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; ID_Start # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; ID_Start # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3031..3035 ; ID_Start # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3038..303A ; ID_Start # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; ID_Start # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+303C ; ID_Start # Lo MASU MARK
+3041..3096 ; ID_Start # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309B..309C ; ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D..309E ; ID_Start # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; ID_Start # Lo HIRAGANA DIGRAPH YORI
+30A1..30FA ; ID_Start # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FC..30FE ; ID_Start # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+30FF ; ID_Start # Lo KATAKANA DIGRAPH KOTO
+3105..312D ; ID_Start # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+3131..318E ; ID_Start # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+31A0..31B7 ; ID_Start # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+31F0..31FF ; ID_Start # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3400..4DB5 ; ID_Start # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FCB ; ID_Start # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+A000..A014 ; ID_Start # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; ID_Start # Lm YI SYLLABLE WU
+A016..A48C ; ID_Start # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A4D0..A4F7 ; ID_Start # Lo [40] LISU LETTER BA..LISU LETTER OE
+A4F8..A4FD ; ID_Start # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A500..A60B ; ID_Start # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; ID_Start # Lm VAI SYLLABLE LENGTHENER
+A610..A61F ; ID_Start # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A62A..A62B ; ID_Start # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+A640..A65F ; ID_Start # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; ID_Start # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; ID_Start # Lo CYRILLIC LETTER MULTIOCULAR O
+A67F ; ID_Start # Lm CYRILLIC PAYEROK
+A680..A697 ; ID_Start # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+A6A0..A6E5 ; ID_Start # Lo [70] BAMUM LETTER A..BAMUM LETTER KI
+A6E6..A6EF ; ID_Start # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A717..A71F ; ID_Start # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A722..A76F ; ID_Start # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; ID_Start # Lm MODIFIER LETTER US
+A771..A787 ; ID_Start # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A788 ; ID_Start # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A78B..A78C ; ID_Start # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A801 ; ID_Start # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I
+A803..A805 ; ID_Start # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A807..A80A ; ID_Start # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80C..A822 ; ID_Start # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A840..A873 ; ID_Start # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A882..A8B3 ; ID_Start # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8F2..A8F7 ; ID_Start # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8FB ; ID_Start # Lo DEVANAGARI HEADSTROKE
+A90A..A925 ; ID_Start # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A930..A946 ; ID_Start # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A960..A97C ; ID_Start # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+A984..A9B2 ; ID_Start # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA
+A9CF ; ID_Start # Lm JAVANESE PANGRANGKEP
+AA00..AA28 ; ID_Start # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA40..AA42 ; ID_Start # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA44..AA4B ; ID_Start # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA60..AA6F ; ID_Start # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA
+AA70 ; ID_Start # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AA71..AA76 ; ID_Start # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM
+AA7A ; ID_Start # Lo MYANMAR LETTER AITON RA
+AA80..AAAF ; ID_Start # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O
+AAB1 ; ID_Start # Lo TAI VIET VOWEL AA
+AAB5..AAB6 ; ID_Start # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB9..AABD ; ID_Start # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN
+AAC0 ; ID_Start # Lo TAI VIET TONE MAI NUENG
+AAC2 ; ID_Start # Lo TAI VIET TONE MAI SONG
+AADB..AADC ; ID_Start # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG
+AADD ; ID_Start # Lm TAI VIET SYMBOL SAM
+ABC0..ABE2 ; ID_Start # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
+AC00..D7A3 ; ID_Start # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+D7B0..D7C6 ; ID_Start # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7CB..D7FB ; ID_Start # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+F900..FA2D ; ID_Start # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6D ; ID_Start # Lo [62] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA70..FAD9 ; ID_Start # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00..FB06 ; ID_Start # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; ID_Start # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB1D ; ID_Start # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1F..FB28 ; ID_Start # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB2A..FB36 ; ID_Start # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; ID_Start # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; ID_Start # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; ID_Start # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; ID_Start # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FBB1 ; ID_Start # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FD3D ; ID_Start # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F ; ID_Start # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; ID_Start # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB ; ID_Start # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FE70..FE74 ; ID_Start # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC ; ID_Start # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FF21..FF3A ; ID_Start # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A ; ID_Start # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF66..FF6F ; ID_Start # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 ; ID_Start # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D ; ID_Start # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FF9E..FF9F ; ID_Start # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0..FFBE ; ID_Start # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+10000..1000B ; ID_Start # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; ID_Start # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; ID_Start # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; ID_Start # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; ID_Start # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; ID_Start # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; ID_Start # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+10140..10174 ; ID_Start # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10280..1029C ; ID_Start # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+102A0..102D0 ; ID_Start # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+10300..1031E ; ID_Start # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10330..10340 ; ID_Start # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; ID_Start # Nl GOTHIC LETTER NINETY
+10342..10349 ; ID_Start # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; ID_Start # Nl GOTHIC LETTER NINE HUNDRED
+10380..1039D ; ID_Start # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+103A0..103C3 ; ID_Start # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; ID_Start # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D1..103D5 ; ID_Start # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+10400..1044F ; ID_Start # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+10450..1049D ; ID_Start # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO
+10800..10805 ; ID_Start # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; ID_Start # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; ID_Start # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; ID_Start # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; ID_Start # Lo CYPRIOT SYLLABLE ZA
+1083F..10855 ; ID_Start # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW
+10900..10915 ; ID_Start # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10920..10939 ; ID_Start # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+10A00 ; ID_Start # Lo KHAROSHTHI LETTER A
+10A10..10A13 ; ID_Start # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; ID_Start # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; ID_Start # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A60..10A7C ; ID_Start # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10B00..10B35 ; ID_Start # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE
+10B40..10B55 ; ID_Start # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B60..10B72 ; ID_Start # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10C00..10C48 ; ID_Start # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+11083..110AF ; ID_Start # Lo [45] KAITHI LETTER A..KAITHI LETTER HA
+12000..1236E ; ID_Start # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462 ; ID_Start # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+13000..1342E ; ID_Start # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+1D400..1D454 ; ID_Start # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; ID_Start # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; ID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; ID_Start # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; ID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; ID_Start # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; ID_Start # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; ID_Start # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; ID_Start # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; ID_Start # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; ID_Start # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; ID_Start # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; ID_Start # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; ID_Start # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; ID_Start # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; ID_Start # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; ID_Start # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; ID_Start # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; ID_Start # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; ID_Start # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA ; ID_Start # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA ; ID_Start # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714 ; ID_Start # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734 ; ID_Start # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E ; ID_Start # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E ; ID_Start # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788 ; ID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8 ; ID_Start # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2 ; ID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7CB ; ID_Start # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+20000..2A6D6 ; ID_Start # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; ID_Start # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2F800..2FA1D ; ID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 99764
+
+# ================================================
+
+# Derived Property: ID_Continue
+# Characters that can continue an identifier.
+# Generated from:
+# ID_Start
+# + Mn + Mc + Nd + Pc
+# + Other_ID_Continue
+# - Pattern_Syntax
+# - Pattern_White_Space
+# NOTE: See UAX #31 for more information
+
+0030..0039 ; ID_Continue # Nd [10] DIGIT ZERO..DIGIT NINE
+0041..005A ; ID_Continue # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+005F ; ID_Continue # Pc LOW LINE
+0061..007A ; ID_Continue # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; ID_Continue # L& FEMININE ORDINAL INDICATOR
+00B5 ; ID_Continue # L& MICRO SIGN
+00B7 ; ID_Continue # Po MIDDLE DOT
+00BA ; ID_Continue # L& MASCULINE ORDINAL INDICATOR
+00C0..00D6 ; ID_Continue # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; ID_Continue # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA ; ID_Continue # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; ID_Continue # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; ID_Continue # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; ID_Continue # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293 ; ID_Continue # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294 ; ID_Continue # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; ID_Continue # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02C1 ; ID_Continue # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C6..02D1 ; ID_Continue # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02E0..02E4 ; ID_Continue # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02EC ; ID_Continue # Lm MODIFIER LETTER VOICING
+02EE ; ID_Continue # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+0300..036F ; ID_Continue # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0370..0373 ; ID_Continue # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0374 ; ID_Continue # Lm GREEK NUMERAL SIGN
+0376..0377 ; ID_Continue # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; ID_Continue # Lm GREEK YPOGEGRAMMENI
+037B..037D ; ID_Continue # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0386 ; ID_Continue # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387 ; ID_Continue # Po GREEK ANO TELEIA
+0388..038A ; ID_Continue # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; ID_Continue # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; ID_Continue # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03F5 ; ID_Continue # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
+03F7..0481 ; ID_Continue # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
+0483..0487 ; ID_Continue # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+048A..0525 ; ID_Continue # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+0531..0556 ; ID_Continue # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; ID_Continue # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+0561..0587 ; ID_Continue # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+0591..05BD ; ID_Continue # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BF ; ID_Continue # Mn HEBREW POINT RAFE
+05C1..05C2 ; ID_Continue # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; ID_Continue # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; ID_Continue # Mn HEBREW POINT QAMATS QATAN
+05D0..05EA ; ID_Continue # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; ID_Continue # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+0610..061A ; ID_Continue # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+0621..063F ; ID_Continue # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640 ; ID_Continue # Lm ARABIC TATWEEL
+0641..064A ; ID_Continue # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+064B..065E ; ID_Continue # Mn [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS
+0660..0669 ; ID_Continue # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+066E..066F ; ID_Continue # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0670 ; ID_Continue # Mn ARABIC LETTER SUPERSCRIPT ALEF
+0671..06D3 ; ID_Continue # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D5 ; ID_Continue # Lo ARABIC LETTER AE
+06D6..06DC ; ID_Continue # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DF..06E4 ; ID_Continue # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E5..06E6 ; ID_Continue # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8 ; ID_Continue # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED ; ID_Continue # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+06EE..06EF ; ID_Continue # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06F0..06F9 ; ID_Continue # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA..06FC ; ID_Continue # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FF ; ID_Continue # Lo ARABIC LETTER HEH WITH INVERTED V
+0710 ; ID_Continue # Lo SYRIAC LETTER ALAPH
+0711 ; ID_Continue # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0712..072F ; ID_Continue # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+0730..074A ; ID_Continue # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+074D..07A5 ; ID_Continue # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU
+07A6..07B0 ; ID_Continue # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07B1 ; ID_Continue # Lo THAANA LETTER NAA
+07C0..07C9 ; ID_Continue # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE
+07CA..07EA ; ID_Continue # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07EB..07F3 ; ID_Continue # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5 ; ID_Continue # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07FA ; ID_Continue # Lm NKO LAJANYALAN
+0800..0815 ; ID_Continue # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
+0816..0819 ; ID_Continue # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081A ; ID_Continue # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+081B..0823 ; ID_Continue # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0824 ; ID_Continue # Lm SAMARITAN MODIFIER LETTER SHORT A
+0825..0827 ; ID_Continue # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0828 ; ID_Continue # Lm SAMARITAN MODIFIER LETTER I
+0829..082D ; ID_Continue # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0900..0902 ; ID_Continue # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903 ; ID_Continue # Mc DEVANAGARI SIGN VISARGA
+0904..0939 ; ID_Continue # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093C ; ID_Continue # Mn DEVANAGARI SIGN NUKTA
+093D ; ID_Continue # Lo DEVANAGARI SIGN AVAGRAHA
+093E..0940 ; ID_Continue # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948 ; ID_Continue # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C ; ID_Continue # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094D ; ID_Continue # Mn DEVANAGARI SIGN VIRAMA
+094E ; ID_Continue # Mc DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+0950 ; ID_Continue # Lo DEVANAGARI OM
+0951..0955 ; ID_Continue # Mn [5] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN CANDRA LONG E
+0958..0961 ; ID_Continue # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0962..0963 ; ID_Continue # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0966..096F ; ID_Continue # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0971 ; ID_Continue # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972 ; ID_Continue # Lo DEVANAGARI LETTER CANDRA A
+0979..097F ; ID_Continue # Lo [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+0981 ; ID_Continue # Mn BENGALI SIGN CANDRABINDU
+0982..0983 ; ID_Continue # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C ; ID_Continue # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; ID_Continue # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; ID_Continue # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; ID_Continue # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; ID_Continue # Lo BENGALI LETTER LA
+09B6..09B9 ; ID_Continue # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BC ; ID_Continue # Mn BENGALI SIGN NUKTA
+09BD ; ID_Continue # Lo BENGALI SIGN AVAGRAHA
+09BE..09C0 ; ID_Continue # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4 ; ID_Continue # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8 ; ID_Continue # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; ID_Continue # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CD ; ID_Continue # Mn BENGALI SIGN VIRAMA
+09CE ; ID_Continue # Lo BENGALI LETTER KHANDA TA
+09D7 ; ID_Continue # Mc BENGALI AU LENGTH MARK
+09DC..09DD ; ID_Continue # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; ID_Continue # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E2..09E3 ; ID_Continue # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09E6..09EF ; ID_Continue # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1 ; ID_Continue # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+0A01..0A02 ; ID_Continue # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; ID_Continue # Mc GURMUKHI SIGN VISARGA
+0A05..0A0A ; ID_Continue # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; ID_Continue # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; ID_Continue # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; ID_Continue # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; ID_Continue # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; ID_Continue # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; ID_Continue # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3C ; ID_Continue # Mn GURMUKHI SIGN NUKTA
+0A3E..0A40 ; ID_Continue # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42 ; ID_Continue # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; ID_Continue # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; ID_Continue # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; ID_Continue # Mn GURMUKHI SIGN UDAAT
+0A59..0A5C ; ID_Continue # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; ID_Continue # Lo GURMUKHI LETTER FA
+0A66..0A6F ; ID_Continue # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A70..0A71 ; ID_Continue # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A72..0A74 ; ID_Continue # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A75 ; ID_Continue # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; ID_Continue # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83 ; ID_Continue # Mc GUJARATI SIGN VISARGA
+0A85..0A8D ; ID_Continue # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; ID_Continue # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; ID_Continue # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; ID_Continue # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; ID_Continue # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; ID_Continue # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABC ; ID_Continue # Mn GUJARATI SIGN NUKTA
+0ABD ; ID_Continue # Lo GUJARATI SIGN AVAGRAHA
+0ABE..0AC0 ; ID_Continue # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5 ; ID_Continue # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; ID_Continue # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9 ; ID_Continue # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; ID_Continue # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0ACD ; ID_Continue # Mn GUJARATI SIGN VIRAMA
+0AD0 ; ID_Continue # Lo GUJARATI OM
+0AE0..0AE1 ; ID_Continue # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3 ; ID_Continue # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AE6..0AEF ; ID_Continue # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0B01 ; ID_Continue # Mn ORIYA SIGN CANDRABINDU
+0B02..0B03 ; ID_Continue # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C ; ID_Continue # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; ID_Continue # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; ID_Continue # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; ID_Continue # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; ID_Continue # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; ID_Continue # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3C ; ID_Continue # Mn ORIYA SIGN NUKTA
+0B3D ; ID_Continue # Lo ORIYA SIGN AVAGRAHA
+0B3E ; ID_Continue # Mc ORIYA VOWEL SIGN AA
+0B3F ; ID_Continue # Mn ORIYA VOWEL SIGN I
+0B40 ; ID_Continue # Mc ORIYA VOWEL SIGN II
+0B41..0B44 ; ID_Continue # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48 ; ID_Continue # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; ID_Continue # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B4D ; ID_Continue # Mn ORIYA SIGN VIRAMA
+0B56 ; ID_Continue # Mn ORIYA AI LENGTH MARK
+0B57 ; ID_Continue # Mc ORIYA AU LENGTH MARK
+0B5C..0B5D ; ID_Continue # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; ID_Continue # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B62..0B63 ; ID_Continue # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B66..0B6F ; ID_Continue # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B71 ; ID_Continue # Lo ORIYA LETTER WA
+0B82 ; ID_Continue # Mn TAMIL SIGN ANUSVARA
+0B83 ; ID_Continue # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; ID_Continue # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; ID_Continue # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; ID_Continue # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; ID_Continue # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; ID_Continue # Lo TAMIL LETTER JA
+0B9E..0B9F ; ID_Continue # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; ID_Continue # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; ID_Continue # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; ID_Continue # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBE..0BBF ; ID_Continue # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0 ; ID_Continue # Mn TAMIL VOWEL SIGN II
+0BC1..0BC2 ; ID_Continue # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; ID_Continue # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; ID_Continue # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BCD ; ID_Continue # Mn TAMIL SIGN VIRAMA
+0BD0 ; ID_Continue # Lo TAMIL OM
+0BD7 ; ID_Continue # Mc TAMIL AU LENGTH MARK
+0BE6..0BEF ; ID_Continue # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0C01..0C03 ; ID_Continue # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C ; ID_Continue # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; ID_Continue # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; ID_Continue # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33 ; ID_Continue # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39 ; ID_Continue # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D ; ID_Continue # Lo TELUGU SIGN AVAGRAHA
+0C3E..0C40 ; ID_Continue # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44 ; ID_Continue # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48 ; ID_Continue # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; ID_Continue # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; ID_Continue # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C58..0C59 ; ID_Continue # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61 ; ID_Continue # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C62..0C63 ; ID_Continue # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C66..0C6F ; ID_Continue # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C82..0C83 ; ID_Continue # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C ; ID_Continue # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; ID_Continue # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; ID_Continue # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; ID_Continue # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; ID_Continue # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBC ; ID_Continue # Mn KANNADA SIGN NUKTA
+0CBD ; ID_Continue # Lo KANNADA SIGN AVAGRAHA
+0CBE ; ID_Continue # Mc KANNADA VOWEL SIGN AA
+0CBF ; ID_Continue # Mn KANNADA VOWEL SIGN I
+0CC0..0CC4 ; ID_Continue # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; ID_Continue # Mn KANNADA VOWEL SIGN E
+0CC7..0CC8 ; ID_Continue # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; ID_Continue # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC..0CCD ; ID_Continue # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6 ; ID_Continue # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE ; ID_Continue # Lo KANNADA LETTER FA
+0CE0..0CE1 ; ID_Continue # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE2..0CE3 ; ID_Continue # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CE6..0CEF ; ID_Continue # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+0D02..0D03 ; ID_Continue # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C ; ID_Continue # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; ID_Continue # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28 ; ID_Continue # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39 ; ID_Continue # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D ; ID_Continue # Lo MALAYALAM SIGN AVAGRAHA
+0D3E..0D40 ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44 ; ID_Continue # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48 ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D4D ; ID_Continue # Mn MALAYALAM SIGN VIRAMA
+0D57 ; ID_Continue # Mc MALAYALAM AU LENGTH MARK
+0D60..0D61 ; ID_Continue # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D62..0D63 ; ID_Continue # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D66..0D6F ; ID_Continue # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D7A..0D7F ; ID_Continue # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D82..0D83 ; ID_Continue # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96 ; ID_Continue # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; ID_Continue # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; ID_Continue # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; ID_Continue # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; ID_Continue # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCA ; ID_Continue # Mn SINHALA SIGN AL-LAKUNA
+0DCF..0DD1 ; ID_Continue # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4 ; ID_Continue # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; ID_Continue # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF ; ID_Continue # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3 ; ID_Continue # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E01..0E30 ; ID_Continue # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E31 ; ID_Continue # Mn THAI CHARACTER MAI HAN-AKAT
+0E32..0E33 ; ID_Continue # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E34..0E3A ; ID_Continue # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E40..0E45 ; ID_Continue # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; ID_Continue # Lm THAI CHARACTER MAIYAMOK
+0E47..0E4E ; ID_Continue # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0E50..0E59 ; ID_Continue # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E81..0E82 ; ID_Continue # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; ID_Continue # Lo LAO LETTER KHO TAM
+0E87..0E88 ; ID_Continue # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; ID_Continue # Lo LAO LETTER SO TAM
+0E8D ; ID_Continue # Lo LAO LETTER NYO
+0E94..0E97 ; ID_Continue # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; ID_Continue # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; ID_Continue # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; ID_Continue # Lo LAO LETTER LO LOOT
+0EA7 ; ID_Continue # Lo LAO LETTER WO
+0EAA..0EAB ; ID_Continue # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; ID_Continue # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB1 ; ID_Continue # Mn LAO VOWEL SIGN MAI KAN
+0EB2..0EB3 ; ID_Continue # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EB4..0EB9 ; ID_Continue # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; ID_Continue # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EBD ; ID_Continue # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; ID_Continue # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; ID_Continue # Lm LAO KO LA
+0EC8..0ECD ; ID_Continue # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
+0ED0..0ED9 ; ID_Continue # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDD ; ID_Continue # Lo [2] LAO HO NO..LAO HO MO
+0F00 ; ID_Continue # Lo TIBETAN SYLLABLE OM
+0F18..0F19 ; ID_Continue # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F20..0F29 ; ID_Continue # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F35 ; ID_Continue # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37 ; ID_Continue # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39 ; ID_Continue # Mn TIBETAN MARK TSA -PHRU
+0F3E..0F3F ; ID_Continue # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47 ; ID_Continue # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; ID_Continue # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F71..0F7E ; ID_Continue # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F ; ID_Continue # Mc TIBETAN SIGN RNAM BCAD
+0F80..0F84 ; ID_Continue # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87 ; ID_Continue # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F88..0F8B ; ID_Continue # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0F90..0F97 ; ID_Continue # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; ID_Continue # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6 ; ID_Continue # Mn TIBETAN SYMBOL PADMA GDAN
+1000..102A ; ID_Continue # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+102B..102C ; ID_Continue # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030 ; ID_Continue # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031 ; ID_Continue # Mc MYANMAR VOWEL SIGN E
+1032..1037 ; ID_Continue # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1038 ; ID_Continue # Mc MYANMAR SIGN VISARGA
+1039..103A ; ID_Continue # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103B..103C ; ID_Continue # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E ; ID_Continue # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+103F ; ID_Continue # Lo MYANMAR LETTER GREAT SA
+1040..1049 ; ID_Continue # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+1050..1055 ; ID_Continue # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057 ; ID_Continue # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059 ; ID_Continue # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105A..105D ; ID_Continue # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+105E..1060 ; ID_Continue # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061 ; ID_Continue # Lo MYANMAR LETTER SGAW KAREN SHA
+1062..1064 ; ID_Continue # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO
+1065..1066 ; ID_Continue # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+1067..106D ; ID_Continue # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E..1070 ; ID_Continue # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071..1074 ; ID_Continue # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1075..1081 ; ID_Continue # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+1082 ; ID_Continue # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084 ; ID_Continue # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086 ; ID_Continue # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+1087..108C ; ID_Continue # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108D ; ID_Continue # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E ; ID_Continue # Lo MYANMAR LETTER RUMAI PALAUNG FA
+108F ; ID_Continue # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090..1099 ; ID_Continue # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE
+109A..109C ; ID_Continue # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A
+109D ; ID_Continue # Mn MYANMAR VOWEL SIGN AITON AI
+10A0..10C5 ; ID_Continue # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA ; ID_Continue # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC ; ID_Continue # Lm MODIFIER LETTER GEORGIAN NAR
+1100..1248 ; ID_Continue # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA
+124A..124D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; ID_Continue # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; ID_Continue # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; ID_Continue # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; ID_Continue # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; ID_Continue # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; ID_Continue # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; ID_Continue # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135F ; ID_Continue # Mn ETHIOPIC COMBINING GEMINATION MARK
+1369..1371 ; ID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE
+1380..138F ; ID_Continue # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+13A0..13F4 ; ID_Continue # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+1401..166C ; ID_Continue # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166F..167F ; ID_Continue # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+1681..169A ; ID_Continue # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+16A0..16EA ; ID_Continue # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0 ; ID_Continue # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+1700..170C ; ID_Continue # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; ID_Continue # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1712..1714 ; ID_Continue # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1720..1731 ; ID_Continue # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1732..1734 ; ID_Continue # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1740..1751 ; ID_Continue # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1752..1753 ; ID_Continue # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1760..176C ; ID_Continue # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; ID_Continue # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1772..1773 ; ID_Continue # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+1780..17B3 ; ID_Continue # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B6 ; ID_Continue # Mc KHMER VOWEL SIGN AA
+17B7..17BD ; ID_Continue # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5 ; ID_Continue # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6 ; ID_Continue # Mn KHMER SIGN NIKAHIT
+17C7..17C8 ; ID_Continue # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17C9..17D3 ; ID_Continue # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17D7 ; ID_Continue # Lm KHMER SIGN LEK TOO
+17DC ; ID_Continue # Lo KHMER SIGN AVAKRAHASANYA
+17DD ; ID_Continue # Mn KHMER SIGN ATTHACAN
+17E0..17E9 ; ID_Continue # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+180B..180D ; ID_Continue # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+1810..1819 ; ID_Continue # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842 ; ID_Continue # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; ID_Continue # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; ID_Continue # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8 ; ID_Continue # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 ; ID_Continue # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+18AA ; ID_Continue # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+18B0..18F5 ; ID_Continue # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+1900..191C ; ID_Continue # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1920..1922 ; ID_Continue # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; ID_Continue # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; ID_Continue # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; ID_Continue # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; ID_Continue # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; ID_Continue # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; ID_Continue # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1939..193B ; ID_Continue # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1946..194F ; ID_Continue # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+1950..196D ; ID_Continue # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; ID_Continue # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1980..19AB ; ID_Continue # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19B0..19C0 ; ID_Continue # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C1..19C7 ; ID_Continue # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+19C8..19C9 ; ID_Continue # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+19D0..19DA ; ID_Continue # Nd [11] NEW TAI LUE DIGIT ZERO..NEW TAI LUE THAM DIGIT ONE
+1A00..1A16 ; ID_Continue # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A17..1A18 ; ID_Continue # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B ; ID_Continue # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A20..1A54 ; ID_Continue # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
+1A55 ; ID_Continue # Mc TAI THAM CONSONANT SIGN MEDIAL RA
+1A56 ; ID_Continue # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A57 ; ID_Continue # Mc TAI THAM CONSONANT SIGN LA TANG LAI
+1A58..1A5E ; ID_Continue # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60 ; ID_Continue # Mn TAI THAM SIGN SAKOT
+1A61 ; ID_Continue # Mc TAI THAM VOWEL SIGN A
+1A62 ; ID_Continue # Mn TAI THAM VOWEL SIGN MAI SAT
+1A63..1A64 ; ID_Continue # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA
+1A65..1A6C ; ID_Continue # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A6D..1A72 ; ID_Continue # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1A73..1A7C ; ID_Continue # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; ID_Continue # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1A80..1A89 ; ID_Continue # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE
+1A90..1A99 ; ID_Continue # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE
+1AA7 ; ID_Continue # Lm TAI THAM SIGN MAI YAMOK
+1B00..1B03 ; ID_Continue # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04 ; ID_Continue # Mc BALINESE SIGN BISAH
+1B05..1B33 ; ID_Continue # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B34 ; ID_Continue # Mn BALINESE SIGN REREKAN
+1B35 ; ID_Continue # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; ID_Continue # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B ; ID_Continue # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; ID_Continue # Mn BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41 ; ID_Continue # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; ID_Continue # Mn BALINESE VOWEL SIGN PEPET
+1B43..1B44 ; ID_Continue # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B45..1B4B ; ID_Continue # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B50..1B59 ; ID_Continue # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+1B6B..1B73 ; ID_Continue # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B80..1B81 ; ID_Continue # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82 ; ID_Continue # Mc SUNDANESE SIGN PANGWISAD
+1B83..1BA0 ; ID_Continue # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BA1 ; ID_Continue # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5 ; ID_Continue # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7 ; ID_Continue # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9 ; ID_Continue # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA ; ID_Continue # Mc SUNDANESE SIGN PAMAAEH
+1BAE..1BAF ; ID_Continue # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1BB0..1BB9 ; ID_Continue # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE
+1C00..1C23 ; ID_Continue # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C24..1C2B ; ID_Continue # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33 ; ID_Continue # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35 ; ID_Continue # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1C36..1C37 ; ID_Continue # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C40..1C49 ; ID_Continue # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+1C4D..1C4F ; ID_Continue # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+1C50..1C59 ; ID_Continue # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE
+1C5A..1C77 ; ID_Continue # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; ID_Continue # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1CD0..1CD2 ; ID_Continue # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD4..1CE0 ; ID_Continue # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE1 ; ID_Continue # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CE2..1CE8 ; ID_Continue # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CE9..1CEC ; ID_Continue # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL
+1CED ; ID_Continue # Mn VEDIC SIGN TIRYAK
+1CEE..1CF1 ; ID_Continue # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA
+1CF2 ; ID_Continue # Mc VEDIC SIGN ARDHAVISARGA
+1D00..1D2B ; ID_Continue # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61 ; ID_Continue # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D77 ; ID_Continue # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
+1D78 ; ID_Continue # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D9A ; ID_Continue # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; ID_Continue # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1DC0..1DE6 ; ID_Continue # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DFD..1DFF ; ID_Continue # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1E00..1F15 ; ID_Continue # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; ID_Continue # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; ID_Continue # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; ID_Continue # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; ID_Continue # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; ID_Continue # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; ID_Continue # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; ID_Continue # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE ; ID_Continue # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; ID_Continue # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; ID_Continue # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3 ; ID_Continue # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; ID_Continue # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE0..1FEC ; ID_Continue # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4 ; ID_Continue # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; ID_Continue # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+203F..2040 ; ID_Continue # Pc [2] UNDERTIE..CHARACTER TIE
+2054 ; ID_Continue # Pc INVERTED UNDERTIE
+2071 ; ID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER I
+207F ; ID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094 ; ID_Continue # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+20D0..20DC ; ID_Continue # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20E1 ; ID_Continue # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E5..20F0 ; ID_Continue # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+2102 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL C
+2107 ; ID_Continue # L& EULER CONSTANT
+210A..2113 ; ID_Continue # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL N
+2118 ; ID_Continue # So SCRIPT CAPITAL P
+2119..211D ; ID_Continue # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL Z
+2126 ; ID_Continue # L& OHM SIGN
+2128 ; ID_Continue # L& BLACK-LETTER CAPITAL Z
+212A..212D ; ID_Continue # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212E ; ID_Continue # So ESTIMATED SYMBOL
+212F..2134 ; ID_Continue # L& [6] SCRIPT SMALL E..SCRIPT SMALL O
+2135..2138 ; ID_Continue # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; ID_Continue # L& INFORMATION SOURCE
+213C..213F ; ID_Continue # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149 ; ID_Continue # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214E ; ID_Continue # L& TURNED SMALL F
+2160..2182 ; ID_Continue # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; ID_Continue # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; ID_Continue # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2C00..2C2E ; ID_Continue # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; ID_Continue # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C7C ; ID_Continue # L& [29] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; ID_Continue # Lm MODIFIER LETTER CAPITAL V
+2C7E..2CE4 ; ID_Continue # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI
+2CEB..2CEE ; ID_Continue # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2CEF..2CF1 ; ID_Continue # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2D00..2D25 ; ID_Continue # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+2D30..2D65 ; ID_Continue # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F ; ID_Continue # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80..2D96 ; ID_Continue # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+2DE0..2DFF ; ID_Continue # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+3005 ; ID_Continue # Lm IDEOGRAPHIC ITERATION MARK
+3006 ; ID_Continue # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; ID_Continue # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; ID_Continue # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+302A..302F ; ID_Continue # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3031..3035 ; ID_Continue # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3038..303A ; ID_Continue # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; ID_Continue # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+303C ; ID_Continue # Lo MASU MARK
+3041..3096 ; ID_Continue # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+3099..309A ; ID_Continue # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B..309C ; ID_Continue # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D..309E ; ID_Continue # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; ID_Continue # Lo HIRAGANA DIGRAPH YORI
+30A1..30FA ; ID_Continue # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FC..30FE ; ID_Continue # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+30FF ; ID_Continue # Lo KATAKANA DIGRAPH KOTO
+3105..312D ; ID_Continue # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+3131..318E ; ID_Continue # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+31A0..31B7 ; ID_Continue # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+31F0..31FF ; ID_Continue # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3400..4DB5 ; ID_Continue # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FCB ; ID_Continue # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+A000..A014 ; ID_Continue # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; ID_Continue # Lm YI SYLLABLE WU
+A016..A48C ; ID_Continue # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A4D0..A4F7 ; ID_Continue # Lo [40] LISU LETTER BA..LISU LETTER OE
+A4F8..A4FD ; ID_Continue # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A500..A60B ; ID_Continue # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; ID_Continue # Lm VAI SYLLABLE LENGTHENER
+A610..A61F ; ID_Continue # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A620..A629 ; ID_Continue # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE
+A62A..A62B ; ID_Continue # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+A640..A65F ; ID_Continue # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; ID_Continue # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; ID_Continue # Lo CYRILLIC LETTER MULTIOCULAR O
+A66F ; ID_Continue # Mn COMBINING CYRILLIC VZMET
+A67C..A67D ; ID_Continue # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67F ; ID_Continue # Lm CYRILLIC PAYEROK
+A680..A697 ; ID_Continue # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+A6A0..A6E5 ; ID_Continue # Lo [70] BAMUM LETTER A..BAMUM LETTER KI
+A6E6..A6EF ; ID_Continue # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A6F0..A6F1 ; ID_Continue # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A717..A71F ; ID_Continue # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A722..A76F ; ID_Continue # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; ID_Continue # Lm MODIFIER LETTER US
+A771..A787 ; ID_Continue # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A788 ; ID_Continue # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A78B..A78C ; ID_Continue # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A801 ; ID_Continue # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I
+A802 ; ID_Continue # Mn SYLOTI NAGRI SIGN DVISVARA
+A803..A805 ; ID_Continue # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A806 ; ID_Continue # Mn SYLOTI NAGRI SIGN HASANTA
+A807..A80A ; ID_Continue # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80B ; ID_Continue # Mn SYLOTI NAGRI SIGN ANUSVARA
+A80C..A822 ; ID_Continue # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824 ; ID_Continue # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826 ; ID_Continue # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827 ; ID_Continue # Mc SYLOTI NAGRI VOWEL SIGN OO
+A840..A873 ; ID_Continue # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A880..A881 ; ID_Continue # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A882..A8B3 ; ID_Continue # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8B4..A8C3 ; ID_Continue # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A8C4 ; ID_Continue # Mn SAURASHTRA SIGN VIRAMA
+A8D0..A8D9 ; ID_Continue # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+A8E0..A8F1 ; ID_Continue # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A8F2..A8F7 ; ID_Continue # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8FB ; ID_Continue # Lo DEVANAGARI HEADSTROKE
+A900..A909 ; ID_Continue # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE
+A90A..A925 ; ID_Continue # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A926..A92D ; ID_Continue # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A930..A946 ; ID_Continue # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A947..A951 ; ID_Continue # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952..A953 ; ID_Continue # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A960..A97C ; ID_Continue # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+A980..A982 ; ID_Continue # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A983 ; ID_Continue # Mc JAVANESE SIGN WIGNYAN
+A984..A9B2 ; ID_Continue # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA
+A9B3 ; ID_Continue # Mn JAVANESE SIGN CECAK TELU
+A9B4..A9B5 ; ID_Continue # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9B6..A9B9 ; ID_Continue # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BA..A9BB ; ID_Continue # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BC ; ID_Continue # Mn JAVANESE VOWEL SIGN PEPET
+A9BD..A9C0 ; ID_Continue # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON
+A9CF ; ID_Continue # Lm JAVANESE PANGRANGKEP
+A9D0..A9D9 ; ID_Continue # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE
+AA00..AA28 ; ID_Continue # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA29..AA2E ; ID_Continue # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30 ; ID_Continue # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32 ; ID_Continue # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34 ; ID_Continue # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36 ; ID_Continue # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA40..AA42 ; ID_Continue # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA43 ; ID_Continue # Mn CHAM CONSONANT SIGN FINAL NG
+AA44..AA4B ; ID_Continue # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA4C ; ID_Continue # Mn CHAM CONSONANT SIGN FINAL M
+AA4D ; ID_Continue # Mc CHAM CONSONANT SIGN FINAL H
+AA50..AA59 ; ID_Continue # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE
+AA60..AA6F ; ID_Continue # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA
+AA70 ; ID_Continue # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AA71..AA76 ; ID_Continue # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM
+AA7A ; ID_Continue # Lo MYANMAR LETTER AITON RA
+AA7B ; ID_Continue # Mc MYANMAR SIGN PAO KAREN TONE
+AA80..AAAF ; ID_Continue # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O
+AAB0 ; ID_Continue # Mn TAI VIET MAI KANG
+AAB1 ; ID_Continue # Lo TAI VIET VOWEL AA
+AAB2..AAB4 ; ID_Continue # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB5..AAB6 ; ID_Continue # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB7..AAB8 ; ID_Continue # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AAB9..AABD ; ID_Continue # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN
+AABE..AABF ; ID_Continue # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC0 ; ID_Continue # Lo TAI VIET TONE MAI NUENG
+AAC1 ; ID_Continue # Mn TAI VIET TONE MAI THO
+AAC2 ; ID_Continue # Lo TAI VIET TONE MAI SONG
+AADB..AADC ; ID_Continue # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG
+AADD ; ID_Continue # Lm TAI VIET SYMBOL SAM
+ABC0..ABE2 ; ID_Continue # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
+ABE3..ABE4 ; ID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE5 ; ID_Continue # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE6..ABE7 ; ID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE8 ; ID_Continue # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABE9..ABEA ; ID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+ABEC ; ID_Continue # Mc MEETEI MAYEK LUM IYEK
+ABED ; ID_Continue # Mn MEETEI MAYEK APUN IYEK
+ABF0..ABF9 ; ID_Continue # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
+AC00..D7A3 ; ID_Continue # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+D7B0..D7C6 ; ID_Continue # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7CB..D7FB ; ID_Continue # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+F900..FA2D ; ID_Continue # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6D ; ID_Continue # Lo [62] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA70..FAD9 ; ID_Continue # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00..FB06 ; ID_Continue # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; ID_Continue # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB1D ; ID_Continue # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1E ; ID_Continue # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F..FB28 ; ID_Continue # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB2A..FB36 ; ID_Continue # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; ID_Continue # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; ID_Continue # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; ID_Continue # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; ID_Continue # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FBB1 ; ID_Continue # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FD3D ; ID_Continue # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F ; ID_Continue # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; ID_Continue # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB ; ID_Continue # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FE00..FE0F ; ID_Continue # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE26 ; ID_Continue # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+FE33..FE34 ; ID_Continue # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE4D..FE4F ; ID_Continue # Pc [3] DASHED LOW LINE..WAVY LOW LINE
+FE70..FE74 ; ID_Continue # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC ; ID_Continue # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FF10..FF19 ; ID_Continue # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF21..FF3A ; ID_Continue # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF3F ; ID_Continue # Pc FULLWIDTH LOW LINE
+FF41..FF5A ; ID_Continue # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF66..FF6F ; ID_Continue # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 ; ID_Continue # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D ; ID_Continue # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FF9E..FF9F ; ID_Continue # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0..FFBE ; ID_Continue # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+10000..1000B ; ID_Continue # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; ID_Continue # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; ID_Continue # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; ID_Continue # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; ID_Continue # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; ID_Continue # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; ID_Continue # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+10140..10174 ; ID_Continue # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+101FD ; ID_Continue # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10280..1029C ; ID_Continue # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+102A0..102D0 ; ID_Continue # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+10300..1031E ; ID_Continue # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10330..10340 ; ID_Continue # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; ID_Continue # Nl GOTHIC LETTER NINETY
+10342..10349 ; ID_Continue # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; ID_Continue # Nl GOTHIC LETTER NINE HUNDRED
+10380..1039D ; ID_Continue # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+103A0..103C3 ; ID_Continue # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; ID_Continue # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D1..103D5 ; ID_Continue # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+10400..1044F ; ID_Continue # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+10450..1049D ; ID_Continue # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO
+104A0..104A9 ; ID_Continue # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+10800..10805 ; ID_Continue # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; ID_Continue # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; ID_Continue # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; ID_Continue # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; ID_Continue # Lo CYPRIOT SYLLABLE ZA
+1083F..10855 ; ID_Continue # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW
+10900..10915 ; ID_Continue # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10920..10939 ; ID_Continue # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+10A00 ; ID_Continue # Lo KHAROSHTHI LETTER A
+10A01..10A03 ; ID_Continue # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; ID_Continue # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; ID_Continue # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A10..10A13 ; ID_Continue # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; ID_Continue # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; ID_Continue # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A38..10A3A ; ID_Continue # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; ID_Continue # Mn KHAROSHTHI VIRAMA
+10A60..10A7C ; ID_Continue # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10B00..10B35 ; ID_Continue # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE
+10B40..10B55 ; ID_Continue # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B60..10B72 ; ID_Continue # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10C00..10C48 ; ID_Continue # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+11080..11081 ; ID_Continue # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
+11082 ; ID_Continue # Mc KAITHI SIGN VISARGA
+11083..110AF ; ID_Continue # Lo [45] KAITHI LETTER A..KAITHI LETTER HA
+110B0..110B2 ; ID_Continue # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B3..110B6 ; ID_Continue # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B7..110B8 ; ID_Continue # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+110B9..110BA ; ID_Continue # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+12000..1236E ; ID_Continue # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462 ; ID_Continue # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+13000..1342E ; ID_Continue # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+1D165..1D166 ; ID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167..1D169 ; ID_Continue # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16D..1D172 ; ID_Continue # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D17B..1D182 ; ID_Continue # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; ID_Continue # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; ID_Continue # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D242..1D244 ; ID_Continue # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1D400..1D454 ; ID_Continue # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; ID_Continue # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; ID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; ID_Continue # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; ID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; ID_Continue # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; ID_Continue # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; ID_Continue # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; ID_Continue # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; ID_Continue # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; ID_Continue # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; ID_Continue # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; ID_Continue # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; ID_Continue # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; ID_Continue # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; ID_Continue # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; ID_Continue # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; ID_Continue # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; ID_Continue # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; ID_Continue # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA ; ID_Continue # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA ; ID_Continue # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714 ; ID_Continue # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734 ; ID_Continue # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E ; ID_Continue # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E ; ID_Continue # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788 ; ID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8 ; ID_Continue # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2 ; ID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7CB ; ID_Continue # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; ID_Continue # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+20000..2A6D6 ; ID_Continue # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; ID_Continue # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2F800..2FA1D ; ID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 101634
+
+# ================================================
+
+# Derived Property: XID_Start
+# ID_Start modified for closure under NFKx
+# Modified as described in UAX #15
+# NOTE: Does NOT remove the non-NFKx characters.
+# Merely ensures that if isIdentifer(string) then isIdentifier(NFKx(string))
+# NOTE: See UAX #31 for more information
+
+0041..005A ; XID_Start # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A ; XID_Start # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; XID_Start # L& FEMININE ORDINAL INDICATOR
+00B5 ; XID_Start # L& MICRO SIGN
+00BA ; XID_Start # L& MASCULINE ORDINAL INDICATOR
+00C0..00D6 ; XID_Start # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; XID_Start # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA ; XID_Start # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; XID_Start # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; XID_Start # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; XID_Start # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293 ; XID_Start # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294 ; XID_Start # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; XID_Start # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02C1 ; XID_Start # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C6..02D1 ; XID_Start # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02E0..02E4 ; XID_Start # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02EC ; XID_Start # Lm MODIFIER LETTER VOICING
+02EE ; XID_Start # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+0370..0373 ; XID_Start # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0374 ; XID_Start # Lm GREEK NUMERAL SIGN
+0376..0377 ; XID_Start # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037B..037D ; XID_Start # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0386 ; XID_Start # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; XID_Start # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; XID_Start # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; XID_Start # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03F5 ; XID_Start # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
+03F7..0481 ; XID_Start # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
+048A..0525 ; XID_Start # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+0531..0556 ; XID_Start # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; XID_Start # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+0561..0587 ; XID_Start # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+05D0..05EA ; XID_Start # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; XID_Start # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+0621..063F ; XID_Start # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640 ; XID_Start # Lm ARABIC TATWEEL
+0641..064A ; XID_Start # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+066E..066F ; XID_Start # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0671..06D3 ; XID_Start # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D5 ; XID_Start # Lo ARABIC LETTER AE
+06E5..06E6 ; XID_Start # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06EE..06EF ; XID_Start # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06FA..06FC ; XID_Start # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FF ; XID_Start # Lo ARABIC LETTER HEH WITH INVERTED V
+0710 ; XID_Start # Lo SYRIAC LETTER ALAPH
+0712..072F ; XID_Start # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+074D..07A5 ; XID_Start # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU
+07B1 ; XID_Start # Lo THAANA LETTER NAA
+07CA..07EA ; XID_Start # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07F4..07F5 ; XID_Start # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07FA ; XID_Start # Lm NKO LAJANYALAN
+0800..0815 ; XID_Start # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
+081A ; XID_Start # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+0824 ; XID_Start # Lm SAMARITAN MODIFIER LETTER SHORT A
+0828 ; XID_Start # Lm SAMARITAN MODIFIER LETTER I
+0904..0939 ; XID_Start # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093D ; XID_Start # Lo DEVANAGARI SIGN AVAGRAHA
+0950 ; XID_Start # Lo DEVANAGARI OM
+0958..0961 ; XID_Start # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0971 ; XID_Start # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972 ; XID_Start # Lo DEVANAGARI LETTER CANDRA A
+0979..097F ; XID_Start # Lo [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+0985..098C ; XID_Start # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; XID_Start # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; XID_Start # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; XID_Start # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; XID_Start # Lo BENGALI LETTER LA
+09B6..09B9 ; XID_Start # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BD ; XID_Start # Lo BENGALI SIGN AVAGRAHA
+09CE ; XID_Start # Lo BENGALI LETTER KHANDA TA
+09DC..09DD ; XID_Start # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; XID_Start # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09F0..09F1 ; XID_Start # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+0A05..0A0A ; XID_Start # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; XID_Start # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; XID_Start # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; XID_Start # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; XID_Start # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; XID_Start # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; XID_Start # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A59..0A5C ; XID_Start # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; XID_Start # Lo GURMUKHI LETTER FA
+0A72..0A74 ; XID_Start # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A85..0A8D ; XID_Start # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; XID_Start # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; XID_Start # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; XID_Start # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; XID_Start # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; XID_Start # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABD ; XID_Start # Lo GUJARATI SIGN AVAGRAHA
+0AD0 ; XID_Start # Lo GUJARATI OM
+0AE0..0AE1 ; XID_Start # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0B05..0B0C ; XID_Start # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; XID_Start # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; XID_Start # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; XID_Start # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; XID_Start # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; XID_Start # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3D ; XID_Start # Lo ORIYA SIGN AVAGRAHA
+0B5C..0B5D ; XID_Start # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; XID_Start # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B71 ; XID_Start # Lo ORIYA LETTER WA
+0B83 ; XID_Start # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; XID_Start # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; XID_Start # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; XID_Start # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; XID_Start # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; XID_Start # Lo TAMIL LETTER JA
+0B9E..0B9F ; XID_Start # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; XID_Start # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; XID_Start # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; XID_Start # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BD0 ; XID_Start # Lo TAMIL OM
+0C05..0C0C ; XID_Start # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; XID_Start # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; XID_Start # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33 ; XID_Start # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39 ; XID_Start # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D ; XID_Start # Lo TELUGU SIGN AVAGRAHA
+0C58..0C59 ; XID_Start # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61 ; XID_Start # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C85..0C8C ; XID_Start # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; XID_Start # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; XID_Start # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; XID_Start # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; XID_Start # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBD ; XID_Start # Lo KANNADA SIGN AVAGRAHA
+0CDE ; XID_Start # Lo KANNADA LETTER FA
+0CE0..0CE1 ; XID_Start # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0D05..0D0C ; XID_Start # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; XID_Start # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28 ; XID_Start # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39 ; XID_Start # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D ; XID_Start # Lo MALAYALAM SIGN AVAGRAHA
+0D60..0D61 ; XID_Start # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D7A..0D7F ; XID_Start # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D85..0D96 ; XID_Start # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; XID_Start # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; XID_Start # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; XID_Start # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; XID_Start # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0E01..0E30 ; XID_Start # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E32 ; XID_Start # Lo THAI CHARACTER SARA AA
+0E40..0E45 ; XID_Start # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; XID_Start # Lm THAI CHARACTER MAIYAMOK
+0E81..0E82 ; XID_Start # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; XID_Start # Lo LAO LETTER KHO TAM
+0E87..0E88 ; XID_Start # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; XID_Start # Lo LAO LETTER SO TAM
+0E8D ; XID_Start # Lo LAO LETTER NYO
+0E94..0E97 ; XID_Start # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; XID_Start # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; XID_Start # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; XID_Start # Lo LAO LETTER LO LOOT
+0EA7 ; XID_Start # Lo LAO LETTER WO
+0EAA..0EAB ; XID_Start # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; XID_Start # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB2 ; XID_Start # Lo LAO VOWEL SIGN AA
+0EBD ; XID_Start # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; XID_Start # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; XID_Start # Lm LAO KO LA
+0EDC..0EDD ; XID_Start # Lo [2] LAO HO NO..LAO HO MO
+0F00 ; XID_Start # Lo TIBETAN SYLLABLE OM
+0F40..0F47 ; XID_Start # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; XID_Start # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F88..0F8B ; XID_Start # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+1000..102A ; XID_Start # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+103F ; XID_Start # Lo MYANMAR LETTER GREAT SA
+1050..1055 ; XID_Start # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+105A..105D ; XID_Start # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+1061 ; XID_Start # Lo MYANMAR LETTER SGAW KAREN SHA
+1065..1066 ; XID_Start # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+106E..1070 ; XID_Start # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1075..1081 ; XID_Start # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+108E ; XID_Start # Lo MYANMAR LETTER RUMAI PALAUNG FA
+10A0..10C5 ; XID_Start # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA ; XID_Start # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC ; XID_Start # Lm MODIFIER LETTER GEORGIAN NAR
+1100..1248 ; XID_Start # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA
+124A..124D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; XID_Start # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; XID_Start # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; XID_Start # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; XID_Start # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; XID_Start # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; XID_Start # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; XID_Start # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+1380..138F ; XID_Start # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+13A0..13F4 ; XID_Start # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+1401..166C ; XID_Start # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166F..167F ; XID_Start # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+1681..169A ; XID_Start # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+16A0..16EA ; XID_Start # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0 ; XID_Start # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+1700..170C ; XID_Start # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; XID_Start # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1720..1731 ; XID_Start # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1740..1751 ; XID_Start # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1760..176C ; XID_Start # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; XID_Start # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1780..17B3 ; XID_Start # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17D7 ; XID_Start # Lm KHMER SIGN LEK TOO
+17DC ; XID_Start # Lo KHMER SIGN AVAKRAHASANYA
+1820..1842 ; XID_Start # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; XID_Start # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; XID_Start # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8 ; XID_Start # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18AA ; XID_Start # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+18B0..18F5 ; XID_Start # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+1900..191C ; XID_Start # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1950..196D ; XID_Start # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; XID_Start # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1980..19AB ; XID_Start # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19C1..19C7 ; XID_Start # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+1A00..1A16 ; XID_Start # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A20..1A54 ; XID_Start # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
+1AA7 ; XID_Start # Lm TAI THAM SIGN MAI YAMOK
+1B05..1B33 ; XID_Start # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B45..1B4B ; XID_Start # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B83..1BA0 ; XID_Start # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BAE..1BAF ; XID_Start # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1C00..1C23 ; XID_Start # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C4D..1C4F ; XID_Start # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+1C5A..1C77 ; XID_Start # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; XID_Start # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1CE9..1CEC ; XID_Start # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL
+1CEE..1CF1 ; XID_Start # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA
+1D00..1D2B ; XID_Start # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61 ; XID_Start # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D77 ; XID_Start # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
+1D78 ; XID_Start # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D9A ; XID_Start # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; XID_Start # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1E00..1F15 ; XID_Start # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; XID_Start # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; XID_Start # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; XID_Start # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; XID_Start # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; XID_Start # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; XID_Start # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; XID_Start # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE ; XID_Start # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; XID_Start # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; XID_Start # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3 ; XID_Start # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; XID_Start # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE0..1FEC ; XID_Start # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4 ; XID_Start # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; XID_Start # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2071 ; XID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER I
+207F ; XID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094 ; XID_Start # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+2102 ; XID_Start # L& DOUBLE-STRUCK CAPITAL C
+2107 ; XID_Start # L& EULER CONSTANT
+210A..2113 ; XID_Start # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; XID_Start # L& DOUBLE-STRUCK CAPITAL N
+2118 ; XID_Start # So SCRIPT CAPITAL P
+2119..211D ; XID_Start # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; XID_Start # L& DOUBLE-STRUCK CAPITAL Z
+2126 ; XID_Start # L& OHM SIGN
+2128 ; XID_Start # L& BLACK-LETTER CAPITAL Z
+212A..212D ; XID_Start # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212E ; XID_Start # So ESTIMATED SYMBOL
+212F..2134 ; XID_Start # L& [6] SCRIPT SMALL E..SCRIPT SMALL O
+2135..2138 ; XID_Start # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; XID_Start # L& INFORMATION SOURCE
+213C..213F ; XID_Start # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149 ; XID_Start # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214E ; XID_Start # L& TURNED SMALL F
+2160..2182 ; XID_Start # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; XID_Start # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; XID_Start # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2C00..2C2E ; XID_Start # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; XID_Start # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C7C ; XID_Start # L& [29] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; XID_Start # Lm MODIFIER LETTER CAPITAL V
+2C7E..2CE4 ; XID_Start # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI
+2CEB..2CEE ; XID_Start # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2D00..2D25 ; XID_Start # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+2D30..2D65 ; XID_Start # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F ; XID_Start # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80..2D96 ; XID_Start # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+3005 ; XID_Start # Lm IDEOGRAPHIC ITERATION MARK
+3006 ; XID_Start # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; XID_Start # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; XID_Start # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3031..3035 ; XID_Start # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3038..303A ; XID_Start # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; XID_Start # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+303C ; XID_Start # Lo MASU MARK
+3041..3096 ; XID_Start # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309D..309E ; XID_Start # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; XID_Start # Lo HIRAGANA DIGRAPH YORI
+30A1..30FA ; XID_Start # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FC..30FE ; XID_Start # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+30FF ; XID_Start # Lo KATAKANA DIGRAPH KOTO
+3105..312D ; XID_Start # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+3131..318E ; XID_Start # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+31A0..31B7 ; XID_Start # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+31F0..31FF ; XID_Start # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3400..4DB5 ; XID_Start # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FCB ; XID_Start # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+A000..A014 ; XID_Start # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; XID_Start # Lm YI SYLLABLE WU
+A016..A48C ; XID_Start # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A4D0..A4F7 ; XID_Start # Lo [40] LISU LETTER BA..LISU LETTER OE
+A4F8..A4FD ; XID_Start # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A500..A60B ; XID_Start # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; XID_Start # Lm VAI SYLLABLE LENGTHENER
+A610..A61F ; XID_Start # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A62A..A62B ; XID_Start # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+A640..A65F ; XID_Start # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; XID_Start # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; XID_Start # Lo CYRILLIC LETTER MULTIOCULAR O
+A67F ; XID_Start # Lm CYRILLIC PAYEROK
+A680..A697 ; XID_Start # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+A6A0..A6E5 ; XID_Start # Lo [70] BAMUM LETTER A..BAMUM LETTER KI
+A6E6..A6EF ; XID_Start # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A717..A71F ; XID_Start # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A722..A76F ; XID_Start # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; XID_Start # Lm MODIFIER LETTER US
+A771..A787 ; XID_Start # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A788 ; XID_Start # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A78B..A78C ; XID_Start # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A801 ; XID_Start # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I
+A803..A805 ; XID_Start # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A807..A80A ; XID_Start # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80C..A822 ; XID_Start # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A840..A873 ; XID_Start # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A882..A8B3 ; XID_Start # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8F2..A8F7 ; XID_Start # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8FB ; XID_Start # Lo DEVANAGARI HEADSTROKE
+A90A..A925 ; XID_Start # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A930..A946 ; XID_Start # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A960..A97C ; XID_Start # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+A984..A9B2 ; XID_Start # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA
+A9CF ; XID_Start # Lm JAVANESE PANGRANGKEP
+AA00..AA28 ; XID_Start # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA40..AA42 ; XID_Start # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA44..AA4B ; XID_Start # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA60..AA6F ; XID_Start # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA
+AA70 ; XID_Start # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AA71..AA76 ; XID_Start # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM
+AA7A ; XID_Start # Lo MYANMAR LETTER AITON RA
+AA80..AAAF ; XID_Start # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O
+AAB1 ; XID_Start # Lo TAI VIET VOWEL AA
+AAB5..AAB6 ; XID_Start # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB9..AABD ; XID_Start # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN
+AAC0 ; XID_Start # Lo TAI VIET TONE MAI NUENG
+AAC2 ; XID_Start # Lo TAI VIET TONE MAI SONG
+AADB..AADC ; XID_Start # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG
+AADD ; XID_Start # Lm TAI VIET SYMBOL SAM
+ABC0..ABE2 ; XID_Start # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
+AC00..D7A3 ; XID_Start # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+D7B0..D7C6 ; XID_Start # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7CB..D7FB ; XID_Start # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+F900..FA2D ; XID_Start # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6D ; XID_Start # Lo [62] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA70..FAD9 ; XID_Start # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00..FB06 ; XID_Start # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; XID_Start # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB1D ; XID_Start # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1F..FB28 ; XID_Start # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB2A..FB36 ; XID_Start # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; XID_Start # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; XID_Start # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; XID_Start # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; XID_Start # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FBB1 ; XID_Start # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FC5D ; XID_Start # Lo [139] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64..FD3D ; XID_Start # Lo [218] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F ; XID_Start # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; XID_Start # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDF9 ; XID_Start # Lo [10] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE SALLA ISOLATED FORM
+FE71 ; XID_Start # Lo ARABIC TATWEEL WITH FATHATAN ABOVE
+FE73 ; XID_Start # Lo ARABIC TAIL FRAGMENT
+FE77 ; XID_Start # Lo ARABIC FATHA MEDIAL FORM
+FE79 ; XID_Start # Lo ARABIC DAMMA MEDIAL FORM
+FE7B ; XID_Start # Lo ARABIC KASRA MEDIAL FORM
+FE7D ; XID_Start # Lo ARABIC SHADDA MEDIAL FORM
+FE7F..FEFC ; XID_Start # Lo [126] ARABIC SUKUN MEDIAL FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FF21..FF3A ; XID_Start # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A ; XID_Start # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF66..FF6F ; XID_Start # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 ; XID_Start # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D ; XID_Start # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FFA0..FFBE ; XID_Start # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+10000..1000B ; XID_Start # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; XID_Start # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; XID_Start # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; XID_Start # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; XID_Start # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; XID_Start # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; XID_Start # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+10140..10174 ; XID_Start # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10280..1029C ; XID_Start # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+102A0..102D0 ; XID_Start # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+10300..1031E ; XID_Start # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10330..10340 ; XID_Start # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; XID_Start # Nl GOTHIC LETTER NINETY
+10342..10349 ; XID_Start # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; XID_Start # Nl GOTHIC LETTER NINE HUNDRED
+10380..1039D ; XID_Start # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+103A0..103C3 ; XID_Start # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; XID_Start # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D1..103D5 ; XID_Start # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+10400..1044F ; XID_Start # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+10450..1049D ; XID_Start # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO
+10800..10805 ; XID_Start # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; XID_Start # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; XID_Start # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; XID_Start # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; XID_Start # Lo CYPRIOT SYLLABLE ZA
+1083F..10855 ; XID_Start # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW
+10900..10915 ; XID_Start # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10920..10939 ; XID_Start # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+10A00 ; XID_Start # Lo KHAROSHTHI LETTER A
+10A10..10A13 ; XID_Start # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; XID_Start # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; XID_Start # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A60..10A7C ; XID_Start # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10B00..10B35 ; XID_Start # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE
+10B40..10B55 ; XID_Start # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B60..10B72 ; XID_Start # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10C00..10C48 ; XID_Start # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+11083..110AF ; XID_Start # Lo [45] KAITHI LETTER A..KAITHI LETTER HA
+12000..1236E ; XID_Start # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462 ; XID_Start # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+13000..1342E ; XID_Start # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+1D400..1D454 ; XID_Start # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; XID_Start # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; XID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; XID_Start # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; XID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; XID_Start # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; XID_Start # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; XID_Start # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; XID_Start # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; XID_Start # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; XID_Start # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; XID_Start # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; XID_Start # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; XID_Start # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; XID_Start # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; XID_Start # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; XID_Start # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; XID_Start # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; XID_Start # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; XID_Start # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA ; XID_Start # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA ; XID_Start # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714 ; XID_Start # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734 ; XID_Start # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E ; XID_Start # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E ; XID_Start # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788 ; XID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8 ; XID_Start # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2 ; XID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7CB ; XID_Start # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+20000..2A6D6 ; XID_Start # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; XID_Start # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2F800..2FA1D ; XID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 99741
+
+# ================================================
+
+# Derived Property: XID_Continue
+# Mod_ID_Continue modified for closure under NFKx
+# Modified as described in UAX #15
+# NOTE: Cf characters should be filtered out.
+# NOTE: Does NOT remove the non-NFKx characters.
+# Merely ensures that if isIdentifer(string) then isIdentifier(NFKx(string))
+# NOTE: See UAX #31 for more information
+
+0030..0039 ; XID_Continue # Nd [10] DIGIT ZERO..DIGIT NINE
+0041..005A ; XID_Continue # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+005F ; XID_Continue # Pc LOW LINE
+0061..007A ; XID_Continue # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; XID_Continue # L& FEMININE ORDINAL INDICATOR
+00B5 ; XID_Continue # L& MICRO SIGN
+00B7 ; XID_Continue # Po MIDDLE DOT
+00BA ; XID_Continue # L& MASCULINE ORDINAL INDICATOR
+00C0..00D6 ; XID_Continue # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; XID_Continue # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA ; XID_Continue # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; XID_Continue # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; XID_Continue # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; XID_Continue # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293 ; XID_Continue # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294 ; XID_Continue # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; XID_Continue # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02C1 ; XID_Continue # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C6..02D1 ; XID_Continue # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02E0..02E4 ; XID_Continue # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02EC ; XID_Continue # Lm MODIFIER LETTER VOICING
+02EE ; XID_Continue # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+0300..036F ; XID_Continue # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0370..0373 ; XID_Continue # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0374 ; XID_Continue # Lm GREEK NUMERAL SIGN
+0376..0377 ; XID_Continue # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037B..037D ; XID_Continue # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0386 ; XID_Continue # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387 ; XID_Continue # Po GREEK ANO TELEIA
+0388..038A ; XID_Continue # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; XID_Continue # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; XID_Continue # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03F5 ; XID_Continue # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
+03F7..0481 ; XID_Continue # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
+0483..0487 ; XID_Continue # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+048A..0525 ; XID_Continue # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+0531..0556 ; XID_Continue # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; XID_Continue # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+0561..0587 ; XID_Continue # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+0591..05BD ; XID_Continue # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BF ; XID_Continue # Mn HEBREW POINT RAFE
+05C1..05C2 ; XID_Continue # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; XID_Continue # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; XID_Continue # Mn HEBREW POINT QAMATS QATAN
+05D0..05EA ; XID_Continue # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; XID_Continue # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+0610..061A ; XID_Continue # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+0621..063F ; XID_Continue # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640 ; XID_Continue # Lm ARABIC TATWEEL
+0641..064A ; XID_Continue # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+064B..065E ; XID_Continue # Mn [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS
+0660..0669 ; XID_Continue # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+066E..066F ; XID_Continue # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0670 ; XID_Continue # Mn ARABIC LETTER SUPERSCRIPT ALEF
+0671..06D3 ; XID_Continue # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D5 ; XID_Continue # Lo ARABIC LETTER AE
+06D6..06DC ; XID_Continue # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DF..06E4 ; XID_Continue # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E5..06E6 ; XID_Continue # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8 ; XID_Continue # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED ; XID_Continue # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+06EE..06EF ; XID_Continue # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06F0..06F9 ; XID_Continue # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA..06FC ; XID_Continue # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FF ; XID_Continue # Lo ARABIC LETTER HEH WITH INVERTED V
+0710 ; XID_Continue # Lo SYRIAC LETTER ALAPH
+0711 ; XID_Continue # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0712..072F ; XID_Continue # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+0730..074A ; XID_Continue # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+074D..07A5 ; XID_Continue # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU
+07A6..07B0 ; XID_Continue # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07B1 ; XID_Continue # Lo THAANA LETTER NAA
+07C0..07C9 ; XID_Continue # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE
+07CA..07EA ; XID_Continue # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07EB..07F3 ; XID_Continue # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5 ; XID_Continue # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07FA ; XID_Continue # Lm NKO LAJANYALAN
+0800..0815 ; XID_Continue # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
+0816..0819 ; XID_Continue # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081A ; XID_Continue # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+081B..0823 ; XID_Continue # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0824 ; XID_Continue # Lm SAMARITAN MODIFIER LETTER SHORT A
+0825..0827 ; XID_Continue # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0828 ; XID_Continue # Lm SAMARITAN MODIFIER LETTER I
+0829..082D ; XID_Continue # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0900..0902 ; XID_Continue # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903 ; XID_Continue # Mc DEVANAGARI SIGN VISARGA
+0904..0939 ; XID_Continue # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093C ; XID_Continue # Mn DEVANAGARI SIGN NUKTA
+093D ; XID_Continue # Lo DEVANAGARI SIGN AVAGRAHA
+093E..0940 ; XID_Continue # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948 ; XID_Continue # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C ; XID_Continue # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094D ; XID_Continue # Mn DEVANAGARI SIGN VIRAMA
+094E ; XID_Continue # Mc DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+0950 ; XID_Continue # Lo DEVANAGARI OM
+0951..0955 ; XID_Continue # Mn [5] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN CANDRA LONG E
+0958..0961 ; XID_Continue # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0962..0963 ; XID_Continue # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0966..096F ; XID_Continue # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0971 ; XID_Continue # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972 ; XID_Continue # Lo DEVANAGARI LETTER CANDRA A
+0979..097F ; XID_Continue # Lo [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+0981 ; XID_Continue # Mn BENGALI SIGN CANDRABINDU
+0982..0983 ; XID_Continue # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C ; XID_Continue # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; XID_Continue # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; XID_Continue # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; XID_Continue # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; XID_Continue # Lo BENGALI LETTER LA
+09B6..09B9 ; XID_Continue # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BC ; XID_Continue # Mn BENGALI SIGN NUKTA
+09BD ; XID_Continue # Lo BENGALI SIGN AVAGRAHA
+09BE..09C0 ; XID_Continue # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4 ; XID_Continue # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8 ; XID_Continue # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; XID_Continue # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CD ; XID_Continue # Mn BENGALI SIGN VIRAMA
+09CE ; XID_Continue # Lo BENGALI LETTER KHANDA TA
+09D7 ; XID_Continue # Mc BENGALI AU LENGTH MARK
+09DC..09DD ; XID_Continue # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; XID_Continue # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E2..09E3 ; XID_Continue # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09E6..09EF ; XID_Continue # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1 ; XID_Continue # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+0A01..0A02 ; XID_Continue # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; XID_Continue # Mc GURMUKHI SIGN VISARGA
+0A05..0A0A ; XID_Continue # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; XID_Continue # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; XID_Continue # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; XID_Continue # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; XID_Continue # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; XID_Continue # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; XID_Continue # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3C ; XID_Continue # Mn GURMUKHI SIGN NUKTA
+0A3E..0A40 ; XID_Continue # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42 ; XID_Continue # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; XID_Continue # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; XID_Continue # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; XID_Continue # Mn GURMUKHI SIGN UDAAT
+0A59..0A5C ; XID_Continue # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; XID_Continue # Lo GURMUKHI LETTER FA
+0A66..0A6F ; XID_Continue # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A70..0A71 ; XID_Continue # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A72..0A74 ; XID_Continue # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A75 ; XID_Continue # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; XID_Continue # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83 ; XID_Continue # Mc GUJARATI SIGN VISARGA
+0A85..0A8D ; XID_Continue # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; XID_Continue # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; XID_Continue # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; XID_Continue # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; XID_Continue # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; XID_Continue # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABC ; XID_Continue # Mn GUJARATI SIGN NUKTA
+0ABD ; XID_Continue # Lo GUJARATI SIGN AVAGRAHA
+0ABE..0AC0 ; XID_Continue # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5 ; XID_Continue # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; XID_Continue # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9 ; XID_Continue # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; XID_Continue # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0ACD ; XID_Continue # Mn GUJARATI SIGN VIRAMA
+0AD0 ; XID_Continue # Lo GUJARATI OM
+0AE0..0AE1 ; XID_Continue # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3 ; XID_Continue # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AE6..0AEF ; XID_Continue # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0B01 ; XID_Continue # Mn ORIYA SIGN CANDRABINDU
+0B02..0B03 ; XID_Continue # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C ; XID_Continue # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; XID_Continue # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; XID_Continue # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; XID_Continue # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; XID_Continue # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; XID_Continue # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3C ; XID_Continue # Mn ORIYA SIGN NUKTA
+0B3D ; XID_Continue # Lo ORIYA SIGN AVAGRAHA
+0B3E ; XID_Continue # Mc ORIYA VOWEL SIGN AA
+0B3F ; XID_Continue # Mn ORIYA VOWEL SIGN I
+0B40 ; XID_Continue # Mc ORIYA VOWEL SIGN II
+0B41..0B44 ; XID_Continue # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48 ; XID_Continue # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; XID_Continue # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B4D ; XID_Continue # Mn ORIYA SIGN VIRAMA
+0B56 ; XID_Continue # Mn ORIYA AI LENGTH MARK
+0B57 ; XID_Continue # Mc ORIYA AU LENGTH MARK
+0B5C..0B5D ; XID_Continue # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; XID_Continue # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B62..0B63 ; XID_Continue # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B66..0B6F ; XID_Continue # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B71 ; XID_Continue # Lo ORIYA LETTER WA
+0B82 ; XID_Continue # Mn TAMIL SIGN ANUSVARA
+0B83 ; XID_Continue # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; XID_Continue # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; XID_Continue # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; XID_Continue # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; XID_Continue # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; XID_Continue # Lo TAMIL LETTER JA
+0B9E..0B9F ; XID_Continue # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; XID_Continue # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; XID_Continue # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; XID_Continue # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBE..0BBF ; XID_Continue # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0 ; XID_Continue # Mn TAMIL VOWEL SIGN II
+0BC1..0BC2 ; XID_Continue # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; XID_Continue # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; XID_Continue # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BCD ; XID_Continue # Mn TAMIL SIGN VIRAMA
+0BD0 ; XID_Continue # Lo TAMIL OM
+0BD7 ; XID_Continue # Mc TAMIL AU LENGTH MARK
+0BE6..0BEF ; XID_Continue # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0C01..0C03 ; XID_Continue # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C ; XID_Continue # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; XID_Continue # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; XID_Continue # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33 ; XID_Continue # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39 ; XID_Continue # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D ; XID_Continue # Lo TELUGU SIGN AVAGRAHA
+0C3E..0C40 ; XID_Continue # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44 ; XID_Continue # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48 ; XID_Continue # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; XID_Continue # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; XID_Continue # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C58..0C59 ; XID_Continue # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61 ; XID_Continue # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C62..0C63 ; XID_Continue # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C66..0C6F ; XID_Continue # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C82..0C83 ; XID_Continue # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C ; XID_Continue # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; XID_Continue # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; XID_Continue # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; XID_Continue # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; XID_Continue # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBC ; XID_Continue # Mn KANNADA SIGN NUKTA
+0CBD ; XID_Continue # Lo KANNADA SIGN AVAGRAHA
+0CBE ; XID_Continue # Mc KANNADA VOWEL SIGN AA
+0CBF ; XID_Continue # Mn KANNADA VOWEL SIGN I
+0CC0..0CC4 ; XID_Continue # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; XID_Continue # Mn KANNADA VOWEL SIGN E
+0CC7..0CC8 ; XID_Continue # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; XID_Continue # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC..0CCD ; XID_Continue # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6 ; XID_Continue # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE ; XID_Continue # Lo KANNADA LETTER FA
+0CE0..0CE1 ; XID_Continue # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE2..0CE3 ; XID_Continue # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CE6..0CEF ; XID_Continue # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+0D02..0D03 ; XID_Continue # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C ; XID_Continue # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; XID_Continue # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28 ; XID_Continue # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39 ; XID_Continue # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D ; XID_Continue # Lo MALAYALAM SIGN AVAGRAHA
+0D3E..0D40 ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44 ; XID_Continue # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48 ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D4D ; XID_Continue # Mn MALAYALAM SIGN VIRAMA
+0D57 ; XID_Continue # Mc MALAYALAM AU LENGTH MARK
+0D60..0D61 ; XID_Continue # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D62..0D63 ; XID_Continue # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D66..0D6F ; XID_Continue # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D7A..0D7F ; XID_Continue # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D82..0D83 ; XID_Continue # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96 ; XID_Continue # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; XID_Continue # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; XID_Continue # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; XID_Continue # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; XID_Continue # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCA ; XID_Continue # Mn SINHALA SIGN AL-LAKUNA
+0DCF..0DD1 ; XID_Continue # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4 ; XID_Continue # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; XID_Continue # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF ; XID_Continue # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3 ; XID_Continue # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E01..0E30 ; XID_Continue # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E31 ; XID_Continue # Mn THAI CHARACTER MAI HAN-AKAT
+0E32..0E33 ; XID_Continue # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E34..0E3A ; XID_Continue # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E40..0E45 ; XID_Continue # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; XID_Continue # Lm THAI CHARACTER MAIYAMOK
+0E47..0E4E ; XID_Continue # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0E50..0E59 ; XID_Continue # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E81..0E82 ; XID_Continue # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; XID_Continue # Lo LAO LETTER KHO TAM
+0E87..0E88 ; XID_Continue # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; XID_Continue # Lo LAO LETTER SO TAM
+0E8D ; XID_Continue # Lo LAO LETTER NYO
+0E94..0E97 ; XID_Continue # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; XID_Continue # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; XID_Continue # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; XID_Continue # Lo LAO LETTER LO LOOT
+0EA7 ; XID_Continue # Lo LAO LETTER WO
+0EAA..0EAB ; XID_Continue # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; XID_Continue # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB1 ; XID_Continue # Mn LAO VOWEL SIGN MAI KAN
+0EB2..0EB3 ; XID_Continue # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EB4..0EB9 ; XID_Continue # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; XID_Continue # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EBD ; XID_Continue # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; XID_Continue # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; XID_Continue # Lm LAO KO LA
+0EC8..0ECD ; XID_Continue # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
+0ED0..0ED9 ; XID_Continue # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDD ; XID_Continue # Lo [2] LAO HO NO..LAO HO MO
+0F00 ; XID_Continue # Lo TIBETAN SYLLABLE OM
+0F18..0F19 ; XID_Continue # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F20..0F29 ; XID_Continue # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F35 ; XID_Continue # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37 ; XID_Continue # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39 ; XID_Continue # Mn TIBETAN MARK TSA -PHRU
+0F3E..0F3F ; XID_Continue # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47 ; XID_Continue # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; XID_Continue # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F71..0F7E ; XID_Continue # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F ; XID_Continue # Mc TIBETAN SIGN RNAM BCAD
+0F80..0F84 ; XID_Continue # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87 ; XID_Continue # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F88..0F8B ; XID_Continue # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0F90..0F97 ; XID_Continue # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; XID_Continue # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6 ; XID_Continue # Mn TIBETAN SYMBOL PADMA GDAN
+1000..102A ; XID_Continue # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+102B..102C ; XID_Continue # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030 ; XID_Continue # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031 ; XID_Continue # Mc MYANMAR VOWEL SIGN E
+1032..1037 ; XID_Continue # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1038 ; XID_Continue # Mc MYANMAR SIGN VISARGA
+1039..103A ; XID_Continue # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103B..103C ; XID_Continue # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E ; XID_Continue # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+103F ; XID_Continue # Lo MYANMAR LETTER GREAT SA
+1040..1049 ; XID_Continue # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+1050..1055 ; XID_Continue # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057 ; XID_Continue # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059 ; XID_Continue # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105A..105D ; XID_Continue # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+105E..1060 ; XID_Continue # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061 ; XID_Continue # Lo MYANMAR LETTER SGAW KAREN SHA
+1062..1064 ; XID_Continue # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO
+1065..1066 ; XID_Continue # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+1067..106D ; XID_Continue # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E..1070 ; XID_Continue # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071..1074 ; XID_Continue # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1075..1081 ; XID_Continue # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+1082 ; XID_Continue # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084 ; XID_Continue # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086 ; XID_Continue # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+1087..108C ; XID_Continue # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108D ; XID_Continue # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E ; XID_Continue # Lo MYANMAR LETTER RUMAI PALAUNG FA
+108F ; XID_Continue # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090..1099 ; XID_Continue # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE
+109A..109C ; XID_Continue # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A
+109D ; XID_Continue # Mn MYANMAR VOWEL SIGN AITON AI
+10A0..10C5 ; XID_Continue # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA ; XID_Continue # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC ; XID_Continue # Lm MODIFIER LETTER GEORGIAN NAR
+1100..1248 ; XID_Continue # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA
+124A..124D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; XID_Continue # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; XID_Continue # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; XID_Continue # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; XID_Continue # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; XID_Continue # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; XID_Continue # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; XID_Continue # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135F ; XID_Continue # Mn ETHIOPIC COMBINING GEMINATION MARK
+1369..1371 ; XID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE
+1380..138F ; XID_Continue # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+13A0..13F4 ; XID_Continue # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+1401..166C ; XID_Continue # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166F..167F ; XID_Continue # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+1681..169A ; XID_Continue # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+16A0..16EA ; XID_Continue # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0 ; XID_Continue # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+1700..170C ; XID_Continue # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; XID_Continue # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1712..1714 ; XID_Continue # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1720..1731 ; XID_Continue # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1732..1734 ; XID_Continue # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1740..1751 ; XID_Continue # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1752..1753 ; XID_Continue # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1760..176C ; XID_Continue # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; XID_Continue # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1772..1773 ; XID_Continue # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+1780..17B3 ; XID_Continue # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B6 ; XID_Continue # Mc KHMER VOWEL SIGN AA
+17B7..17BD ; XID_Continue # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5 ; XID_Continue # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6 ; XID_Continue # Mn KHMER SIGN NIKAHIT
+17C7..17C8 ; XID_Continue # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17C9..17D3 ; XID_Continue # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17D7 ; XID_Continue # Lm KHMER SIGN LEK TOO
+17DC ; XID_Continue # Lo KHMER SIGN AVAKRAHASANYA
+17DD ; XID_Continue # Mn KHMER SIGN ATTHACAN
+17E0..17E9 ; XID_Continue # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+180B..180D ; XID_Continue # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+1810..1819 ; XID_Continue # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842 ; XID_Continue # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; XID_Continue # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; XID_Continue # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8 ; XID_Continue # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 ; XID_Continue # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+18AA ; XID_Continue # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+18B0..18F5 ; XID_Continue # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+1900..191C ; XID_Continue # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1920..1922 ; XID_Continue # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; XID_Continue # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; XID_Continue # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; XID_Continue # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; XID_Continue # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; XID_Continue # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; XID_Continue # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1939..193B ; XID_Continue # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1946..194F ; XID_Continue # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+1950..196D ; XID_Continue # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; XID_Continue # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1980..19AB ; XID_Continue # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19B0..19C0 ; XID_Continue # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C1..19C7 ; XID_Continue # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+19C8..19C9 ; XID_Continue # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+19D0..19DA ; XID_Continue # Nd [11] NEW TAI LUE DIGIT ZERO..NEW TAI LUE THAM DIGIT ONE
+1A00..1A16 ; XID_Continue # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A17..1A18 ; XID_Continue # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B ; XID_Continue # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A20..1A54 ; XID_Continue # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
+1A55 ; XID_Continue # Mc TAI THAM CONSONANT SIGN MEDIAL RA
+1A56 ; XID_Continue # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A57 ; XID_Continue # Mc TAI THAM CONSONANT SIGN LA TANG LAI
+1A58..1A5E ; XID_Continue # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60 ; XID_Continue # Mn TAI THAM SIGN SAKOT
+1A61 ; XID_Continue # Mc TAI THAM VOWEL SIGN A
+1A62 ; XID_Continue # Mn TAI THAM VOWEL SIGN MAI SAT
+1A63..1A64 ; XID_Continue # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA
+1A65..1A6C ; XID_Continue # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A6D..1A72 ; XID_Continue # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1A73..1A7C ; XID_Continue # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; XID_Continue # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1A80..1A89 ; XID_Continue # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE
+1A90..1A99 ; XID_Continue # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE
+1AA7 ; XID_Continue # Lm TAI THAM SIGN MAI YAMOK
+1B00..1B03 ; XID_Continue # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04 ; XID_Continue # Mc BALINESE SIGN BISAH
+1B05..1B33 ; XID_Continue # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B34 ; XID_Continue # Mn BALINESE SIGN REREKAN
+1B35 ; XID_Continue # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; XID_Continue # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B ; XID_Continue # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; XID_Continue # Mn BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41 ; XID_Continue # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; XID_Continue # Mn BALINESE VOWEL SIGN PEPET
+1B43..1B44 ; XID_Continue # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B45..1B4B ; XID_Continue # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B50..1B59 ; XID_Continue # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+1B6B..1B73 ; XID_Continue # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B80..1B81 ; XID_Continue # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82 ; XID_Continue # Mc SUNDANESE SIGN PANGWISAD
+1B83..1BA0 ; XID_Continue # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BA1 ; XID_Continue # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5 ; XID_Continue # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7 ; XID_Continue # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9 ; XID_Continue # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA ; XID_Continue # Mc SUNDANESE SIGN PAMAAEH
+1BAE..1BAF ; XID_Continue # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1BB0..1BB9 ; XID_Continue # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE
+1C00..1C23 ; XID_Continue # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C24..1C2B ; XID_Continue # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33 ; XID_Continue # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35 ; XID_Continue # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1C36..1C37 ; XID_Continue # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C40..1C49 ; XID_Continue # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+1C4D..1C4F ; XID_Continue # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+1C50..1C59 ; XID_Continue # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE
+1C5A..1C77 ; XID_Continue # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; XID_Continue # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1CD0..1CD2 ; XID_Continue # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD4..1CE0 ; XID_Continue # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE1 ; XID_Continue # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CE2..1CE8 ; XID_Continue # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CE9..1CEC ; XID_Continue # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL
+1CED ; XID_Continue # Mn VEDIC SIGN TIRYAK
+1CEE..1CF1 ; XID_Continue # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA
+1CF2 ; XID_Continue # Mc VEDIC SIGN ARDHAVISARGA
+1D00..1D2B ; XID_Continue # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61 ; XID_Continue # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D77 ; XID_Continue # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
+1D78 ; XID_Continue # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D9A ; XID_Continue # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; XID_Continue # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1DC0..1DE6 ; XID_Continue # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DFD..1DFF ; XID_Continue # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1E00..1F15 ; XID_Continue # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; XID_Continue # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; XID_Continue # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; XID_Continue # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; XID_Continue # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; XID_Continue # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; XID_Continue # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; XID_Continue # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE ; XID_Continue # L& GREEK PROSGEGRAMMENI
+1FC2..1FC4 ; XID_Continue # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; XID_Continue # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3 ; XID_Continue # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; XID_Continue # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE0..1FEC ; XID_Continue # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4 ; XID_Continue # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; XID_Continue # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+203F..2040 ; XID_Continue # Pc [2] UNDERTIE..CHARACTER TIE
+2054 ; XID_Continue # Pc INVERTED UNDERTIE
+2071 ; XID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER I
+207F ; XID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094 ; XID_Continue # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+20D0..20DC ; XID_Continue # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20E1 ; XID_Continue # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E5..20F0 ; XID_Continue # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+2102 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL C
+2107 ; XID_Continue # L& EULER CONSTANT
+210A..2113 ; XID_Continue # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL N
+2118 ; XID_Continue # So SCRIPT CAPITAL P
+2119..211D ; XID_Continue # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL Z
+2126 ; XID_Continue # L& OHM SIGN
+2128 ; XID_Continue # L& BLACK-LETTER CAPITAL Z
+212A..212D ; XID_Continue # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212E ; XID_Continue # So ESTIMATED SYMBOL
+212F..2134 ; XID_Continue # L& [6] SCRIPT SMALL E..SCRIPT SMALL O
+2135..2138 ; XID_Continue # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; XID_Continue # L& INFORMATION SOURCE
+213C..213F ; XID_Continue # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149 ; XID_Continue # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214E ; XID_Continue # L& TURNED SMALL F
+2160..2182 ; XID_Continue # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; XID_Continue # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; XID_Continue # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2C00..2C2E ; XID_Continue # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; XID_Continue # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C7C ; XID_Continue # L& [29] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; XID_Continue # Lm MODIFIER LETTER CAPITAL V
+2C7E..2CE4 ; XID_Continue # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI
+2CEB..2CEE ; XID_Continue # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2CEF..2CF1 ; XID_Continue # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2D00..2D25 ; XID_Continue # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+2D30..2D65 ; XID_Continue # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F ; XID_Continue # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80..2D96 ; XID_Continue # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+2DE0..2DFF ; XID_Continue # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+3005 ; XID_Continue # Lm IDEOGRAPHIC ITERATION MARK
+3006 ; XID_Continue # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; XID_Continue # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; XID_Continue # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+302A..302F ; XID_Continue # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3031..3035 ; XID_Continue # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3038..303A ; XID_Continue # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; XID_Continue # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+303C ; XID_Continue # Lo MASU MARK
+3041..3096 ; XID_Continue # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+3099..309A ; XID_Continue # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D..309E ; XID_Continue # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; XID_Continue # Lo HIRAGANA DIGRAPH YORI
+30A1..30FA ; XID_Continue # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FC..30FE ; XID_Continue # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+30FF ; XID_Continue # Lo KATAKANA DIGRAPH KOTO
+3105..312D ; XID_Continue # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+3131..318E ; XID_Continue # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+31A0..31B7 ; XID_Continue # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+31F0..31FF ; XID_Continue # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3400..4DB5 ; XID_Continue # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FCB ; XID_Continue # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+A000..A014 ; XID_Continue # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; XID_Continue # Lm YI SYLLABLE WU
+A016..A48C ; XID_Continue # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A4D0..A4F7 ; XID_Continue # Lo [40] LISU LETTER BA..LISU LETTER OE
+A4F8..A4FD ; XID_Continue # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A500..A60B ; XID_Continue # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; XID_Continue # Lm VAI SYLLABLE LENGTHENER
+A610..A61F ; XID_Continue # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A620..A629 ; XID_Continue # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE
+A62A..A62B ; XID_Continue # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+A640..A65F ; XID_Continue # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; XID_Continue # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; XID_Continue # Lo CYRILLIC LETTER MULTIOCULAR O
+A66F ; XID_Continue # Mn COMBINING CYRILLIC VZMET
+A67C..A67D ; XID_Continue # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67F ; XID_Continue # Lm CYRILLIC PAYEROK
+A680..A697 ; XID_Continue # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+A6A0..A6E5 ; XID_Continue # Lo [70] BAMUM LETTER A..BAMUM LETTER KI
+A6E6..A6EF ; XID_Continue # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A6F0..A6F1 ; XID_Continue # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A717..A71F ; XID_Continue # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A722..A76F ; XID_Continue # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; XID_Continue # Lm MODIFIER LETTER US
+A771..A787 ; XID_Continue # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A788 ; XID_Continue # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A78B..A78C ; XID_Continue # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A801 ; XID_Continue # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I
+A802 ; XID_Continue # Mn SYLOTI NAGRI SIGN DVISVARA
+A803..A805 ; XID_Continue # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A806 ; XID_Continue # Mn SYLOTI NAGRI SIGN HASANTA
+A807..A80A ; XID_Continue # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80B ; XID_Continue # Mn SYLOTI NAGRI SIGN ANUSVARA
+A80C..A822 ; XID_Continue # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824 ; XID_Continue # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826 ; XID_Continue # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827 ; XID_Continue # Mc SYLOTI NAGRI VOWEL SIGN OO
+A840..A873 ; XID_Continue # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A880..A881 ; XID_Continue # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A882..A8B3 ; XID_Continue # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8B4..A8C3 ; XID_Continue # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A8C4 ; XID_Continue # Mn SAURASHTRA SIGN VIRAMA
+A8D0..A8D9 ; XID_Continue # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+A8E0..A8F1 ; XID_Continue # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A8F2..A8F7 ; XID_Continue # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8FB ; XID_Continue # Lo DEVANAGARI HEADSTROKE
+A900..A909 ; XID_Continue # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE
+A90A..A925 ; XID_Continue # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A926..A92D ; XID_Continue # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A930..A946 ; XID_Continue # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A947..A951 ; XID_Continue # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952..A953 ; XID_Continue # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A960..A97C ; XID_Continue # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+A980..A982 ; XID_Continue # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A983 ; XID_Continue # Mc JAVANESE SIGN WIGNYAN
+A984..A9B2 ; XID_Continue # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA
+A9B3 ; XID_Continue # Mn JAVANESE SIGN CECAK TELU
+A9B4..A9B5 ; XID_Continue # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9B6..A9B9 ; XID_Continue # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BA..A9BB ; XID_Continue # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BC ; XID_Continue # Mn JAVANESE VOWEL SIGN PEPET
+A9BD..A9C0 ; XID_Continue # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON
+A9CF ; XID_Continue # Lm JAVANESE PANGRANGKEP
+A9D0..A9D9 ; XID_Continue # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE
+AA00..AA28 ; XID_Continue # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA29..AA2E ; XID_Continue # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30 ; XID_Continue # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32 ; XID_Continue # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34 ; XID_Continue # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36 ; XID_Continue # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA40..AA42 ; XID_Continue # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA43 ; XID_Continue # Mn CHAM CONSONANT SIGN FINAL NG
+AA44..AA4B ; XID_Continue # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA4C ; XID_Continue # Mn CHAM CONSONANT SIGN FINAL M
+AA4D ; XID_Continue # Mc CHAM CONSONANT SIGN FINAL H
+AA50..AA59 ; XID_Continue # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE
+AA60..AA6F ; XID_Continue # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA
+AA70 ; XID_Continue # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AA71..AA76 ; XID_Continue # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM
+AA7A ; XID_Continue # Lo MYANMAR LETTER AITON RA
+AA7B ; XID_Continue # Mc MYANMAR SIGN PAO KAREN TONE
+AA80..AAAF ; XID_Continue # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O
+AAB0 ; XID_Continue # Mn TAI VIET MAI KANG
+AAB1 ; XID_Continue # Lo TAI VIET VOWEL AA
+AAB2..AAB4 ; XID_Continue # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB5..AAB6 ; XID_Continue # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB7..AAB8 ; XID_Continue # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AAB9..AABD ; XID_Continue # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN
+AABE..AABF ; XID_Continue # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC0 ; XID_Continue # Lo TAI VIET TONE MAI NUENG
+AAC1 ; XID_Continue # Mn TAI VIET TONE MAI THO
+AAC2 ; XID_Continue # Lo TAI VIET TONE MAI SONG
+AADB..AADC ; XID_Continue # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG
+AADD ; XID_Continue # Lm TAI VIET SYMBOL SAM
+ABC0..ABE2 ; XID_Continue # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
+ABE3..ABE4 ; XID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE5 ; XID_Continue # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE6..ABE7 ; XID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE8 ; XID_Continue # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABE9..ABEA ; XID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+ABEC ; XID_Continue # Mc MEETEI MAYEK LUM IYEK
+ABED ; XID_Continue # Mn MEETEI MAYEK APUN IYEK
+ABF0..ABF9 ; XID_Continue # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
+AC00..D7A3 ; XID_Continue # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+D7B0..D7C6 ; XID_Continue # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7CB..D7FB ; XID_Continue # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+F900..FA2D ; XID_Continue # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6D ; XID_Continue # Lo [62] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA70..FAD9 ; XID_Continue # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00..FB06 ; XID_Continue # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; XID_Continue # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB1D ; XID_Continue # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1E ; XID_Continue # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F..FB28 ; XID_Continue # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB2A..FB36 ; XID_Continue # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; XID_Continue # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; XID_Continue # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; XID_Continue # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; XID_Continue # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FBB1 ; XID_Continue # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FC5D ; XID_Continue # Lo [139] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64..FD3D ; XID_Continue # Lo [218] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F ; XID_Continue # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; XID_Continue # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDF9 ; XID_Continue # Lo [10] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE SALLA ISOLATED FORM
+FE00..FE0F ; XID_Continue # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE26 ; XID_Continue # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+FE33..FE34 ; XID_Continue # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE4D..FE4F ; XID_Continue # Pc [3] DASHED LOW LINE..WAVY LOW LINE
+FE71 ; XID_Continue # Lo ARABIC TATWEEL WITH FATHATAN ABOVE
+FE73 ; XID_Continue # Lo ARABIC TAIL FRAGMENT
+FE77 ; XID_Continue # Lo ARABIC FATHA MEDIAL FORM
+FE79 ; XID_Continue # Lo ARABIC DAMMA MEDIAL FORM
+FE7B ; XID_Continue # Lo ARABIC KASRA MEDIAL FORM
+FE7D ; XID_Continue # Lo ARABIC SHADDA MEDIAL FORM
+FE7F..FEFC ; XID_Continue # Lo [126] ARABIC SUKUN MEDIAL FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FF10..FF19 ; XID_Continue # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF21..FF3A ; XID_Continue # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF3F ; XID_Continue # Pc FULLWIDTH LOW LINE
+FF41..FF5A ; XID_Continue # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF66..FF6F ; XID_Continue # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 ; XID_Continue # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D ; XID_Continue # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FF9E..FF9F ; XID_Continue # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0..FFBE ; XID_Continue # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+10000..1000B ; XID_Continue # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; XID_Continue # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; XID_Continue # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; XID_Continue # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; XID_Continue # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; XID_Continue # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; XID_Continue # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+10140..10174 ; XID_Continue # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+101FD ; XID_Continue # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10280..1029C ; XID_Continue # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+102A0..102D0 ; XID_Continue # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+10300..1031E ; XID_Continue # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10330..10340 ; XID_Continue # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; XID_Continue # Nl GOTHIC LETTER NINETY
+10342..10349 ; XID_Continue # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; XID_Continue # Nl GOTHIC LETTER NINE HUNDRED
+10380..1039D ; XID_Continue # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+103A0..103C3 ; XID_Continue # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; XID_Continue # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D1..103D5 ; XID_Continue # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+10400..1044F ; XID_Continue # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+10450..1049D ; XID_Continue # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO
+104A0..104A9 ; XID_Continue # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+10800..10805 ; XID_Continue # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; XID_Continue # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; XID_Continue # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; XID_Continue # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; XID_Continue # Lo CYPRIOT SYLLABLE ZA
+1083F..10855 ; XID_Continue # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW
+10900..10915 ; XID_Continue # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10920..10939 ; XID_Continue # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+10A00 ; XID_Continue # Lo KHAROSHTHI LETTER A
+10A01..10A03 ; XID_Continue # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; XID_Continue # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; XID_Continue # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A10..10A13 ; XID_Continue # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; XID_Continue # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; XID_Continue # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A38..10A3A ; XID_Continue # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; XID_Continue # Mn KHAROSHTHI VIRAMA
+10A60..10A7C ; XID_Continue # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10B00..10B35 ; XID_Continue # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE
+10B40..10B55 ; XID_Continue # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B60..10B72 ; XID_Continue # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10C00..10C48 ; XID_Continue # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+11080..11081 ; XID_Continue # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
+11082 ; XID_Continue # Mc KAITHI SIGN VISARGA
+11083..110AF ; XID_Continue # Lo [45] KAITHI LETTER A..KAITHI LETTER HA
+110B0..110B2 ; XID_Continue # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B3..110B6 ; XID_Continue # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B7..110B8 ; XID_Continue # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+110B9..110BA ; XID_Continue # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+12000..1236E ; XID_Continue # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462 ; XID_Continue # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+13000..1342E ; XID_Continue # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+1D165..1D166 ; XID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167..1D169 ; XID_Continue # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16D..1D172 ; XID_Continue # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D17B..1D182 ; XID_Continue # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; XID_Continue # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; XID_Continue # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D242..1D244 ; XID_Continue # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1D400..1D454 ; XID_Continue # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; XID_Continue # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; XID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; XID_Continue # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; XID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; XID_Continue # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; XID_Continue # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; XID_Continue # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; XID_Continue # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; XID_Continue # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; XID_Continue # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; XID_Continue # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; XID_Continue # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; XID_Continue # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; XID_Continue # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; XID_Continue # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; XID_Continue # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; XID_Continue # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; XID_Continue # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; XID_Continue # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA ; XID_Continue # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA ; XID_Continue # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714 ; XID_Continue # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734 ; XID_Continue # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E ; XID_Continue # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E ; XID_Continue # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788 ; XID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8 ; XID_Continue # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2 ; XID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7CB ; XID_Continue # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; XID_Continue # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+20000..2A6D6 ; XID_Continue # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; XID_Continue # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2F800..2FA1D ; XID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+E0100..E01EF ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 101615
+
+# ================================================
+
+# Derived Property: Default_Ignorable_Code_Point
+# Generated from
+# Other_Default_Ignorable_Code_Point
+# + Cf (Format characters)
+# + Variation_Selector
+# - White_Space
+# - FFF9..FFFB (Annotation Characters)
+# - 0600..0603, 06DD, 070F (exceptional Cf characters that should be visible)
+
+00AD ; Default_Ignorable_Code_Point # Cf SOFT HYPHEN
+034F ; Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER
+115F..1160 ; Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
+17B4..17B5 ; Default_Ignorable_Code_Point # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+180B..180D ; Default_Ignorable_Code_Point # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+200B..200F ; Default_Ignorable_Code_Point # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK
+202A..202E ; Default_Ignorable_Code_Point # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+2060..2064 ; Default_Ignorable_Code_Point # Cf [5] WORD JOINER..INVISIBLE PLUS
+2065..2069 ; Default_Ignorable_Code_Point # Cn [5] <reserved-2065>..<reserved-2069>
+206A..206F ; Default_Ignorable_Code_Point # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+3164 ; Default_Ignorable_Code_Point # Lo HANGUL FILLER
+FE00..FE0F ; Default_Ignorable_Code_Point # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FEFF ; Default_Ignorable_Code_Point # Cf ZERO WIDTH NO-BREAK SPACE
+FFA0 ; Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER
+FFF0..FFF8 ; Default_Ignorable_Code_Point # Cn [9] <reserved-FFF0>..<reserved-FFF8>
+1D173..1D17A ; Default_Ignorable_Code_Point # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+E0000 ; Default_Ignorable_Code_Point # Cn <reserved-E0000>
+E0001 ; Default_Ignorable_Code_Point # Cf LANGUAGE TAG
+E0002..E001F ; Default_Ignorable_Code_Point # Cn [30] <reserved-E0002>..<reserved-E001F>
+E0020..E007F ; Default_Ignorable_Code_Point # Cf [96] TAG SPACE..CANCEL TAG
+E0080..E00FF ; Default_Ignorable_Code_Point # Cn [128] <reserved-E0080>..<reserved-E00FF>
+E0100..E01EF ; Default_Ignorable_Code_Point # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+E01F0..E0FFF ; Default_Ignorable_Code_Point # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+
+# Total code points: 4167
+
+# ================================================
+
+# Derived Property: Grapheme_Extend
+# Generated from: Me + Mn + Other_Grapheme_Extend
+# Note: depending on an application's interpretation of Co (private use),
+# they may be either in Grapheme_Base, or in Grapheme_Extend, or in neither.
+
+0300..036F ; Grapheme_Extend # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0483..0487 ; Grapheme_Extend # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488..0489 ; Grapheme_Extend # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+0591..05BD ; Grapheme_Extend # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BF ; Grapheme_Extend # Mn HEBREW POINT RAFE
+05C1..05C2 ; Grapheme_Extend # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; Grapheme_Extend # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; Grapheme_Extend # Mn HEBREW POINT QAMATS QATAN
+0610..061A ; Grapheme_Extend # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+064B..065E ; Grapheme_Extend # Mn [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS
+0670 ; Grapheme_Extend # Mn ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC ; Grapheme_Extend # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DE ; Grapheme_Extend # Me ARABIC START OF RUB EL HIZB
+06DF..06E4 ; Grapheme_Extend # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E7..06E8 ; Grapheme_Extend # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED ; Grapheme_Extend # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+0711 ; Grapheme_Extend # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..074A ; Grapheme_Extend # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0 ; Grapheme_Extend # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07EB..07F3 ; Grapheme_Extend # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+0816..0819 ; Grapheme_Extend # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081B..0823 ; Grapheme_Extend # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0825..0827 ; Grapheme_Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0829..082D ; Grapheme_Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0900..0902 ; Grapheme_Extend # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+093C ; Grapheme_Extend # Mn DEVANAGARI SIGN NUKTA
+0941..0948 ; Grapheme_Extend # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+094D ; Grapheme_Extend # Mn DEVANAGARI SIGN VIRAMA
+0951..0955 ; Grapheme_Extend # Mn [5] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN CANDRA LONG E
+0962..0963 ; Grapheme_Extend # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981 ; Grapheme_Extend # Mn BENGALI SIGN CANDRABINDU
+09BC ; Grapheme_Extend # Mn BENGALI SIGN NUKTA
+09BE ; Grapheme_Extend # Mc BENGALI VOWEL SIGN AA
+09C1..09C4 ; Grapheme_Extend # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09CD ; Grapheme_Extend # Mn BENGALI SIGN VIRAMA
+09D7 ; Grapheme_Extend # Mc BENGALI AU LENGTH MARK
+09E2..09E3 ; Grapheme_Extend # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+0A01..0A02 ; Grapheme_Extend # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A3C ; Grapheme_Extend # Mn GURMUKHI SIGN NUKTA
+0A41..0A42 ; Grapheme_Extend # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; Grapheme_Extend # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; Grapheme_Extend # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; Grapheme_Extend # Mn GURMUKHI SIGN UDAAT
+0A70..0A71 ; Grapheme_Extend # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A75 ; Grapheme_Extend # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; Grapheme_Extend # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0ABC ; Grapheme_Extend # Mn GUJARATI SIGN NUKTA
+0AC1..0AC5 ; Grapheme_Extend # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; Grapheme_Extend # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0ACD ; Grapheme_Extend # Mn GUJARATI SIGN VIRAMA
+0AE2..0AE3 ; Grapheme_Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01 ; Grapheme_Extend # Mn ORIYA SIGN CANDRABINDU
+0B3C ; Grapheme_Extend # Mn ORIYA SIGN NUKTA
+0B3E ; Grapheme_Extend # Mc ORIYA VOWEL SIGN AA
+0B3F ; Grapheme_Extend # Mn ORIYA VOWEL SIGN I
+0B41..0B44 ; Grapheme_Extend # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B4D ; Grapheme_Extend # Mn ORIYA SIGN VIRAMA
+0B56 ; Grapheme_Extend # Mn ORIYA AI LENGTH MARK
+0B57 ; Grapheme_Extend # Mc ORIYA AU LENGTH MARK
+0B62..0B63 ; Grapheme_Extend # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B82 ; Grapheme_Extend # Mn TAMIL SIGN ANUSVARA
+0BBE ; Grapheme_Extend # Mc TAMIL VOWEL SIGN AA
+0BC0 ; Grapheme_Extend # Mn TAMIL VOWEL SIGN II
+0BCD ; Grapheme_Extend # Mn TAMIL SIGN VIRAMA
+0BD7 ; Grapheme_Extend # Mc TAMIL AU LENGTH MARK
+0C3E..0C40 ; Grapheme_Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C46..0C48 ; Grapheme_Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; Grapheme_Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; Grapheme_Extend # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C62..0C63 ; Grapheme_Extend # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0CBC ; Grapheme_Extend # Mn KANNADA SIGN NUKTA
+0CBF ; Grapheme_Extend # Mn KANNADA VOWEL SIGN I
+0CC2 ; Grapheme_Extend # Mc KANNADA VOWEL SIGN UU
+0CC6 ; Grapheme_Extend # Mn KANNADA VOWEL SIGN E
+0CCC..0CCD ; Grapheme_Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6 ; Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CE2..0CE3 ; Grapheme_Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0D3E ; Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA
+0D41..0D44 ; Grapheme_Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D4D ; Grapheme_Extend # Mn MALAYALAM SIGN VIRAMA
+0D57 ; Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK
+0D62..0D63 ; Grapheme_Extend # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0DCA ; Grapheme_Extend # Mn SINHALA SIGN AL-LAKUNA
+0DCF ; Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA
+0DD2..0DD4 ; Grapheme_Extend # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; Grapheme_Extend # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DDF ; Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA
+0E31 ; Grapheme_Extend # Mn THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A ; Grapheme_Extend # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E47..0E4E ; Grapheme_Extend # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0EB1 ; Grapheme_Extend # Mn LAO VOWEL SIGN MAI KAN
+0EB4..0EB9 ; Grapheme_Extend # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; Grapheme_Extend # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EC8..0ECD ; Grapheme_Extend # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
+0F18..0F19 ; Grapheme_Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35 ; Grapheme_Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37 ; Grapheme_Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39 ; Grapheme_Extend # Mn TIBETAN MARK TSA -PHRU
+0F71..0F7E ; Grapheme_Extend # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F80..0F84 ; Grapheme_Extend # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87 ; Grapheme_Extend # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F90..0F97 ; Grapheme_Extend # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; Grapheme_Extend # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6 ; Grapheme_Extend # Mn TIBETAN SYMBOL PADMA GDAN
+102D..1030 ; Grapheme_Extend # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1032..1037 ; Grapheme_Extend # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1039..103A ; Grapheme_Extend # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103D..103E ; Grapheme_Extend # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+1058..1059 ; Grapheme_Extend # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105E..1060 ; Grapheme_Extend # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1071..1074 ; Grapheme_Extend # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1082 ; Grapheme_Extend # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1085..1086 ; Grapheme_Extend # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+108D ; Grapheme_Extend # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+109D ; Grapheme_Extend # Mn MYANMAR VOWEL SIGN AITON AI
+135F ; Grapheme_Extend # Mn ETHIOPIC COMBINING GEMINATION MARK
+1712..1714 ; Grapheme_Extend # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1732..1734 ; Grapheme_Extend # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1752..1753 ; Grapheme_Extend # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773 ; Grapheme_Extend # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B7..17BD ; Grapheme_Extend # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17C6 ; Grapheme_Extend # Mn KHMER SIGN NIKAHIT
+17C9..17D3 ; Grapheme_Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD ; Grapheme_Extend # Mn KHMER SIGN ATTHACAN
+180B..180D ; Grapheme_Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+18A9 ; Grapheme_Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922 ; Grapheme_Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1927..1928 ; Grapheme_Extend # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1932 ; Grapheme_Extend # Mn LIMBU SMALL LETTER ANUSVARA
+1939..193B ; Grapheme_Extend # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1A17..1A18 ; Grapheme_Extend # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A56 ; Grapheme_Extend # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A58..1A5E ; Grapheme_Extend # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60 ; Grapheme_Extend # Mn TAI THAM SIGN SAKOT
+1A62 ; Grapheme_Extend # Mn TAI THAM VOWEL SIGN MAI SAT
+1A65..1A6C ; Grapheme_Extend # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A73..1A7C ; Grapheme_Extend # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; Grapheme_Extend # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1B00..1B03 ; Grapheme_Extend # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B34 ; Grapheme_Extend # Mn BALINESE SIGN REREKAN
+1B36..1B3A ; Grapheme_Extend # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3C ; Grapheme_Extend # Mn BALINESE VOWEL SIGN LA LENGA
+1B42 ; Grapheme_Extend # Mn BALINESE VOWEL SIGN PEPET
+1B6B..1B73 ; Grapheme_Extend # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B80..1B81 ; Grapheme_Extend # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1BA2..1BA5 ; Grapheme_Extend # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA8..1BA9 ; Grapheme_Extend # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1C2C..1C33 ; Grapheme_Extend # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C36..1C37 ; Grapheme_Extend # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1CD0..1CD2 ; Grapheme_Extend # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD4..1CE0 ; Grapheme_Extend # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE2..1CE8 ; Grapheme_Extend # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CED ; Grapheme_Extend # Mn VEDIC SIGN TIRYAK
+1DC0..1DE6 ; Grapheme_Extend # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DFD..1DFF ; Grapheme_Extend # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+200C..200D ; Grapheme_Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+20D0..20DC ; Grapheme_Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0 ; Grapheme_Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; Grapheme_Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4 ; Grapheme_Extend # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0 ; Grapheme_Extend # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+2CEF..2CF1 ; Grapheme_Extend # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2DE0..2DFF ; Grapheme_Extend # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+302A..302F ; Grapheme_Extend # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A ; Grapheme_Extend # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+A66F ; Grapheme_Extend # Mn COMBINING CYRILLIC VZMET
+A670..A672 ; Grapheme_Extend # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A67C..A67D ; Grapheme_Extend # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A6F0..A6F1 ; Grapheme_Extend # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A802 ; Grapheme_Extend # Mn SYLOTI NAGRI SIGN DVISVARA
+A806 ; Grapheme_Extend # Mn SYLOTI NAGRI SIGN HASANTA
+A80B ; Grapheme_Extend # Mn SYLOTI NAGRI SIGN ANUSVARA
+A825..A826 ; Grapheme_Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A8C4 ; Grapheme_Extend # Mn SAURASHTRA SIGN VIRAMA
+A8E0..A8F1 ; Grapheme_Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A926..A92D ; Grapheme_Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A947..A951 ; Grapheme_Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A980..A982 ; Grapheme_Extend # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A9B3 ; Grapheme_Extend # Mn JAVANESE SIGN CECAK TELU
+A9B6..A9B9 ; Grapheme_Extend # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BC ; Grapheme_Extend # Mn JAVANESE VOWEL SIGN PEPET
+AA29..AA2E ; Grapheme_Extend # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA31..AA32 ; Grapheme_Extend # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA35..AA36 ; Grapheme_Extend # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA43 ; Grapheme_Extend # Mn CHAM CONSONANT SIGN FINAL NG
+AA4C ; Grapheme_Extend # Mn CHAM CONSONANT SIGN FINAL M
+AAB0 ; Grapheme_Extend # Mn TAI VIET MAI KANG
+AAB2..AAB4 ; Grapheme_Extend # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB7..AAB8 ; Grapheme_Extend # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AABE..AABF ; Grapheme_Extend # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC1 ; Grapheme_Extend # Mn TAI VIET TONE MAI THO
+ABE5 ; Grapheme_Extend # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE8 ; Grapheme_Extend # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABED ; Grapheme_Extend # Mn MEETEI MAYEK APUN IYEK
+FB1E ; Grapheme_Extend # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FE00..FE0F ; Grapheme_Extend # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE26 ; Grapheme_Extend # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+FF9E..FF9F ; Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+101FD ; Grapheme_Extend # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10A01..10A03 ; Grapheme_Extend # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; Grapheme_Extend # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; Grapheme_Extend # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A38..10A3A ; Grapheme_Extend # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; Grapheme_Extend # Mn KHAROSHTHI VIRAMA
+11080..11081 ; Grapheme_Extend # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
+110B3..110B6 ; Grapheme_Extend # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B9..110BA ; Grapheme_Extend # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+1D165 ; Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM
+1D167..1D169 ; Grapheme_Extend # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16E..1D172 ; Grapheme_Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5
+1D17B..1D182 ; Grapheme_Extend # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; Grapheme_Extend # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; Grapheme_Extend # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D242..1D244 ; Grapheme_Extend # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+E0100..E01EF ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 1198
+
+# ================================================
+
+# Derived Property: Grapheme_Base
+# Generated from: [0..10FFFF] - Cc - Cf - Cs - Co - Cn - Zl - Zp - Grapheme_Extend
+# Note: depending on an application's interpretation of Co (private use),
+# they may be either in Grapheme_Base, or in Grapheme_Extend, or in neither.
+
+0020 ; Grapheme_Base # Zs SPACE
+0021..0023 ; Grapheme_Base # Po [3] EXCLAMATION MARK..NUMBER SIGN
+0024 ; Grapheme_Base # Sc DOLLAR SIGN
+0025..0027 ; Grapheme_Base # Po [3] PERCENT SIGN..APOSTROPHE
+0028 ; Grapheme_Base # Ps LEFT PARENTHESIS
+0029 ; Grapheme_Base # Pe RIGHT PARENTHESIS
+002A ; Grapheme_Base # Po ASTERISK
+002B ; Grapheme_Base # Sm PLUS SIGN
+002C ; Grapheme_Base # Po COMMA
+002D ; Grapheme_Base # Pd HYPHEN-MINUS
+002E..002F ; Grapheme_Base # Po [2] FULL STOP..SOLIDUS
+0030..0039 ; Grapheme_Base # Nd [10] DIGIT ZERO..DIGIT NINE
+003A..003B ; Grapheme_Base # Po [2] COLON..SEMICOLON
+003C..003E ; Grapheme_Base # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040 ; Grapheme_Base # Po [2] QUESTION MARK..COMMERCIAL AT
+0041..005A ; Grapheme_Base # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+005B ; Grapheme_Base # Ps LEFT SQUARE BRACKET
+005C ; Grapheme_Base # Po REVERSE SOLIDUS
+005D ; Grapheme_Base # Pe RIGHT SQUARE BRACKET
+005E ; Grapheme_Base # Sk CIRCUMFLEX ACCENT
+005F ; Grapheme_Base # Pc LOW LINE
+0060 ; Grapheme_Base # Sk GRAVE ACCENT
+0061..007A ; Grapheme_Base # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+007B ; Grapheme_Base # Ps LEFT CURLY BRACKET
+007C ; Grapheme_Base # Sm VERTICAL LINE
+007D ; Grapheme_Base # Pe RIGHT CURLY BRACKET
+007E ; Grapheme_Base # Sm TILDE
+00A0 ; Grapheme_Base # Zs NO-BREAK SPACE
+00A1 ; Grapheme_Base # Po INVERTED EXCLAMATION MARK
+00A2..00A5 ; Grapheme_Base # Sc [4] CENT SIGN..YEN SIGN
+00A6..00A7 ; Grapheme_Base # So [2] BROKEN BAR..SECTION SIGN
+00A8 ; Grapheme_Base # Sk DIAERESIS
+00A9 ; Grapheme_Base # So COPYRIGHT SIGN
+00AA ; Grapheme_Base # L& FEMININE ORDINAL INDICATOR
+00AB ; Grapheme_Base # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; Grapheme_Base # Sm NOT SIGN
+00AE ; Grapheme_Base # So REGISTERED SIGN
+00AF ; Grapheme_Base # Sk MACRON
+00B0 ; Grapheme_Base # So DEGREE SIGN
+00B1 ; Grapheme_Base # Sm PLUS-MINUS SIGN
+00B2..00B3 ; Grapheme_Base # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
+00B4 ; Grapheme_Base # Sk ACUTE ACCENT
+00B5 ; Grapheme_Base # L& MICRO SIGN
+00B6 ; Grapheme_Base # So PILCROW SIGN
+00B7 ; Grapheme_Base # Po MIDDLE DOT
+00B8 ; Grapheme_Base # Sk CEDILLA
+00B9 ; Grapheme_Base # No SUPERSCRIPT ONE
+00BA ; Grapheme_Base # L& MASCULINE ORDINAL INDICATOR
+00BB ; Grapheme_Base # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC..00BE ; Grapheme_Base # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
+00BF ; Grapheme_Base # Po INVERTED QUESTION MARK
+00C0..00D6 ; Grapheme_Base # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7 ; Grapheme_Base # Sm MULTIPLICATION SIGN
+00D8..00F6 ; Grapheme_Base # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F7 ; Grapheme_Base # Sm DIVISION SIGN
+00F8..01BA ; Grapheme_Base # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; Grapheme_Base # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; Grapheme_Base # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; Grapheme_Base # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293 ; Grapheme_Base # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294 ; Grapheme_Base # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; Grapheme_Base # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02C1 ; Grapheme_Base # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5 ; Grapheme_Base # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1 ; Grapheme_Base # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF ; Grapheme_Base # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E0..02E4 ; Grapheme_Base # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5..02EB ; Grapheme_Base # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; Grapheme_Base # Lm MODIFIER LETTER VOICING
+02ED ; Grapheme_Base # Sk MODIFIER LETTER UNASPIRATED
+02EE ; Grapheme_Base # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF ; Grapheme_Base # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0370..0373 ; Grapheme_Base # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0374 ; Grapheme_Base # Lm GREEK NUMERAL SIGN
+0375 ; Grapheme_Base # Sk GREEK LOWER NUMERAL SIGN
+0376..0377 ; Grapheme_Base # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; Grapheme_Base # Lm GREEK YPOGEGRAMMENI
+037B..037D ; Grapheme_Base # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+037E ; Grapheme_Base # Po GREEK QUESTION MARK
+0384..0385 ; Grapheme_Base # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS
+0386 ; Grapheme_Base # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387 ; Grapheme_Base # Po GREEK ANO TELEIA
+0388..038A ; Grapheme_Base # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Grapheme_Base # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; Grapheme_Base # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03F5 ; Grapheme_Base # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
+03F6 ; Grapheme_Base # Sm GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7..0481 ; Grapheme_Base # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
+0482 ; Grapheme_Base # So CYRILLIC THOUSANDS SIGN
+048A..0525 ; Grapheme_Base # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+0531..0556 ; Grapheme_Base # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; Grapheme_Base # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A..055F ; Grapheme_Base # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+0561..0587 ; Grapheme_Base # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+0589 ; Grapheme_Base # Po ARMENIAN FULL STOP
+058A ; Grapheme_Base # Pd ARMENIAN HYPHEN
+05BE ; Grapheme_Base # Pd HEBREW PUNCTUATION MAQAF
+05C0 ; Grapheme_Base # Po HEBREW PUNCTUATION PASEQ
+05C3 ; Grapheme_Base # Po HEBREW PUNCTUATION SOF PASUQ
+05C6 ; Grapheme_Base # Po HEBREW PUNCTUATION NUN HAFUKHA
+05D0..05EA ; Grapheme_Base # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; Grapheme_Base # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3..05F4 ; Grapheme_Base # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
+0606..0608 ; Grapheme_Base # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY
+0609..060A ; Grapheme_Base # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN
+060B ; Grapheme_Base # Sc AFGHANI SIGN
+060C..060D ; Grapheme_Base # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR
+060E..060F ; Grapheme_Base # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA
+061B ; Grapheme_Base # Po ARABIC SEMICOLON
+061E..061F ; Grapheme_Base # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
+0621..063F ; Grapheme_Base # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640 ; Grapheme_Base # Lm ARABIC TATWEEL
+0641..064A ; Grapheme_Base # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+0660..0669 ; Grapheme_Base # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+066A..066D ; Grapheme_Base # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR
+066E..066F ; Grapheme_Base # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0671..06D3 ; Grapheme_Base # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4 ; Grapheme_Base # Po ARABIC FULL STOP
+06D5 ; Grapheme_Base # Lo ARABIC LETTER AE
+06E5..06E6 ; Grapheme_Base # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E9 ; Grapheme_Base # So ARABIC PLACE OF SAJDAH
+06EE..06EF ; Grapheme_Base # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06F0..06F9 ; Grapheme_Base # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA..06FC ; Grapheme_Base # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FD..06FE ; Grapheme_Base # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF ; Grapheme_Base # Lo ARABIC LETTER HEH WITH INVERTED V
+0700..070D ; Grapheme_Base # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+0710 ; Grapheme_Base # Lo SYRIAC LETTER ALAPH
+0712..072F ; Grapheme_Base # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+074D..07A5 ; Grapheme_Base # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU
+07B1 ; Grapheme_Base # Lo THAANA LETTER NAA
+07C0..07C9 ; Grapheme_Base # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE
+07CA..07EA ; Grapheme_Base # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07F4..07F5 ; Grapheme_Base # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07F6 ; Grapheme_Base # So NKO SYMBOL OO DENNEN
+07F7..07F9 ; Grapheme_Base # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
+07FA ; Grapheme_Base # Lm NKO LAJANYALAN
+0800..0815 ; Grapheme_Base # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
+081A ; Grapheme_Base # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+0824 ; Grapheme_Base # Lm SAMARITAN MODIFIER LETTER SHORT A
+0828 ; Grapheme_Base # Lm SAMARITAN MODIFIER LETTER I
+0830..083E ; Grapheme_Base # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU
+0903 ; Grapheme_Base # Mc DEVANAGARI SIGN VISARGA
+0904..0939 ; Grapheme_Base # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093D ; Grapheme_Base # Lo DEVANAGARI SIGN AVAGRAHA
+093E..0940 ; Grapheme_Base # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0949..094C ; Grapheme_Base # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094E ; Grapheme_Base # Mc DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+0950 ; Grapheme_Base # Lo DEVANAGARI OM
+0958..0961 ; Grapheme_Base # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0964..0965 ; Grapheme_Base # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0966..096F ; Grapheme_Base # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0970 ; Grapheme_Base # Po DEVANAGARI ABBREVIATION SIGN
+0971 ; Grapheme_Base # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972 ; Grapheme_Base # Lo DEVANAGARI LETTER CANDRA A
+0979..097F ; Grapheme_Base # Lo [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+0982..0983 ; Grapheme_Base # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C ; Grapheme_Base # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; Grapheme_Base # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; Grapheme_Base # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; Grapheme_Base # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; Grapheme_Base # Lo BENGALI LETTER LA
+09B6..09B9 ; Grapheme_Base # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BD ; Grapheme_Base # Lo BENGALI SIGN AVAGRAHA
+09BF..09C0 ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II
+09C7..09C8 ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CE ; Grapheme_Base # Lo BENGALI LETTER KHANDA TA
+09DC..09DD ; Grapheme_Base # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; Grapheme_Base # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E6..09EF ; Grapheme_Base # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1 ; Grapheme_Base # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2..09F3 ; Grapheme_Base # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN
+09F4..09F9 ; Grapheme_Base # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA ; Grapheme_Base # So BENGALI ISSHAR
+09FB ; Grapheme_Base # Sc BENGALI GANDA MARK
+0A03 ; Grapheme_Base # Mc GURMUKHI SIGN VISARGA
+0A05..0A0A ; Grapheme_Base # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; Grapheme_Base # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; Grapheme_Base # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; Grapheme_Base # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; Grapheme_Base # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; Grapheme_Base # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; Grapheme_Base # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3E..0A40 ; Grapheme_Base # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A59..0A5C ; Grapheme_Base # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; Grapheme_Base # Lo GURMUKHI LETTER FA
+0A66..0A6F ; Grapheme_Base # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A72..0A74 ; Grapheme_Base # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A83 ; Grapheme_Base # Mc GUJARATI SIGN VISARGA
+0A85..0A8D ; Grapheme_Base # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; Grapheme_Base # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; Grapheme_Base # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; Grapheme_Base # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; Grapheme_Base # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; Grapheme_Base # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABD ; Grapheme_Base # Lo GUJARATI SIGN AVAGRAHA
+0ABE..0AC0 ; Grapheme_Base # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC9 ; Grapheme_Base # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; Grapheme_Base # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0AD0 ; Grapheme_Base # Lo GUJARATI OM
+0AE0..0AE1 ; Grapheme_Base # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE6..0AEF ; Grapheme_Base # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0AF1 ; Grapheme_Base # Sc GUJARATI RUPEE SIGN
+0B02..0B03 ; Grapheme_Base # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C ; Grapheme_Base # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; Grapheme_Base # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; Grapheme_Base # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; Grapheme_Base # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; Grapheme_Base # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; Grapheme_Base # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3D ; Grapheme_Base # Lo ORIYA SIGN AVAGRAHA
+0B40 ; Grapheme_Base # Mc ORIYA VOWEL SIGN II
+0B47..0B48 ; Grapheme_Base # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; Grapheme_Base # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B5C..0B5D ; Grapheme_Base # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; Grapheme_Base # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B66..0B6F ; Grapheme_Base # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B70 ; Grapheme_Base # So ORIYA ISSHAR
+0B71 ; Grapheme_Base # Lo ORIYA LETTER WA
+0B83 ; Grapheme_Base # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; Grapheme_Base # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; Grapheme_Base # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; Grapheme_Base # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; Grapheme_Base # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; Grapheme_Base # Lo TAMIL LETTER JA
+0B9E..0B9F ; Grapheme_Base # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; Grapheme_Base # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; Grapheme_Base # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; Grapheme_Base # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBF ; Grapheme_Base # Mc TAMIL VOWEL SIGN I
+0BC1..0BC2 ; Grapheme_Base # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; Grapheme_Base # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; Grapheme_Base # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BD0 ; Grapheme_Base # Lo TAMIL OM
+0BE6..0BEF ; Grapheme_Base # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0BF0..0BF2 ; Grapheme_Base # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
+0BF3..0BF8 ; Grapheme_Base # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN
+0BF9 ; Grapheme_Base # Sc TAMIL RUPEE SIGN
+0BFA ; Grapheme_Base # So TAMIL NUMBER SIGN
+0C01..0C03 ; Grapheme_Base # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C ; Grapheme_Base # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; Grapheme_Base # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; Grapheme_Base # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33 ; Grapheme_Base # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39 ; Grapheme_Base # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D ; Grapheme_Base # Lo TELUGU SIGN AVAGRAHA
+0C41..0C44 ; Grapheme_Base # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C58..0C59 ; Grapheme_Base # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61 ; Grapheme_Base # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C66..0C6F ; Grapheme_Base # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C78..0C7E ; Grapheme_Base # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F ; Grapheme_Base # So TELUGU SIGN TUUMU
+0C82..0C83 ; Grapheme_Base # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C ; Grapheme_Base # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; Grapheme_Base # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; Grapheme_Base # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; Grapheme_Base # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; Grapheme_Base # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBD ; Grapheme_Base # Lo KANNADA SIGN AVAGRAHA
+0CBE ; Grapheme_Base # Mc KANNADA VOWEL SIGN AA
+0CC0..0CC1 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U
+0CC3..0CC4 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR
+0CC7..0CC8 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CDE ; Grapheme_Base # Lo KANNADA LETTER FA
+0CE0..0CE1 ; Grapheme_Base # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE6..0CEF ; Grapheme_Base # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+0CF1..0CF2 ; Grapheme_Base # So [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0D02..0D03 ; Grapheme_Base # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C ; Grapheme_Base # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; Grapheme_Base # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28 ; Grapheme_Base # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39 ; Grapheme_Base # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D ; Grapheme_Base # Lo MALAYALAM SIGN AVAGRAHA
+0D3F..0D40 ; Grapheme_Base # Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II
+0D46..0D48 ; Grapheme_Base # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; Grapheme_Base # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D60..0D61 ; Grapheme_Base # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D66..0D6F ; Grapheme_Base # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D70..0D75 ; Grapheme_Base # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS
+0D79 ; Grapheme_Base # So MALAYALAM DATE MARK
+0D7A..0D7F ; Grapheme_Base # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D82..0D83 ; Grapheme_Base # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96 ; Grapheme_Base # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; Grapheme_Base # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; Grapheme_Base # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; Grapheme_Base # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; Grapheme_Base # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DD0..0DD1 ; Grapheme_Base # Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD8..0DDE ; Grapheme_Base # Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DF2..0DF3 ; Grapheme_Base # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4 ; Grapheme_Base # Po SINHALA PUNCTUATION KUNDDALIYA
+0E01..0E30 ; Grapheme_Base # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E32..0E33 ; Grapheme_Base # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E3F ; Grapheme_Base # Sc THAI CURRENCY SYMBOL BAHT
+0E40..0E45 ; Grapheme_Base # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; Grapheme_Base # Lm THAI CHARACTER MAIYAMOK
+0E4F ; Grapheme_Base # Po THAI CHARACTER FONGMAN
+0E50..0E59 ; Grapheme_Base # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E5A..0E5B ; Grapheme_Base # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+0E81..0E82 ; Grapheme_Base # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; Grapheme_Base # Lo LAO LETTER KHO TAM
+0E87..0E88 ; Grapheme_Base # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; Grapheme_Base # Lo LAO LETTER SO TAM
+0E8D ; Grapheme_Base # Lo LAO LETTER NYO
+0E94..0E97 ; Grapheme_Base # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; Grapheme_Base # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; Grapheme_Base # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; Grapheme_Base # Lo LAO LETTER LO LOOT
+0EA7 ; Grapheme_Base # Lo LAO LETTER WO
+0EAA..0EAB ; Grapheme_Base # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; Grapheme_Base # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB2..0EB3 ; Grapheme_Base # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EBD ; Grapheme_Base # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; Grapheme_Base # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; Grapheme_Base # Lm LAO KO LA
+0ED0..0ED9 ; Grapheme_Base # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDD ; Grapheme_Base # Lo [2] LAO HO NO..LAO HO MO
+0F00 ; Grapheme_Base # Lo TIBETAN SYLLABLE OM
+0F01..0F03 ; Grapheme_Base # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04..0F12 ; Grapheme_Base # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD
+0F13..0F17 ; Grapheme_Base # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F1A..0F1F ; Grapheme_Base # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20..0F29 ; Grapheme_Base # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F2A..0F33 ; Grapheme_Base # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO
+0F34 ; Grapheme_Base # So TIBETAN MARK BSDUS RTAGS
+0F36 ; Grapheme_Base # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F38 ; Grapheme_Base # So TIBETAN MARK CHE MGO
+0F3A ; Grapheme_Base # Ps TIBETAN MARK GUG RTAGS GYON
+0F3B ; Grapheme_Base # Pe TIBETAN MARK GUG RTAGS GYAS
+0F3C ; Grapheme_Base # Ps TIBETAN MARK ANG KHANG GYON
+0F3D ; Grapheme_Base # Pe TIBETAN MARK ANG KHANG GYAS
+0F3E..0F3F ; Grapheme_Base # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47 ; Grapheme_Base # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; Grapheme_Base # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F7F ; Grapheme_Base # Mc TIBETAN SIGN RNAM BCAD
+0F85 ; Grapheme_Base # Po TIBETAN MARK PALUTA
+0F88..0F8B ; Grapheme_Base # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0FBE..0FC5 ; Grapheme_Base # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+0FC7..0FCC ; Grapheme_Base # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE..0FCF ; Grapheme_Base # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM
+0FD0..0FD4 ; Grapheme_Base # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+0FD5..0FD8 ; Grapheme_Base # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS
+1000..102A ; Grapheme_Base # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+102B..102C ; Grapheme_Base # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+1031 ; Grapheme_Base # Mc MYANMAR VOWEL SIGN E
+1038 ; Grapheme_Base # Mc MYANMAR SIGN VISARGA
+103B..103C ; Grapheme_Base # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103F ; Grapheme_Base # Lo MYANMAR LETTER GREAT SA
+1040..1049 ; Grapheme_Base # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+104A..104F ; Grapheme_Base # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+1050..1055 ; Grapheme_Base # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057 ; Grapheme_Base # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+105A..105D ; Grapheme_Base # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+1061 ; Grapheme_Base # Lo MYANMAR LETTER SGAW KAREN SHA
+1062..1064 ; Grapheme_Base # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO
+1065..1066 ; Grapheme_Base # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+1067..106D ; Grapheme_Base # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E..1070 ; Grapheme_Base # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1075..1081 ; Grapheme_Base # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+1083..1084 ; Grapheme_Base # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1087..108C ; Grapheme_Base # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108E ; Grapheme_Base # Lo MYANMAR LETTER RUMAI PALAUNG FA
+108F ; Grapheme_Base # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090..1099 ; Grapheme_Base # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE
+109A..109C ; Grapheme_Base # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A
+109E..109F ; Grapheme_Base # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION
+10A0..10C5 ; Grapheme_Base # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA ; Grapheme_Base # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FB ; Grapheme_Base # Po GEORGIAN PARAGRAPH SEPARATOR
+10FC ; Grapheme_Base # Lm MODIFIER LETTER GEORGIAN NAR
+1100..1248 ; Grapheme_Base # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA
+124A..124D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; Grapheme_Base # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; Grapheme_Base # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; Grapheme_Base # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; Grapheme_Base # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; Grapheme_Base # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+1360 ; Grapheme_Base # So ETHIOPIC SECTION MARK
+1361..1368 ; Grapheme_Base # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+1369..137C ; Grapheme_Base # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND
+1380..138F ; Grapheme_Base # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+1390..1399 ; Grapheme_Base # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
+13A0..13F4 ; Grapheme_Base # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+1400 ; Grapheme_Base # Pd CANADIAN SYLLABICS HYPHEN
+1401..166C ; Grapheme_Base # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166D..166E ; Grapheme_Base # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+166F..167F ; Grapheme_Base # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+1680 ; Grapheme_Base # Zs OGHAM SPACE MARK
+1681..169A ; Grapheme_Base # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+169B ; Grapheme_Base # Ps OGHAM FEATHER MARK
+169C ; Grapheme_Base # Pe OGHAM REVERSED FEATHER MARK
+16A0..16EA ; Grapheme_Base # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EB..16ED ; Grapheme_Base # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+16EE..16F0 ; Grapheme_Base # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+1700..170C ; Grapheme_Base # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; Grapheme_Base # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1720..1731 ; Grapheme_Base # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1735..1736 ; Grapheme_Base # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+1740..1751 ; Grapheme_Base # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1760..176C ; Grapheme_Base # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; Grapheme_Base # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1780..17B3 ; Grapheme_Base # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B6 ; Grapheme_Base # Mc KHMER VOWEL SIGN AA
+17BE..17C5 ; Grapheme_Base # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C7..17C8 ; Grapheme_Base # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17D4..17D6 ; Grapheme_Base # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17D7 ; Grapheme_Base # Lm KHMER SIGN LEK TOO
+17D8..17DA ; Grapheme_Base # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT
+17DB ; Grapheme_Base # Sc KHMER CURRENCY SYMBOL RIEL
+17DC ; Grapheme_Base # Lo KHMER SIGN AVAKRAHASANYA
+17E0..17E9 ; Grapheme_Base # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+17F0..17F9 ; Grapheme_Base # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800..1805 ; Grapheme_Base # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS
+1806 ; Grapheme_Base # Pd MONGOLIAN TODO SOFT HYPHEN
+1807..180A ; Grapheme_Base # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
+180E ; Grapheme_Base # Zs MONGOLIAN VOWEL SEPARATOR
+1810..1819 ; Grapheme_Base # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842 ; Grapheme_Base # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; Grapheme_Base # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; Grapheme_Base # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8 ; Grapheme_Base # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18AA ; Grapheme_Base # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+18B0..18F5 ; Grapheme_Base # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+1900..191C ; Grapheme_Base # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1923..1926 ; Grapheme_Base # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1929..192B ; Grapheme_Base # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; Grapheme_Base # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1933..1938 ; Grapheme_Base # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1940 ; Grapheme_Base # So LIMBU SIGN LOO
+1944..1945 ; Grapheme_Base # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1946..194F ; Grapheme_Base # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+1950..196D ; Grapheme_Base # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; Grapheme_Base # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1980..19AB ; Grapheme_Base # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19B0..19C0 ; Grapheme_Base # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C1..19C7 ; Grapheme_Base # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+19C8..19C9 ; Grapheme_Base # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+19D0..19DA ; Grapheme_Base # Nd [11] NEW TAI LUE DIGIT ZERO..NEW TAI LUE THAM DIGIT ONE
+19DE..19DF ; Grapheme_Base # Po [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV
+19E0..19FF ; Grapheme_Base # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
+1A00..1A16 ; Grapheme_Base # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A19..1A1B ; Grapheme_Base # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A1E..1A1F ; Grapheme_Base # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION
+1A20..1A54 ; Grapheme_Base # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
+1A55 ; Grapheme_Base # Mc TAI THAM CONSONANT SIGN MEDIAL RA
+1A57 ; Grapheme_Base # Mc TAI THAM CONSONANT SIGN LA TANG LAI
+1A61 ; Grapheme_Base # Mc TAI THAM VOWEL SIGN A
+1A63..1A64 ; Grapheme_Base # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA
+1A6D..1A72 ; Grapheme_Base # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1A80..1A89 ; Grapheme_Base # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE
+1A90..1A99 ; Grapheme_Base # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE
+1AA0..1AA6 ; Grapheme_Base # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA
+1AA7 ; Grapheme_Base # Lm TAI THAM SIGN MAI YAMOK
+1AA8..1AAD ; Grapheme_Base # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG
+1B04 ; Grapheme_Base # Mc BALINESE SIGN BISAH
+1B05..1B33 ; Grapheme_Base # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B35 ; Grapheme_Base # Mc BALINESE VOWEL SIGN TEDUNG
+1B3B ; Grapheme_Base # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3D..1B41 ; Grapheme_Base # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B43..1B44 ; Grapheme_Base # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B45..1B4B ; Grapheme_Base # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B50..1B59 ; Grapheme_Base # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+1B5A..1B60 ; Grapheme_Base # Po [7] BALINESE PANTI..BALINESE PAMENENG
+1B61..1B6A ; Grapheme_Base # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE
+1B74..1B7C ; Grapheme_Base # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1B82 ; Grapheme_Base # Mc SUNDANESE SIGN PANGWISAD
+1B83..1BA0 ; Grapheme_Base # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BA1 ; Grapheme_Base # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA6..1BA7 ; Grapheme_Base # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BAA ; Grapheme_Base # Mc SUNDANESE SIGN PAMAAEH
+1BAE..1BAF ; Grapheme_Base # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1BB0..1BB9 ; Grapheme_Base # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE
+1C00..1C23 ; Grapheme_Base # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C24..1C2B ; Grapheme_Base # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C34..1C35 ; Grapheme_Base # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1C3B..1C3F ; Grapheme_Base # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+1C40..1C49 ; Grapheme_Base # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+1C4D..1C4F ; Grapheme_Base # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+1C50..1C59 ; Grapheme_Base # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE
+1C5A..1C77 ; Grapheme_Base # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; Grapheme_Base # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1C7E..1C7F ; Grapheme_Base # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+1CD3 ; Grapheme_Base # Po VEDIC SIGN NIHSHVASA
+1CE1 ; Grapheme_Base # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CE9..1CEC ; Grapheme_Base # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL
+1CEE..1CF1 ; Grapheme_Base # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA
+1CF2 ; Grapheme_Base # Mc VEDIC SIGN ARDHAVISARGA
+1D00..1D2B ; Grapheme_Base # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61 ; Grapheme_Base # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D77 ; Grapheme_Base # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
+1D78 ; Grapheme_Base # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D9A ; Grapheme_Base # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; Grapheme_Base # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1E00..1F15 ; Grapheme_Base # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; Grapheme_Base # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; Grapheme_Base # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; Grapheme_Base # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Grapheme_Base # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; Grapheme_Base # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; Grapheme_Base # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; Grapheme_Base # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD ; Grapheme_Base # Sk GREEK KORONIS
+1FBE ; Grapheme_Base # L& GREEK PROSGEGRAMMENI
+1FBF..1FC1 ; Grapheme_Base # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FC2..1FC4 ; Grapheme_Base # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; Grapheme_Base # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD..1FCF ; Grapheme_Base # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FD0..1FD3 ; Grapheme_Base # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; Grapheme_Base # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD..1FDF ; Grapheme_Base # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FE0..1FEC ; Grapheme_Base # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FED..1FEF ; Grapheme_Base # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FF2..1FF4 ; Grapheme_Base # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; Grapheme_Base # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD..1FFE ; Grapheme_Base # Sk [2] GREEK OXIA..GREEK DASIA
+2000..200A ; Grapheme_Base # Zs [11] EN QUAD..HAIR SPACE
+2010..2015 ; Grapheme_Base # Pd [6] HYPHEN..HORIZONTAL BAR
+2016..2017 ; Grapheme_Base # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018 ; Grapheme_Base # Pi LEFT SINGLE QUOTATION MARK
+2019 ; Grapheme_Base # Pf RIGHT SINGLE QUOTATION MARK
+201A ; Grapheme_Base # Ps SINGLE LOW-9 QUOTATION MARK
+201B..201C ; Grapheme_Base # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D ; Grapheme_Base # Pf RIGHT DOUBLE QUOTATION MARK
+201E ; Grapheme_Base # Ps DOUBLE LOW-9 QUOTATION MARK
+201F ; Grapheme_Base # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027 ; Grapheme_Base # Po [8] DAGGER..HYPHENATION POINT
+202F ; Grapheme_Base # Zs NARROW NO-BREAK SPACE
+2030..2038 ; Grapheme_Base # Po [9] PER MILLE SIGN..CARET
+2039 ; Grapheme_Base # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; Grapheme_Base # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E ; Grapheme_Base # Po [4] REFERENCE MARK..OVERLINE
+203F..2040 ; Grapheme_Base # Pc [2] UNDERTIE..CHARACTER TIE
+2041..2043 ; Grapheme_Base # Po [3] CARET INSERTION POINT..HYPHEN BULLET
+2044 ; Grapheme_Base # Sm FRACTION SLASH
+2045 ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH QUILL
+2046 ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH QUILL
+2047..2051 ; Grapheme_Base # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; Grapheme_Base # Sm COMMERCIAL MINUS SIGN
+2053 ; Grapheme_Base # Po SWUNG DASH
+2054 ; Grapheme_Base # Pc INVERTED UNDERTIE
+2055..205E ; Grapheme_Base # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+205F ; Grapheme_Base # Zs MEDIUM MATHEMATICAL SPACE
+2070 ; Grapheme_Base # No SUPERSCRIPT ZERO
+2071 ; Grapheme_Base # Lm SUPERSCRIPT LATIN SMALL LETTER I
+2074..2079 ; Grapheme_Base # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
+207A..207C ; Grapheme_Base # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN
+207D ; Grapheme_Base # Ps SUPERSCRIPT LEFT PARENTHESIS
+207E ; Grapheme_Base # Pe SUPERSCRIPT RIGHT PARENTHESIS
+207F ; Grapheme_Base # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2080..2089 ; Grapheme_Base # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
+208A..208C ; Grapheme_Base # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN
+208D ; Grapheme_Base # Ps SUBSCRIPT LEFT PARENTHESIS
+208E ; Grapheme_Base # Pe SUBSCRIPT RIGHT PARENTHESIS
+2090..2094 ; Grapheme_Base # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+20A0..20B8 ; Grapheme_Base # Sc [25] EURO-CURRENCY SIGN..TENGE SIGN
+2100..2101 ; Grapheme_Base # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
+2102 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL C
+2103..2106 ; Grapheme_Base # So [4] DEGREE CELSIUS..CADA UNA
+2107 ; Grapheme_Base # L& EULER CONSTANT
+2108..2109 ; Grapheme_Base # So [2] SCRUPLE..DEGREE FAHRENHEIT
+210A..2113 ; Grapheme_Base # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2114 ; Grapheme_Base # So L B BAR SYMBOL
+2115 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL N
+2116..2118 ; Grapheme_Base # So [3] NUMERO SIGN..SCRIPT CAPITAL P
+2119..211D ; Grapheme_Base # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+211E..2123 ; Grapheme_Base # So [6] PRESCRIPTION TAKE..VERSICLE
+2124 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL Z
+2125 ; Grapheme_Base # So OUNCE SIGN
+2126 ; Grapheme_Base # L& OHM SIGN
+2127 ; Grapheme_Base # So INVERTED OHM SIGN
+2128 ; Grapheme_Base # L& BLACK-LETTER CAPITAL Z
+2129 ; Grapheme_Base # So TURNED GREEK SMALL LETTER IOTA
+212A..212D ; Grapheme_Base # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212E ; Grapheme_Base # So ESTIMATED SYMBOL
+212F..2134 ; Grapheme_Base # L& [6] SCRIPT SMALL E..SCRIPT SMALL O
+2135..2138 ; Grapheme_Base # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; Grapheme_Base # L& INFORMATION SOURCE
+213A..213B ; Grapheme_Base # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN
+213C..213F ; Grapheme_Base # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2140..2144 ; Grapheme_Base # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
+2145..2149 ; Grapheme_Base # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214A ; Grapheme_Base # So PROPERTY LINE
+214B ; Grapheme_Base # Sm TURNED AMPERSAND
+214C..214D ; Grapheme_Base # So [2] PER SIGN..AKTIESELSKAB
+214E ; Grapheme_Base # L& TURNED SMALL F
+214F ; Grapheme_Base # So SYMBOL FOR SAMARITAN SOURCE
+2150..215F ; Grapheme_Base # No [16] VULGAR FRACTION ONE SEVENTH..FRACTION NUMERATOR ONE
+2160..2182 ; Grapheme_Base # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; Grapheme_Base # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; Grapheme_Base # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2189 ; Grapheme_Base # No VULGAR FRACTION ZERO THIRDS
+2190..2194 ; Grapheme_Base # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199 ; Grapheme_Base # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B ; Grapheme_Base # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F ; Grapheme_Base # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0 ; Grapheme_Base # Sm RIGHTWARDS TWO HEADED ARROW
+21A1..21A2 ; Grapheme_Base # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3 ; Grapheme_Base # Sm RIGHTWARDS ARROW WITH TAIL
+21A4..21A5 ; Grapheme_Base # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6 ; Grapheme_Base # Sm RIGHTWARDS ARROW FROM BAR
+21A7..21AD ; Grapheme_Base # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE ; Grapheme_Base # Sm LEFT RIGHT ARROW WITH STROKE
+21AF..21CD ; Grapheme_Base # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF ; Grapheme_Base # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; Grapheme_Base # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2 ; Grapheme_Base # Sm RIGHTWARDS DOUBLE ARROW
+21D3 ; Grapheme_Base # So DOWNWARDS DOUBLE ARROW
+21D4 ; Grapheme_Base # Sm LEFT RIGHT DOUBLE ARROW
+21D5..21F3 ; Grapheme_Base # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..22FF ; Grapheme_Base # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2300..2307 ; Grapheme_Base # So [8] DIAMETER SIGN..WAVY LINE
+2308..230B ; Grapheme_Base # Sm [4] LEFT CEILING..RIGHT FLOOR
+230C..231F ; Grapheme_Base # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321 ; Grapheme_Base # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328 ; Grapheme_Base # So [7] FROWN..KEYBOARD
+2329 ; Grapheme_Base # Ps LEFT-POINTING ANGLE BRACKET
+232A ; Grapheme_Base # Pe RIGHT-POINTING ANGLE BRACKET
+232B..237B ; Grapheme_Base # So [81] ERASE TO THE LEFT..NOT CHECK MARK
+237C ; Grapheme_Base # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A ; Grapheme_Base # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3 ; Grapheme_Base # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4..23DB ; Grapheme_Base # So [40] TOP SQUARE BRACKET..FUSE
+23DC..23E1 ; Grapheme_Base # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
+23E2..23E8 ; Grapheme_Base # So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL
+2400..2426 ; Grapheme_Base # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2440..244A ; Grapheme_Base # So [11] OCR HOOK..OCR DOUBLE BACKSLASH
+2460..249B ; Grapheme_Base # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP
+249C..24E9 ; Grapheme_Base # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+24EA..24FF ; Grapheme_Base # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO
+2500..25B6 ; Grapheme_Base # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7 ; Grapheme_Base # Sm WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0 ; Grapheme_Base # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1 ; Grapheme_Base # Sm WHITE LEFT-POINTING TRIANGLE
+25C2..25F7 ; Grapheme_Base # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF ; Grapheme_Base # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..266E ; Grapheme_Base # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
+266F ; Grapheme_Base # Sm MUSIC SHARP SIGN
+2670..26CD ; Grapheme_Base # So [94] WEST SYRIAC CROSS..DISABLED CAR
+26CF..26E1 ; Grapheme_Base # So [19] PICK..RESTRICTED LEFT ENTRY-2
+26E3 ; Grapheme_Base # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
+26E8..26FF ; Grapheme_Base # So [24] BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+2701..2704 ; Grapheme_Base # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2706..2709 ; Grapheme_Base # So [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270C..2727 ; Grapheme_Base # So [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2729..274B ; Grapheme_Base # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D ; Grapheme_Base # So SHADOWED WHITE CIRCLE
+274F..2752 ; Grapheme_Base # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2756..275E ; Grapheme_Base # So [9] BLACK DIAMOND MINUS WHITE X..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761..2767 ; Grapheme_Base # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768 ; Grapheme_Base # Ps MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; Grapheme_Base # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; Grapheme_Base # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; Grapheme_Base # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; Grapheme_Base # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; Grapheme_Base # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; Grapheme_Base # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; Grapheme_Base # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; Grapheme_Base # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; Grapheme_Base # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; Grapheme_Base # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; Grapheme_Base # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; Grapheme_Base # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; Grapheme_Base # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776..2793 ; Grapheme_Base # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794 ; Grapheme_Base # So HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798..27AF ; Grapheme_Base # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1..27BE ; Grapheme_Base # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27C0..27C4 ; Grapheme_Base # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5 ; Grapheme_Base # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; Grapheme_Base # Pe RIGHT S-SHAPED BAG DELIMITER
+27C7..27CA ; Grapheme_Base # Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
+27CC ; Grapheme_Base # Sm LONG DIVISION
+27D0..27E5 ; Grapheme_Base # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; Grapheme_Base # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; Grapheme_Base # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; Grapheme_Base # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; Grapheme_Base # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; Grapheme_Base # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; Grapheme_Base # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; Grapheme_Base # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; Grapheme_Base # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; Grapheme_Base # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; Grapheme_Base # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0..27FF ; Grapheme_Base # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2800..28FF ; Grapheme_Base # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+2900..2982 ; Grapheme_Base # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983 ; Grapheme_Base # Ps LEFT WHITE CURLY BRACKET
+2984 ; Grapheme_Base # Pe RIGHT WHITE CURLY BRACKET
+2985 ; Grapheme_Base # Ps LEFT WHITE PARENTHESIS
+2986 ; Grapheme_Base # Pe RIGHT WHITE PARENTHESIS
+2987 ; Grapheme_Base # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; Grapheme_Base # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; Grapheme_Base # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; Grapheme_Base # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; Grapheme_Base # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; Grapheme_Base # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; Grapheme_Base # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; Grapheme_Base # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; Grapheme_Base # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; Grapheme_Base # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; Grapheme_Base # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; Grapheme_Base # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7 ; Grapheme_Base # Sm [63] DOTTED FENCE..BLACK HOURGLASS
+29D8 ; Grapheme_Base # Ps LEFT WIGGLY FENCE
+29D9 ; Grapheme_Base # Pe RIGHT WIGGLY FENCE
+29DA ; Grapheme_Base # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; Grapheme_Base # Pe RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB ; Grapheme_Base # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC ; Grapheme_Base # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; Grapheme_Base # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF ; Grapheme_Base # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B2F ; Grapheme_Base # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE
+2B30..2B44 ; Grapheme_Base # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET
+2B45..2B46 ; Grapheme_Base # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW
+2B47..2B4C ; Grapheme_Base # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50..2B59 ; Grapheme_Base # So [10] WHITE MEDIUM STAR..HEAVY CIRCLED SALTIRE
+2C00..2C2E ; Grapheme_Base # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; Grapheme_Base # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C7C ; Grapheme_Base # L& [29] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; Grapheme_Base # Lm MODIFIER LETTER CAPITAL V
+2C7E..2CE4 ; Grapheme_Base # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI
+2CE5..2CEA ; Grapheme_Base # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA
+2CEB..2CEE ; Grapheme_Base # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2CF9..2CFC ; Grapheme_Base # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD ; Grapheme_Base # No COPTIC FRACTION ONE HALF
+2CFE..2CFF ; Grapheme_Base # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
+2D00..2D25 ; Grapheme_Base # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+2D30..2D65 ; Grapheme_Base # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F ; Grapheme_Base # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80..2D96 ; Grapheme_Base # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+2E00..2E01 ; Grapheme_Base # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 ; Grapheme_Base # Pi LEFT SUBSTITUTION BRACKET
+2E03 ; Grapheme_Base # Pf RIGHT SUBSTITUTION BRACKET
+2E04 ; Grapheme_Base # Pi LEFT DOTTED SUBSTITUTION BRACKET
+2E05 ; Grapheme_Base # Pf RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08 ; Grapheme_Base # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09 ; Grapheme_Base # Pi LEFT TRANSPOSITION BRACKET
+2E0A ; Grapheme_Base # Pf RIGHT TRANSPOSITION BRACKET
+2E0B ; Grapheme_Base # Po RAISED SQUARE
+2E0C ; Grapheme_Base # Pi LEFT RAISED OMISSION BRACKET
+2E0D ; Grapheme_Base # Pf RIGHT RAISED OMISSION BRACKET
+2E0E..2E16 ; Grapheme_Base # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17 ; Grapheme_Base # Pd DOUBLE OBLIQUE HYPHEN
+2E18..2E19 ; Grapheme_Base # Po [2] INVERTED INTERROBANG..PALM BRANCH
+2E1A ; Grapheme_Base # Pd HYPHEN WITH DIAERESIS
+2E1B ; Grapheme_Base # Po TILDE WITH RING ABOVE
+2E1C ; Grapheme_Base # Pi LEFT LOW PARAPHRASE BRACKET
+2E1D ; Grapheme_Base # Pf RIGHT LOW PARAPHRASE BRACKET
+2E1E..2E1F ; Grapheme_Base # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW
+2E20 ; Grapheme_Base # Pi LEFT VERTICAL BAR WITH QUILL
+2E21 ; Grapheme_Base # Pf RIGHT VERTICAL BAR WITH QUILL
+2E22 ; Grapheme_Base # Ps TOP LEFT HALF BRACKET
+2E23 ; Grapheme_Base # Pe TOP RIGHT HALF BRACKET
+2E24 ; Grapheme_Base # Ps BOTTOM LEFT HALF BRACKET
+2E25 ; Grapheme_Base # Pe BOTTOM RIGHT HALF BRACKET
+2E26 ; Grapheme_Base # Ps LEFT SIDEWAYS U BRACKET
+2E27 ; Grapheme_Base # Pe RIGHT SIDEWAYS U BRACKET
+2E28 ; Grapheme_Base # Ps LEFT DOUBLE PARENTHESIS
+2E29 ; Grapheme_Base # Pe RIGHT DOUBLE PARENTHESIS
+2E2A..2E2E ; Grapheme_Base # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK
+2E2F ; Grapheme_Base # Lm VERTICAL TILDE
+2E30..2E31 ; Grapheme_Base # Po [2] RING POINT..WORD SEPARATOR MIDDLE DOT
+2E80..2E99 ; Grapheme_Base # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3 ; Grapheme_Base # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5 ; Grapheme_Base # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+2FF0..2FFB ; Grapheme_Base # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000 ; Grapheme_Base # Zs IDEOGRAPHIC SPACE
+3001..3003 ; Grapheme_Base # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
+3004 ; Grapheme_Base # So JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005 ; Grapheme_Base # Lm IDEOGRAPHIC ITERATION MARK
+3006 ; Grapheme_Base # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; Grapheme_Base # Nl IDEOGRAPHIC NUMBER ZERO
+3008 ; Grapheme_Base # Ps LEFT ANGLE BRACKET
+3009 ; Grapheme_Base # Pe RIGHT ANGLE BRACKET
+300A ; Grapheme_Base # Ps LEFT DOUBLE ANGLE BRACKET
+300B ; Grapheme_Base # Pe RIGHT DOUBLE ANGLE BRACKET
+300C ; Grapheme_Base # Ps LEFT CORNER BRACKET
+300D ; Grapheme_Base # Pe RIGHT CORNER BRACKET
+300E ; Grapheme_Base # Ps LEFT WHITE CORNER BRACKET
+300F ; Grapheme_Base # Pe RIGHT WHITE CORNER BRACKET
+3010 ; Grapheme_Base # Ps LEFT BLACK LENTICULAR BRACKET
+3011 ; Grapheme_Base # Pe RIGHT BLACK LENTICULAR BRACKET
+3012..3013 ; Grapheme_Base # So [2] POSTAL MARK..GETA MARK
+3014 ; Grapheme_Base # Ps LEFT TORTOISE SHELL BRACKET
+3015 ; Grapheme_Base # Pe RIGHT TORTOISE SHELL BRACKET
+3016 ; Grapheme_Base # Ps LEFT WHITE LENTICULAR BRACKET
+3017 ; Grapheme_Base # Pe RIGHT WHITE LENTICULAR BRACKET
+3018 ; Grapheme_Base # Ps LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; Grapheme_Base # Pe RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; Grapheme_Base # Ps LEFT WHITE SQUARE BRACKET
+301B ; Grapheme_Base # Pe RIGHT WHITE SQUARE BRACKET
+301C ; Grapheme_Base # Pd WAVE DASH
+301D ; Grapheme_Base # Ps REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F ; Grapheme_Base # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020 ; Grapheme_Base # So POSTAL MARK FACE
+3021..3029 ; Grapheme_Base # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3030 ; Grapheme_Base # Pd WAVY DASH
+3031..3035 ; Grapheme_Base # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3036..3037 ; Grapheme_Base # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038..303A ; Grapheme_Base # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; Grapheme_Base # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+303C ; Grapheme_Base # Lo MASU MARK
+303D ; Grapheme_Base # Po PART ALTERNATION MARK
+303E..303F ; Grapheme_Base # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE
+3041..3096 ; Grapheme_Base # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309B..309C ; Grapheme_Base # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D..309E ; Grapheme_Base # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; Grapheme_Base # Lo HIRAGANA DIGRAPH YORI
+30A0 ; Grapheme_Base # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1..30FA ; Grapheme_Base # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FB ; Grapheme_Base # Po KATAKANA MIDDLE DOT
+30FC..30FE ; Grapheme_Base # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+30FF ; Grapheme_Base # Lo KATAKANA DIGRAPH KOTO
+3105..312D ; Grapheme_Base # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+3131..318E ; Grapheme_Base # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+3190..3191 ; Grapheme_Base # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192..3195 ; Grapheme_Base # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
+3196..319F ; Grapheme_Base # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+31A0..31B7 ; Grapheme_Base # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+31C0..31E3 ; Grapheme_Base # So [36] CJK STROKE T..CJK STROKE Q
+31F0..31FF ; Grapheme_Base # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3200..321E ; Grapheme_Base # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
+3220..3229 ; Grapheme_Base # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
+322A..3250 ; Grapheme_Base # So [39] PARENTHESIZED IDEOGRAPH MOON..PARTNERSHIP SIGN
+3251..325F ; Grapheme_Base # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
+3260..327F ; Grapheme_Base # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL
+3280..3289 ; Grapheme_Base # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
+328A..32B0 ; Grapheme_Base # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
+32B1..32BF ; Grapheme_Base # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
+32C0..32FE ; Grapheme_Base # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO
+3300..33FF ; Grapheme_Base # So [256] SQUARE APAATO..SQUARE GAL
+3400..4DB5 ; Grapheme_Base # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4DC0..4DFF ; Grapheme_Base # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+4E00..9FCB ; Grapheme_Base # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+A000..A014 ; Grapheme_Base # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; Grapheme_Base # Lm YI SYLLABLE WU
+A016..A48C ; Grapheme_Base # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A490..A4C6 ; Grapheme_Base # So [55] YI RADICAL QOT..YI RADICAL KE
+A4D0..A4F7 ; Grapheme_Base # Lo [40] LISU LETTER BA..LISU LETTER OE
+A4F8..A4FD ; Grapheme_Base # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A4FE..A4FF ; Grapheme_Base # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
+A500..A60B ; Grapheme_Base # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; Grapheme_Base # Lm VAI SYLLABLE LENGTHENER
+A60D..A60F ; Grapheme_Base # Po [3] VAI COMMA..VAI QUESTION MARK
+A610..A61F ; Grapheme_Base # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A620..A629 ; Grapheme_Base # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE
+A62A..A62B ; Grapheme_Base # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+A640..A65F ; Grapheme_Base # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; Grapheme_Base # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; Grapheme_Base # Lo CYRILLIC LETTER MULTIOCULAR O
+A673 ; Grapheme_Base # Po SLAVONIC ASTERISK
+A67E ; Grapheme_Base # Po CYRILLIC KAVYKA
+A67F ; Grapheme_Base # Lm CYRILLIC PAYEROK
+A680..A697 ; Grapheme_Base # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+A6A0..A6E5 ; Grapheme_Base # Lo [70] BAMUM LETTER A..BAMUM LETTER KI
+A6E6..A6EF ; Grapheme_Base # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A6F2..A6F7 ; Grapheme_Base # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK
+A700..A716 ; Grapheme_Base # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717..A71F ; Grapheme_Base # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720..A721 ; Grapheme_Base # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+A722..A76F ; Grapheme_Base # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; Grapheme_Base # Lm MODIFIER LETTER US
+A771..A787 ; Grapheme_Base # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A788 ; Grapheme_Base # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789..A78A ; Grapheme_Base # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN
+A78B..A78C ; Grapheme_Base # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A801 ; Grapheme_Base # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I
+A803..A805 ; Grapheme_Base # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A807..A80A ; Grapheme_Base # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80C..A822 ; Grapheme_Base # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824 ; Grapheme_Base # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A827 ; Grapheme_Base # Mc SYLOTI NAGRI VOWEL SIGN OO
+A828..A82B ; Grapheme_Base # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+A830..A835 ; Grapheme_Base # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS
+A836..A837 ; Grapheme_Base # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK
+A838 ; Grapheme_Base # Sc NORTH INDIC RUPEE MARK
+A839 ; Grapheme_Base # So NORTH INDIC QUANTITY MARK
+A840..A873 ; Grapheme_Base # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A874..A877 ; Grapheme_Base # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD
+A880..A881 ; Grapheme_Base # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A882..A8B3 ; Grapheme_Base # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8B4..A8C3 ; Grapheme_Base # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A8CE..A8CF ; Grapheme_Base # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A8D0..A8D9 ; Grapheme_Base # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+A8F2..A8F7 ; Grapheme_Base # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8F8..A8FA ; Grapheme_Base # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
+A8FB ; Grapheme_Base # Lo DEVANAGARI HEADSTROKE
+A900..A909 ; Grapheme_Base # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE
+A90A..A925 ; Grapheme_Base # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A92E..A92F ; Grapheme_Base # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA
+A930..A946 ; Grapheme_Base # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A952..A953 ; Grapheme_Base # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A95F ; Grapheme_Base # Po REJANG SECTION MARK
+A960..A97C ; Grapheme_Base # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+A983 ; Grapheme_Base # Mc JAVANESE SIGN WIGNYAN
+A984..A9B2 ; Grapheme_Base # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA
+A9B4..A9B5 ; Grapheme_Base # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9BA..A9BB ; Grapheme_Base # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BD..A9C0 ; Grapheme_Base # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON
+A9C1..A9CD ; Grapheme_Base # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH
+A9CF ; Grapheme_Base # Lm JAVANESE PANGRANGKEP
+A9D0..A9D9 ; Grapheme_Base # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE
+A9DE..A9DF ; Grapheme_Base # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN
+AA00..AA28 ; Grapheme_Base # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA2F..AA30 ; Grapheme_Base # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA33..AA34 ; Grapheme_Base # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA40..AA42 ; Grapheme_Base # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA44..AA4B ; Grapheme_Base # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA4D ; Grapheme_Base # Mc CHAM CONSONANT SIGN FINAL H
+AA50..AA59 ; Grapheme_Base # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE
+AA5C..AA5F ; Grapheme_Base # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA
+AA60..AA6F ; Grapheme_Base # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA
+AA70 ; Grapheme_Base # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AA71..AA76 ; Grapheme_Base # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM
+AA77..AA79 ; Grapheme_Base # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO
+AA7A ; Grapheme_Base # Lo MYANMAR LETTER AITON RA
+AA7B ; Grapheme_Base # Mc MYANMAR SIGN PAO KAREN TONE
+AA80..AAAF ; Grapheme_Base # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O
+AAB1 ; Grapheme_Base # Lo TAI VIET VOWEL AA
+AAB5..AAB6 ; Grapheme_Base # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB9..AABD ; Grapheme_Base # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN
+AAC0 ; Grapheme_Base # Lo TAI VIET TONE MAI NUENG
+AAC2 ; Grapheme_Base # Lo TAI VIET TONE MAI SONG
+AADB..AADC ; Grapheme_Base # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG
+AADD ; Grapheme_Base # Lm TAI VIET SYMBOL SAM
+AADE..AADF ; Grapheme_Base # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI
+ABC0..ABE2 ; Grapheme_Base # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
+ABE3..ABE4 ; Grapheme_Base # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE6..ABE7 ; Grapheme_Base # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE9..ABEA ; Grapheme_Base # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+ABEB ; Grapheme_Base # Po MEETEI MAYEK CHEIKHEI
+ABEC ; Grapheme_Base # Mc MEETEI MAYEK LUM IYEK
+ABF0..ABF9 ; Grapheme_Base # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
+AC00..D7A3 ; Grapheme_Base # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+D7B0..D7C6 ; Grapheme_Base # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7CB..D7FB ; Grapheme_Base # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+F900..FA2D ; Grapheme_Base # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6D ; Grapheme_Base # Lo [62] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA70..FAD9 ; Grapheme_Base # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00..FB06 ; Grapheme_Base # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; Grapheme_Base # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB1D ; Grapheme_Base # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1F..FB28 ; Grapheme_Base # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB29 ; Grapheme_Base # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A..FB36 ; Grapheme_Base # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; Grapheme_Base # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; Grapheme_Base # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; Grapheme_Base # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; Grapheme_Base # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FBB1 ; Grapheme_Base # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FD3D ; Grapheme_Base # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E ; Grapheme_Base # Ps ORNATE LEFT PARENTHESIS
+FD3F ; Grapheme_Base # Pe ORNATE RIGHT PARENTHESIS
+FD50..FD8F ; Grapheme_Base # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; Grapheme_Base # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB ; Grapheme_Base # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FDFC ; Grapheme_Base # Sc RIAL SIGN
+FDFD ; Grapheme_Base # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE10..FE16 ; Grapheme_Base # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19 ; Grapheme_Base # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE30 ; Grapheme_Base # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31..FE32 ; Grapheme_Base # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE33..FE34 ; Grapheme_Base # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45..FE46 ; Grapheme_Base # Po [2] SESAME DOT..WHITE SESAME DOT
+FE47 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49..FE4C ; Grapheme_Base # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
+FE4D..FE4F ; Grapheme_Base # Pc [3] DASHED LOW LINE..WAVY LOW LINE
+FE50..FE52 ; Grapheme_Base # Po [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57 ; Grapheme_Base # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FE58 ; Grapheme_Base # Pd SMALL EM DASH
+FE59 ; Grapheme_Base # Ps SMALL LEFT PARENTHESIS
+FE5A ; Grapheme_Base # Pe SMALL RIGHT PARENTHESIS
+FE5B ; Grapheme_Base # Ps SMALL LEFT CURLY BRACKET
+FE5C ; Grapheme_Base # Pe SMALL RIGHT CURLY BRACKET
+FE5D ; Grapheme_Base # Ps SMALL LEFT TORTOISE SHELL BRACKET
+FE5E ; Grapheme_Base # Pe SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F..FE61 ; Grapheme_Base # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK
+FE62 ; Grapheme_Base # Sm SMALL PLUS SIGN
+FE63 ; Grapheme_Base # Pd SMALL HYPHEN-MINUS
+FE64..FE66 ; Grapheme_Base # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE68 ; Grapheme_Base # Po SMALL REVERSE SOLIDUS
+FE69 ; Grapheme_Base # Sc SMALL DOLLAR SIGN
+FE6A..FE6B ; Grapheme_Base # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
+FE70..FE74 ; Grapheme_Base # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC ; Grapheme_Base # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FF01..FF03 ; Grapheme_Base # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN
+FF04 ; Grapheme_Base # Sc FULLWIDTH DOLLAR SIGN
+FF05..FF07 ; Grapheme_Base # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE
+FF08 ; Grapheme_Base # Ps FULLWIDTH LEFT PARENTHESIS
+FF09 ; Grapheme_Base # Pe FULLWIDTH RIGHT PARENTHESIS
+FF0A ; Grapheme_Base # Po FULLWIDTH ASTERISK
+FF0B ; Grapheme_Base # Sm FULLWIDTH PLUS SIGN
+FF0C ; Grapheme_Base # Po FULLWIDTH COMMA
+FF0D ; Grapheme_Base # Pd FULLWIDTH HYPHEN-MINUS
+FF0E..FF0F ; Grapheme_Base # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS
+FF10..FF19 ; Grapheme_Base # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF1A..FF1B ; Grapheme_Base # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1C..FF1E ; Grapheme_Base # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF1F..FF20 ; Grapheme_Base # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT
+FF21..FF3A ; Grapheme_Base # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B ; Grapheme_Base # Ps FULLWIDTH LEFT SQUARE BRACKET
+FF3C ; Grapheme_Base # Po FULLWIDTH REVERSE SOLIDUS
+FF3D ; Grapheme_Base # Pe FULLWIDTH RIGHT SQUARE BRACKET
+FF3E ; Grapheme_Base # Sk FULLWIDTH CIRCUMFLEX ACCENT
+FF3F ; Grapheme_Base # Pc FULLWIDTH LOW LINE
+FF40 ; Grapheme_Base # Sk FULLWIDTH GRAVE ACCENT
+FF41..FF5A ; Grapheme_Base # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF5B ; Grapheme_Base # Ps FULLWIDTH LEFT CURLY BRACKET
+FF5C ; Grapheme_Base # Sm FULLWIDTH VERTICAL LINE
+FF5D ; Grapheme_Base # Pe FULLWIDTH RIGHT CURLY BRACKET
+FF5E ; Grapheme_Base # Sm FULLWIDTH TILDE
+FF5F ; Grapheme_Base # Ps FULLWIDTH LEFT WHITE PARENTHESIS
+FF60 ; Grapheme_Base # Pe FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61 ; Grapheme_Base # Po HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62 ; Grapheme_Base # Ps HALFWIDTH LEFT CORNER BRACKET
+FF63 ; Grapheme_Base # Pe HALFWIDTH RIGHT CORNER BRACKET
+FF64..FF65 ; Grapheme_Base # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT
+FF66..FF6F ; Grapheme_Base # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 ; Grapheme_Base # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D ; Grapheme_Base # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FFA0..FFBE ; Grapheme_Base # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; Grapheme_Base # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+FFE0..FFE1 ; Grapheme_Base # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
+FFE2 ; Grapheme_Base # Sm FULLWIDTH NOT SIGN
+FFE3 ; Grapheme_Base # Sk FULLWIDTH MACRON
+FFE4 ; Grapheme_Base # So FULLWIDTH BROKEN BAR
+FFE5..FFE6 ; Grapheme_Base # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
+FFE8 ; Grapheme_Base # So HALFWIDTH FORMS LIGHT VERTICAL
+FFE9..FFEC ; Grapheme_Base # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+FFED..FFEE ; Grapheme_Base # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
+FFFC..FFFD ; Grapheme_Base # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
+10000..1000B ; Grapheme_Base # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; Grapheme_Base # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; Grapheme_Base # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; Grapheme_Base # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; Grapheme_Base # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; Grapheme_Base # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; Grapheme_Base # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+10100..10101 ; Grapheme_Base # Po [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT
+10102 ; Grapheme_Base # So AEGEAN CHECK MARK
+10107..10133 ; Grapheme_Base # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+10137..1013F ; Grapheme_Base # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
+10140..10174 ; Grapheme_Base # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175..10178 ; Grapheme_Base # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN
+10179..10189 ; Grapheme_Base # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN
+1018A ; Grapheme_Base # No GREEK ZERO SIGN
+10190..1019B ; Grapheme_Base # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN
+101D0..101FC ; Grapheme_Base # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND
+10280..1029C ; Grapheme_Base # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+102A0..102D0 ; Grapheme_Base # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+10300..1031E ; Grapheme_Base # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10320..10323 ; Grapheme_Base # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+10330..10340 ; Grapheme_Base # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; Grapheme_Base # Nl GOTHIC LETTER NINETY
+10342..10349 ; Grapheme_Base # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; Grapheme_Base # Nl GOTHIC LETTER NINE HUNDRED
+10380..1039D ; Grapheme_Base # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+1039F ; Grapheme_Base # Po UGARITIC WORD DIVIDER
+103A0..103C3 ; Grapheme_Base # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; Grapheme_Base # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D0 ; Grapheme_Base # Po OLD PERSIAN WORD DIVIDER
+103D1..103D5 ; Grapheme_Base # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+10400..1044F ; Grapheme_Base # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+10450..1049D ; Grapheme_Base # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO
+104A0..104A9 ; Grapheme_Base # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+10800..10805 ; Grapheme_Base # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; Grapheme_Base # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; Grapheme_Base # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; Grapheme_Base # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; Grapheme_Base # Lo CYPRIOT SYLLABLE ZA
+1083F..10855 ; Grapheme_Base # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW
+10857 ; Grapheme_Base # Po IMPERIAL ARAMAIC SECTION SIGN
+10858..1085F ; Grapheme_Base # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND
+10900..10915 ; Grapheme_Base # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10916..1091B ; Grapheme_Base # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE
+1091F ; Grapheme_Base # Po PHOENICIAN WORD SEPARATOR
+10920..10939 ; Grapheme_Base # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+1093F ; Grapheme_Base # Po LYDIAN TRIANGULAR MARK
+10A00 ; Grapheme_Base # Lo KHAROSHTHI LETTER A
+10A10..10A13 ; Grapheme_Base # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; Grapheme_Base # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; Grapheme_Base # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A40..10A47 ; Grapheme_Base # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+10A50..10A58 ; Grapheme_Base # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
+10A60..10A7C ; Grapheme_Base # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10A7D..10A7E ; Grapheme_Base # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY
+10A7F ; Grapheme_Base # Po OLD SOUTH ARABIAN NUMERIC INDICATOR
+10B00..10B35 ; Grapheme_Base # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE
+10B39..10B3F ; Grapheme_Base # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION
+10B40..10B55 ; Grapheme_Base # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B58..10B5F ; Grapheme_Base # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
+10B60..10B72 ; Grapheme_Base # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10B78..10B7F ; Grapheme_Base # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
+10C00..10C48 ; Grapheme_Base # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+10E60..10E7E ; Grapheme_Base # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS
+11082 ; Grapheme_Base # Mc KAITHI SIGN VISARGA
+11083..110AF ; Grapheme_Base # Lo [45] KAITHI LETTER A..KAITHI LETTER HA
+110B0..110B2 ; Grapheme_Base # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B7..110B8 ; Grapheme_Base # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+110BB..110BC ; Grapheme_Base # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN
+110BE..110C1 ; Grapheme_Base # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
+12000..1236E ; Grapheme_Base # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462 ; Grapheme_Base # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470..12473 ; Grapheme_Base # Po [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+13000..1342E ; Grapheme_Base # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+1D000..1D0F5 ; Grapheme_Base # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100..1D126 ; Grapheme_Base # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+1D129..1D164 ; Grapheme_Base # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D166 ; Grapheme_Base # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D16A..1D16C ; Grapheme_Base # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D ; Grapheme_Base # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D183..1D184 ; Grapheme_Base # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
+1D18C..1D1A9 ; Grapheme_Base # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
+1D1AE..1D1DD ; Grapheme_Base # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS
+1D200..1D241 ; Grapheme_Base # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D245 ; Grapheme_Base # So GREEK MUSICAL LEIMMA
+1D300..1D356 ; Grapheme_Base # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+1D360..1D371 ; Grapheme_Base # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
+1D400..1D454 ; Grapheme_Base # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; Grapheme_Base # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Grapheme_Base # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Grapheme_Base # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Grapheme_Base # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Grapheme_Base # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; Grapheme_Base # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Grapheme_Base # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Grapheme_Base # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; Grapheme_Base # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Grapheme_Base # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Grapheme_Base # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Grapheme_Base # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; Grapheme_Base # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Grapheme_Base # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Grapheme_Base # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Grapheme_Base # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Grapheme_Base # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; Grapheme_Base # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; Grapheme_Base # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1 ; Grapheme_Base # Sm MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA ; Grapheme_Base # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB ; Grapheme_Base # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA ; Grapheme_Base # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB ; Grapheme_Base # Sm MATHEMATICAL ITALIC NABLA
+1D6FC..1D714 ; Grapheme_Base # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715 ; Grapheme_Base # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734 ; Grapheme_Base # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735 ; Grapheme_Base # Sm MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E ; Grapheme_Base # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F ; Grapheme_Base # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E ; Grapheme_Base # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788 ; Grapheme_Base # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8 ; Grapheme_Base # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2 ; Grapheme_Base # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7CB ; Grapheme_Base # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; Grapheme_Base # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1F000..1F02B ; Grapheme_Base # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK
+1F030..1F093 ; Grapheme_Base # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
+1F100..1F10A ; Grapheme_Base # No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA
+1F110..1F12E ; Grapheme_Base # So [31] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ
+1F131 ; Grapheme_Base # So SQUARED LATIN CAPITAL LETTER B
+1F13D ; Grapheme_Base # So SQUARED LATIN CAPITAL LETTER N
+1F13F ; Grapheme_Base # So SQUARED LATIN CAPITAL LETTER P
+1F142 ; Grapheme_Base # So SQUARED LATIN CAPITAL LETTER S
+1F146 ; Grapheme_Base # So SQUARED LATIN CAPITAL LETTER W
+1F14A..1F14E ; Grapheme_Base # So [5] SQUARED HV..SQUARED PPV
+1F157 ; Grapheme_Base # So NEGATIVE CIRCLED LATIN CAPITAL LETTER H
+1F15F ; Grapheme_Base # So NEGATIVE CIRCLED LATIN CAPITAL LETTER P
+1F179 ; Grapheme_Base # So NEGATIVE SQUARED LATIN CAPITAL LETTER J
+1F17B..1F17C ; Grapheme_Base # So [2] NEGATIVE SQUARED LATIN CAPITAL LETTER L..NEGATIVE SQUARED LATIN CAPITAL LETTER M
+1F17F ; Grapheme_Base # So NEGATIVE SQUARED LATIN CAPITAL LETTER P
+1F18A..1F18D ; Grapheme_Base # So [4] CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P..NEGATIVE SQUARED SA
+1F190 ; Grapheme_Base # So SQUARE DJ
+1F200 ; Grapheme_Base # So SQUARE HIRAGANA HOKA
+1F210..1F231 ; Grapheme_Base # So [34] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-6253
+1F240..1F248 ; Grapheme_Base # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557
+20000..2A6D6 ; Grapheme_Base # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; Grapheme_Base # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2F800..2FA1D ; Grapheme_Base # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 105958
+
+# ================================================
+
+# Derived Property: Grapheme_Link (deprecated)
+# Generated from: Canonical_Combining_Class=Virama
+# Use Canonical_Combining_Class=Virama directly instead
+
+094D ; Grapheme_Link # Mn DEVANAGARI SIGN VIRAMA
+09CD ; Grapheme_Link # Mn BENGALI SIGN VIRAMA
+0A4D ; Grapheme_Link # Mn GURMUKHI SIGN VIRAMA
+0ACD ; Grapheme_Link # Mn GUJARATI SIGN VIRAMA
+0B4D ; Grapheme_Link # Mn ORIYA SIGN VIRAMA
+0BCD ; Grapheme_Link # Mn TAMIL SIGN VIRAMA
+0C4D ; Grapheme_Link # Mn TELUGU SIGN VIRAMA
+0CCD ; Grapheme_Link # Mn KANNADA SIGN VIRAMA
+0D4D ; Grapheme_Link # Mn MALAYALAM SIGN VIRAMA
+0DCA ; Grapheme_Link # Mn SINHALA SIGN AL-LAKUNA
+0E3A ; Grapheme_Link # Mn THAI CHARACTER PHINTHU
+0F84 ; Grapheme_Link # Mn TIBETAN MARK HALANTA
+1039..103A ; Grapheme_Link # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+1714 ; Grapheme_Link # Mn TAGALOG SIGN VIRAMA
+1734 ; Grapheme_Link # Mn HANUNOO SIGN PAMUDPOD
+17D2 ; Grapheme_Link # Mn KHMER SIGN COENG
+1A60 ; Grapheme_Link # Mn TAI THAM SIGN SAKOT
+1B44 ; Grapheme_Link # Mc BALINESE ADEG ADEG
+1BAA ; Grapheme_Link # Mc SUNDANESE SIGN PAMAAEH
+A806 ; Grapheme_Link # Mn SYLOTI NAGRI SIGN HASANTA
+A8C4 ; Grapheme_Link # Mn SAURASHTRA SIGN VIRAMA
+A953 ; Grapheme_Link # Mc REJANG VIRAMA
+A9C0 ; Grapheme_Link # Mc JAVANESE PANGKON
+ABED ; Grapheme_Link # Mn MEETEI MAYEK APUN IYEK
+10A3F ; Grapheme_Link # Mn KHAROSHTHI VIRAMA
+110B9 ; Grapheme_Link # Mn KAITHI SIGN VIRAMA
+
+# Total code points: 27
+
+# EOF
diff --git a/boost/spirit/home/support/char_encoding/unicode/PropList.txt b/boost/spirit/home/support/char_encoding/unicode/PropList.txt
new file mode 100644
index 0000000000..39cb741560
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/PropList.txt
@@ -0,0 +1,1303 @@
+# PropList-5.2.0.txt
+# Date: 2009-08-22, 04:58:40 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2009 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see http://www.unicode.org/reports/tr44/
+
+# It is ok to redistribute this file "solely for informational
+# purposes in the creation of products supporting the Unicode Standard".
+# We don't nee to add a Boost License to this file: boostinspect:nolicense.
+
+# ================================================
+
+0009..000D ; White_Space # Cc [5] <control-0009>..<control-000D>
+0020 ; White_Space # Zs SPACE
+0085 ; White_Space # Cc <control-0085>
+00A0 ; White_Space # Zs NO-BREAK SPACE
+1680 ; White_Space # Zs OGHAM SPACE MARK
+180E ; White_Space # Zs MONGOLIAN VOWEL SEPARATOR
+2000..200A ; White_Space # Zs [11] EN QUAD..HAIR SPACE
+2028 ; White_Space # Zl LINE SEPARATOR
+2029 ; White_Space # Zp PARAGRAPH SEPARATOR
+202F ; White_Space # Zs NARROW NO-BREAK SPACE
+205F ; White_Space # Zs MEDIUM MATHEMATICAL SPACE
+3000 ; White_Space # Zs IDEOGRAPHIC SPACE
+
+# Total code points: 26
+
+# ================================================
+
+200E..200F ; Bidi_Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+202A..202E ; Bidi_Control # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+
+# Total code points: 7
+
+# ================================================
+
+200C..200D ; Join_Control # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+
+# Total code points: 2
+
+# ================================================
+
+002D ; Dash # Pd HYPHEN-MINUS
+058A ; Dash # Pd ARMENIAN HYPHEN
+05BE ; Dash # Pd HEBREW PUNCTUATION MAQAF
+1400 ; Dash # Pd CANADIAN SYLLABICS HYPHEN
+1806 ; Dash # Pd MONGOLIAN TODO SOFT HYPHEN
+2010..2015 ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR
+2053 ; Dash # Po SWUNG DASH
+207B ; Dash # Sm SUPERSCRIPT MINUS
+208B ; Dash # Sm SUBSCRIPT MINUS
+2212 ; Dash # Sm MINUS SIGN
+2E17 ; Dash # Pd DOUBLE OBLIQUE HYPHEN
+2E1A ; Dash # Pd HYPHEN WITH DIAERESIS
+301C ; Dash # Pd WAVE DASH
+3030 ; Dash # Pd WAVY DASH
+30A0 ; Dash # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN
+FE31..FE32 ; Dash # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE58 ; Dash # Pd SMALL EM DASH
+FE63 ; Dash # Pd SMALL HYPHEN-MINUS
+FF0D ; Dash # Pd FULLWIDTH HYPHEN-MINUS
+
+# Total code points: 25
+
+# ================================================
+
+002D ; Hyphen # Pd HYPHEN-MINUS
+00AD ; Hyphen # Cf SOFT HYPHEN
+058A ; Hyphen # Pd ARMENIAN HYPHEN
+1806 ; Hyphen # Pd MONGOLIAN TODO SOFT HYPHEN
+2010..2011 ; Hyphen # Pd [2] HYPHEN..NON-BREAKING HYPHEN
+2E17 ; Hyphen # Pd DOUBLE OBLIQUE HYPHEN
+30FB ; Hyphen # Po KATAKANA MIDDLE DOT
+FE63 ; Hyphen # Pd SMALL HYPHEN-MINUS
+FF0D ; Hyphen # Pd FULLWIDTH HYPHEN-MINUS
+FF65 ; Hyphen # Po HALFWIDTH KATAKANA MIDDLE DOT
+
+# Total code points: 11
+
+# ================================================
+
+0022 ; Quotation_Mark # Po QUOTATION MARK
+0027 ; Quotation_Mark # Po APOSTROPHE
+00AB ; Quotation_Mark # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB ; Quotation_Mark # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+2018 ; Quotation_Mark # Pi LEFT SINGLE QUOTATION MARK
+2019 ; Quotation_Mark # Pf RIGHT SINGLE QUOTATION MARK
+201A ; Quotation_Mark # Ps SINGLE LOW-9 QUOTATION MARK
+201B..201C ; Quotation_Mark # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D ; Quotation_Mark # Pf RIGHT DOUBLE QUOTATION MARK
+201E ; Quotation_Mark # Ps DOUBLE LOW-9 QUOTATION MARK
+201F ; Quotation_Mark # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2039 ; Quotation_Mark # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; Quotation_Mark # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+300C ; Quotation_Mark # Ps LEFT CORNER BRACKET
+300D ; Quotation_Mark # Pe RIGHT CORNER BRACKET
+300E ; Quotation_Mark # Ps LEFT WHITE CORNER BRACKET
+300F ; Quotation_Mark # Pe RIGHT WHITE CORNER BRACKET
+301D ; Quotation_Mark # Ps REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F ; Quotation_Mark # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+FE41 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FF02 ; Quotation_Mark # Po FULLWIDTH QUOTATION MARK
+FF07 ; Quotation_Mark # Po FULLWIDTH APOSTROPHE
+FF62 ; Quotation_Mark # Ps HALFWIDTH LEFT CORNER BRACKET
+FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
+
+# Total code points: 29
+
+# ================================================
+
+0021 ; Terminal_Punctuation # Po EXCLAMATION MARK
+002C ; Terminal_Punctuation # Po COMMA
+002E ; Terminal_Punctuation # Po FULL STOP
+003A..003B ; Terminal_Punctuation # Po [2] COLON..SEMICOLON
+003F ; Terminal_Punctuation # Po QUESTION MARK
+037E ; Terminal_Punctuation # Po GREEK QUESTION MARK
+0387 ; Terminal_Punctuation # Po GREEK ANO TELEIA
+0589 ; Terminal_Punctuation # Po ARMENIAN FULL STOP
+05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ
+060C ; Terminal_Punctuation # Po ARABIC COMMA
+061B ; Terminal_Punctuation # Po ARABIC SEMICOLON
+061F ; Terminal_Punctuation # Po ARABIC QUESTION MARK
+06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP
+0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
+070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS
+07F8..07F9 ; Terminal_Punctuation # Po [2] NKO COMMA..NKO EXCLAMATION MARK
+0830..083E ; Terminal_Punctuation # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU
+0964..0965 ; Terminal_Punctuation # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0E5A..0E5B ; Terminal_Punctuation # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+0F08 ; Terminal_Punctuation # Po TIBETAN MARK SBRUL SHAD
+0F0D..0F12 ; Terminal_Punctuation # Po [6] TIBETAN MARK SHAD..TIBETAN MARK RGYA GRAM SHAD
+104A..104B ; Terminal_Punctuation # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
+1361..1368 ; Terminal_Punctuation # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+166D..166E ; Terminal_Punctuation # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+16EB..16ED ; Terminal_Punctuation # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+17D4..17D6 ; Terminal_Punctuation # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17DA ; Terminal_Punctuation # Po KHMER SIGN KOOMUUT
+1802..1805 ; Terminal_Punctuation # Po [4] MONGOLIAN COMMA..MONGOLIAN FOUR DOTS
+1808..1809 ; Terminal_Punctuation # Po [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP
+1944..1945 ; Terminal_Punctuation # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1AA8..1AAB ; Terminal_Punctuation # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU
+1B5A..1B5B ; Terminal_Punctuation # Po [2] BALINESE PANTI..BALINESE PAMADA
+1B5D..1B5F ; Terminal_Punctuation # Po [3] BALINESE CARIK PAMUNGKAH..BALINESE CARIK PAREREN
+1C3B..1C3F ; Terminal_Punctuation # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+1C7E..1C7F ; Terminal_Punctuation # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+203C..203D ; Terminal_Punctuation # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG
+2047..2049 ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
+2E2E ; Terminal_Punctuation # Po REVERSED QUESTION MARK
+3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
+A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
+A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK
+A6F3..A6F7 ; Terminal_Punctuation # Po [5] BAMUM FULL STOP..BAMUM QUESTION MARK
+A876..A877 ; Terminal_Punctuation # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD
+A8CE..A8CF ; Terminal_Punctuation # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A92F ; Terminal_Punctuation # Po KAYAH LI SIGN SHYA
+A9C7..A9C9 ; Terminal_Punctuation # Po [3] JAVANESE PADA PANGKAT..JAVANESE PADA LUNGSI
+AA5D..AA5F ; Terminal_Punctuation # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA
+AADF ; Terminal_Punctuation # Po TAI VIET SYMBOL KOI KOI
+ABEB ; Terminal_Punctuation # Po MEETEI MAYEK CHEIKHEI
+FE50..FE52 ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57 ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FF01 ; Terminal_Punctuation # Po FULLWIDTH EXCLAMATION MARK
+FF0C ; Terminal_Punctuation # Po FULLWIDTH COMMA
+FF0E ; Terminal_Punctuation # Po FULLWIDTH FULL STOP
+FF1A..FF1B ; Terminal_Punctuation # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1F ; Terminal_Punctuation # Po FULLWIDTH QUESTION MARK
+FF61 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC FULL STOP
+FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
+1039F ; Terminal_Punctuation # Po UGARITIC WORD DIVIDER
+103D0 ; Terminal_Punctuation # Po OLD PERSIAN WORD DIVIDER
+10857 ; Terminal_Punctuation # Po IMPERIAL ARAMAIC SECTION SIGN
+1091F ; Terminal_Punctuation # Po PHOENICIAN WORD SEPARATOR
+10B3A..10B3F ; Terminal_Punctuation # Po [6] TINY TWO DOTS OVER ONE DOT PUNCTUATION..LARGE ONE RING OVER TWO RINGS PUNCTUATION
+110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
+12470..12473 ; Terminal_Punctuation # Po [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+
+# Total code points: 161
+
+# ================================================
+
+005E ; Other_Math # Sk CIRCUMFLEX ACCENT
+03D0..03D2 ; Other_Math # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL
+03D5 ; Other_Math # L& GREEK PHI SYMBOL
+03F0..03F1 ; Other_Math # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL
+03F4..03F5 ; Other_Math # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+2016 ; Other_Math # Po DOUBLE VERTICAL LINE
+2032..2034 ; Other_Math # Po [3] PRIME..TRIPLE PRIME
+2040 ; Other_Math # Pc CHARACTER TIE
+2061..2064 ; Other_Math # Cf [4] FUNCTION APPLICATION..INVISIBLE PLUS
+207D ; Other_Math # Ps SUPERSCRIPT LEFT PARENTHESIS
+207E ; Other_Math # Pe SUPERSCRIPT RIGHT PARENTHESIS
+208D ; Other_Math # Ps SUBSCRIPT LEFT PARENTHESIS
+208E ; Other_Math # Pe SUBSCRIPT RIGHT PARENTHESIS
+20D0..20DC ; Other_Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20E1 ; Other_Math # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E5..20E6 ; Other_Math # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20EB..20EF ; Other_Math # Mn [5] COMBINING LONG DOUBLE SOLIDUS OVERLAY..COMBINING RIGHT ARROW BELOW
+2102 ; Other_Math # L& DOUBLE-STRUCK CAPITAL C
+210A..2113 ; Other_Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; Other_Math # L& DOUBLE-STRUCK CAPITAL N
+2119..211D ; Other_Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; Other_Math # L& DOUBLE-STRUCK CAPITAL Z
+2128 ; Other_Math # L& BLACK-LETTER CAPITAL Z
+2129 ; Other_Math # So TURNED GREEK SMALL LETTER IOTA
+212C..212D ; Other_Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212F..2131 ; Other_Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134 ; Other_Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138 ; Other_Math # Lo [4] ALEF SYMBOL..DALET SYMBOL
+213C..213F ; Other_Math # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149 ; Other_Math # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+2195..2199 ; Other_Math # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219C..219F ; Other_Math # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A1..21A2 ; Other_Math # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A4..21A5 ; Other_Math # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A7 ; Other_Math # So DOWNWARDS ARROW FROM BAR
+21A9..21AD ; Other_Math # So [5] LEFTWARDS ARROW WITH HOOK..LEFT RIGHT WAVE ARROW
+21B0..21B1 ; Other_Math # So [2] UPWARDS ARROW WITH TIP LEFTWARDS..UPWARDS ARROW WITH TIP RIGHTWARDS
+21B6..21B7 ; Other_Math # So [2] ANTICLOCKWISE TOP SEMICIRCLE ARROW..CLOCKWISE TOP SEMICIRCLE ARROW
+21BC..21CD ; Other_Math # So [18] LEFTWARDS HARPOON WITH BARB UPWARDS..LEFTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; Other_Math # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D3 ; Other_Math # So DOWNWARDS DOUBLE ARROW
+21D5..21DB ; Other_Math # So [7] UP DOWN DOUBLE ARROW..RIGHTWARDS TRIPLE ARROW
+21DD ; Other_Math # So RIGHTWARDS SQUIGGLE ARROW
+21E4..21E5 ; Other_Math # So [2] LEFTWARDS ARROW TO BAR..RIGHTWARDS ARROW TO BAR
+23B4..23B5 ; Other_Math # So [2] TOP SQUARE BRACKET..BOTTOM SQUARE BRACKET
+23B7 ; Other_Math # So RADICAL SYMBOL BOTTOM
+23D0 ; Other_Math # So VERTICAL LINE EXTENSION
+23E2 ; Other_Math # So WHITE TRAPEZIUM
+25A0..25A1 ; Other_Math # So [2] BLACK SQUARE..WHITE SQUARE
+25AE..25B6 ; Other_Math # So [9] BLACK VERTICAL RECTANGLE..BLACK RIGHT-POINTING TRIANGLE
+25BC..25C0 ; Other_Math # So [5] BLACK DOWN-POINTING TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C6..25C7 ; Other_Math # So [2] BLACK DIAMOND..WHITE DIAMOND
+25CA..25CB ; Other_Math # So [2] LOZENGE..WHITE CIRCLE
+25CF..25D3 ; Other_Math # So [5] BLACK CIRCLE..CIRCLE WITH UPPER HALF BLACK
+25E2 ; Other_Math # So BLACK LOWER RIGHT TRIANGLE
+25E4 ; Other_Math # So BLACK UPPER LEFT TRIANGLE
+25E7..25EC ; Other_Math # So [6] SQUARE WITH LEFT HALF BLACK..WHITE UP-POINTING TRIANGLE WITH DOT
+2605..2606 ; Other_Math # So [2] BLACK STAR..WHITE STAR
+2640 ; Other_Math # So FEMALE SIGN
+2642 ; Other_Math # So MALE SIGN
+2660..2663 ; Other_Math # So [4] BLACK SPADE SUIT..BLACK CLUB SUIT
+266D..266E ; Other_Math # So [2] MUSIC FLAT SIGN..MUSIC NATURAL SIGN
+27C5 ; Other_Math # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; Other_Math # Pe RIGHT S-SHAPED BAG DELIMITER
+27E6 ; Other_Math # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; Other_Math # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; Other_Math # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; Other_Math # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; Other_Math # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; Other_Math # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; Other_Math # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; Other_Math # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; Other_Math # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; Other_Math # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+2983 ; Other_Math # Ps LEFT WHITE CURLY BRACKET
+2984 ; Other_Math # Pe RIGHT WHITE CURLY BRACKET
+2985 ; Other_Math # Ps LEFT WHITE PARENTHESIS
+2986 ; Other_Math # Pe RIGHT WHITE PARENTHESIS
+2987 ; Other_Math # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; Other_Math # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; Other_Math # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; Other_Math # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; Other_Math # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; Other_Math # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; Other_Math # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; Other_Math # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; Other_Math # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; Other_Math # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; Other_Math # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; Other_Math # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; Other_Math # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; Other_Math # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+29D8 ; Other_Math # Ps LEFT WIGGLY FENCE
+29D9 ; Other_Math # Pe RIGHT WIGGLY FENCE
+29DA ; Other_Math # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; Other_Math # Pe RIGHT DOUBLE WIGGLY FENCE
+29FC ; Other_Math # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; Other_Math # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+FE61 ; Other_Math # Po SMALL ASTERISK
+FE63 ; Other_Math # Pd SMALL HYPHEN-MINUS
+FE68 ; Other_Math # Po SMALL REVERSE SOLIDUS
+FF3C ; Other_Math # Po FULLWIDTH REVERSE SOLIDUS
+FF3E ; Other_Math # Sk FULLWIDTH CIRCUMFLEX ACCENT
+1D400..1D454 ; Other_Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; Other_Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Other_Math # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Other_Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; Other_Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Other_Math # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Other_Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; Other_Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Other_Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Other_Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Other_Math # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; Other_Math # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Other_Math # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Other_Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Other_Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Other_Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; Other_Math # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; Other_Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA ; Other_Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA ; Other_Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714 ; Other_Math # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734 ; Other_Math # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E ; Other_Math # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E ; Other_Math # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8 ; Other_Math # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7CB ; Other_Math # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; Other_Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+
+# Total code points: 1216
+
+# ================================================
+
+0030..0039 ; Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE
+0041..0046 ; Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F
+0061..0066 ; Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F
+FF10..FF19 ; Hex_Digit # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF21..FF26 ; Hex_Digit # L& [6] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER F
+FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER F
+
+# Total code points: 44
+
+# ================================================
+
+0030..0039 ; ASCII_Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE
+0041..0046 ; ASCII_Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F
+0061..0066 ; ASCII_Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F
+
+# Total code points: 22
+
+# ================================================
+
+0345 ; Other_Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI
+05B0..05BD ; Other_Alphabetic # Mn [14] HEBREW POINT SHEVA..HEBREW POINT METEG
+05BF ; Other_Alphabetic # Mn HEBREW POINT RAFE
+05C1..05C2 ; Other_Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; Other_Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; Other_Alphabetic # Mn HEBREW POINT QAMATS QATAN
+0610..061A ; Other_Alphabetic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+064B..0657 ; Other_Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA
+0659..065E ; Other_Alphabetic # Mn [6] ARABIC ZWARAKAY..ARABIC FATHA WITH TWO DOTS
+0670 ; Other_Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC ; Other_Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06E1..06E4 ; Other_Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA
+06E7..06E8 ; Other_Alphabetic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06ED ; Other_Alphabetic # Mn ARABIC SMALL LOW MEEM
+0711 ; Other_Alphabetic # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..073F ; Other_Alphabetic # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA
+07A6..07B0 ; Other_Alphabetic # Mn [11] THAANA ABAFILI..THAANA SUKUN
+0816..0817 ; Other_Alphabetic # Mn [2] SAMARITAN MARK IN..SAMARITAN MARK IN-ALAF
+081B..0823 ; Other_Alphabetic # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0825..0827 ; Other_Alphabetic # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0829..082C ; Other_Alphabetic # Mn [4] SAMARITAN VOWEL SIGN LONG I..SAMARITAN VOWEL SIGN SUKUN
+0900..0902 ; Other_Alphabetic # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903 ; Other_Alphabetic # Mc DEVANAGARI SIGN VISARGA
+093E..0940 ; Other_Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948 ; Other_Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C ; Other_Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094E ; Other_Alphabetic # Mc DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+0955 ; Other_Alphabetic # Mn DEVANAGARI VOWEL SIGN CANDRA LONG E
+0962..0963 ; Other_Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981 ; Other_Alphabetic # Mn BENGALI SIGN CANDRABINDU
+0982..0983 ; Other_Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+09BE..09C0 ; Other_Alphabetic # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4 ; Other_Alphabetic # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8 ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09D7 ; Other_Alphabetic # Mc BENGALI AU LENGTH MARK
+09E2..09E3 ; Other_Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+0A01..0A02 ; Other_Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; Other_Alphabetic # Mc GURMUKHI SIGN VISARGA
+0A3E..0A40 ; Other_Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4C ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU
+0A51 ; Other_Alphabetic # Mn GURMUKHI SIGN UDAAT
+0A70..0A71 ; Other_Alphabetic # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A75 ; Other_Alphabetic # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; Other_Alphabetic # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83 ; Other_Alphabetic # Mc GUJARATI SIGN VISARGA
+0ABE..0AC0 ; Other_Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5 ; Other_Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9 ; Other_Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; Other_Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0AE2..0AE3 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01 ; Other_Alphabetic # Mn ORIYA SIGN CANDRABINDU
+0B02..0B03 ; Other_Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B3E ; Other_Alphabetic # Mc ORIYA VOWEL SIGN AA
+0B3F ; Other_Alphabetic # Mn ORIYA VOWEL SIGN I
+0B40 ; Other_Alphabetic # Mc ORIYA VOWEL SIGN II
+0B41..0B44 ; Other_Alphabetic # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48 ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B56 ; Other_Alphabetic # Mn ORIYA AI LENGTH MARK
+0B57 ; Other_Alphabetic # Mc ORIYA AU LENGTH MARK
+0B62..0B63 ; Other_Alphabetic # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B82 ; Other_Alphabetic # Mn TAMIL SIGN ANUSVARA
+0BBE..0BBF ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0 ; Other_Alphabetic # Mn TAMIL VOWEL SIGN II
+0BC1..0BC2 ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BD7 ; Other_Alphabetic # Mc TAMIL AU LENGTH MARK
+0C01..0C03 ; Other_Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C3E..0C40 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44 ; Other_Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4C ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU
+0C55..0C56 ; Other_Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C62..0C63 ; Other_Alphabetic # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C82..0C83 ; Other_Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0CBE ; Other_Alphabetic # Mc KANNADA VOWEL SIGN AA
+0CBF ; Other_Alphabetic # Mn KANNADA VOWEL SIGN I
+0CC0..0CC4 ; Other_Alphabetic # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; Other_Alphabetic # Mn KANNADA VOWEL SIGN E
+0CC7..0CC8 ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC ; Other_Alphabetic # Mn KANNADA VOWEL SIGN AU
+0CD5..0CD6 ; Other_Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CE2..0CE3 ; Other_Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0D02..0D03 ; Other_Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D3E..0D40 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44 ; Other_Alphabetic # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D57 ; Other_Alphabetic # Mc MALAYALAM AU LENGTH MARK
+0D62..0D63 ; Other_Alphabetic # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D82..0D83 ; Other_Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0DCF..0DD1 ; Other_Alphabetic # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4 ; Other_Alphabetic # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; Other_Alphabetic # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF ; Other_Alphabetic # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3 ; Other_Alphabetic # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E31 ; Other_Alphabetic # Mn THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A ; Other_Alphabetic # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E4D ; Other_Alphabetic # Mn THAI CHARACTER NIKHAHIT
+0EB1 ; Other_Alphabetic # Mn LAO VOWEL SIGN MAI KAN
+0EB4..0EB9 ; Other_Alphabetic # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; Other_Alphabetic # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0ECD ; Other_Alphabetic # Mn LAO NIGGAHITA
+0F71..0F7E ; Other_Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F ; Other_Alphabetic # Mc TIBETAN SIGN RNAM BCAD
+0F80..0F81 ; Other_Alphabetic # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II
+0F90..0F97 ; Other_Alphabetic # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; Other_Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+102B..102C ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031 ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN E
+1032..1036 ; Other_Alphabetic # Mn [5] MYANMAR VOWEL SIGN AI..MYANMAR SIGN ANUSVARA
+1038 ; Other_Alphabetic # Mc MYANMAR SIGN VISARGA
+103B..103C ; Other_Alphabetic # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E ; Other_Alphabetic # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+1056..1057 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105E..1060 ; Other_Alphabetic # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1062 ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN SGAW KAREN EU
+1067..1068 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+1071..1074 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1082 ; Other_Alphabetic # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+109C ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN AITON A
+109D ; Other_Alphabetic # Mn MYANMAR VOWEL SIGN AITON AI
+135F ; Other_Alphabetic # Mn ETHIOPIC COMBINING GEMINATION MARK
+1712..1713 ; Other_Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U
+1732..1733 ; Other_Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
+1752..1753 ; Other_Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773 ; Other_Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B6 ; Other_Alphabetic # Mc KHMER VOWEL SIGN AA
+17B7..17BD ; Other_Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5 ; Other_Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6 ; Other_Alphabetic # Mn KHMER SIGN NIKAHIT
+17C7..17C8 ; Other_Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+18A9 ; Other_Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922 ; Other_Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; Other_Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; Other_Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; Other_Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; Other_Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; Other_Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; Other_Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+19B0..19C0 ; Other_Alphabetic # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C8..19C9 ; Other_Alphabetic # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+1A17..1A18 ; Other_Alphabetic # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B ; Other_Alphabetic # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A55 ; Other_Alphabetic # Mc TAI THAM CONSONANT SIGN MEDIAL RA
+1A56 ; Other_Alphabetic # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A57 ; Other_Alphabetic # Mc TAI THAM CONSONANT SIGN LA TANG LAI
+1A58..1A5E ; Other_Alphabetic # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A61 ; Other_Alphabetic # Mc TAI THAM VOWEL SIGN A
+1A62 ; Other_Alphabetic # Mn TAI THAM VOWEL SIGN MAI SAT
+1A63..1A64 ; Other_Alphabetic # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA
+1A65..1A6C ; Other_Alphabetic # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A6D..1A72 ; Other_Alphabetic # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1A73..1A74 ; Other_Alphabetic # Mn [2] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN MAI KANG
+1B00..1B03 ; Other_Alphabetic # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04 ; Other_Alphabetic # Mc BALINESE SIGN BISAH
+1B35 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; Other_Alphabetic # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B ; Other_Alphabetic # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; Other_Alphabetic # Mn BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41 ; Other_Alphabetic # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; Other_Alphabetic # Mn BALINESE VOWEL SIGN PEPET
+1B43 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN PEPET TEDUNG
+1B80..1B81 ; Other_Alphabetic # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82 ; Other_Alphabetic # Mc SUNDANESE SIGN PANGWISAD
+1BA1 ; Other_Alphabetic # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5 ; Other_Alphabetic # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7 ; Other_Alphabetic # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9 ; Other_Alphabetic # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1C24..1C2B ; Other_Alphabetic # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33 ; Other_Alphabetic # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35 ; Other_Alphabetic # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1CF2 ; Other_Alphabetic # Mc VEDIC SIGN ARDHAVISARGA
+24B6..24E9 ; Other_Alphabetic # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2DE0..2DFF ; Other_Alphabetic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+A823..A824 ; Other_Alphabetic # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826 ; Other_Alphabetic # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827 ; Other_Alphabetic # Mc SYLOTI NAGRI VOWEL SIGN OO
+A880..A881 ; Other_Alphabetic # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A8B4..A8C3 ; Other_Alphabetic # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A926..A92A ; Other_Alphabetic # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O
+A947..A951 ; Other_Alphabetic # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952 ; Other_Alphabetic # Mc REJANG CONSONANT SIGN H
+A980..A982 ; Other_Alphabetic # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A983 ; Other_Alphabetic # Mc JAVANESE SIGN WIGNYAN
+A9B3 ; Other_Alphabetic # Mn JAVANESE SIGN CECAK TELU
+A9B4..A9B5 ; Other_Alphabetic # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9B6..A9B9 ; Other_Alphabetic # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BA..A9BB ; Other_Alphabetic # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BC ; Other_Alphabetic # Mn JAVANESE VOWEL SIGN PEPET
+A9BD..A9BF ; Other_Alphabetic # Mc [3] JAVANESE CONSONANT SIGN KERET..JAVANESE CONSONANT SIGN CAKRA
+AA29..AA2E ; Other_Alphabetic # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30 ; Other_Alphabetic # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32 ; Other_Alphabetic # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34 ; Other_Alphabetic # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36 ; Other_Alphabetic # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA43 ; Other_Alphabetic # Mn CHAM CONSONANT SIGN FINAL NG
+AA4C ; Other_Alphabetic # Mn CHAM CONSONANT SIGN FINAL M
+AA4D ; Other_Alphabetic # Mc CHAM CONSONANT SIGN FINAL H
+AAB0 ; Other_Alphabetic # Mn TAI VIET MAI KANG
+AAB2..AAB4 ; Other_Alphabetic # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB7..AAB8 ; Other_Alphabetic # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AABE ; Other_Alphabetic # Mn TAI VIET VOWEL AM
+ABE3..ABE4 ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE5 ; Other_Alphabetic # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE6..ABE7 ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE8 ; Other_Alphabetic # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABE9..ABEA ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+10A01..10A03 ; Other_Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; Other_Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; Other_Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+11082 ; Other_Alphabetic # Mc KAITHI SIGN VISARGA
+110B0..110B2 ; Other_Alphabetic # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B3..110B6 ; Other_Alphabetic # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B7..110B8 ; Other_Alphabetic # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+
+# Total code points: 759
+
+# ================================================
+
+3006 ; Ideographic # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; Ideographic # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FCB ; Ideographic # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6D ; Ideographic # Lo [62] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; Ideographic # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 75408
+
+# ================================================
+
+005E ; Diacritic # Sk CIRCUMFLEX ACCENT
+0060 ; Diacritic # Sk GRAVE ACCENT
+00A8 ; Diacritic # Sk DIAERESIS
+00AF ; Diacritic # Sk MACRON
+00B4 ; Diacritic # Sk ACUTE ACCENT
+00B7 ; Diacritic # Po MIDDLE DOT
+00B8 ; Diacritic # Sk CEDILLA
+02B0..02C1 ; Diacritic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5 ; Diacritic # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1 ; Diacritic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF ; Diacritic # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E0..02E4 ; Diacritic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5..02EB ; Diacritic # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; Diacritic # Lm MODIFIER LETTER VOICING
+02ED ; Diacritic # Sk MODIFIER LETTER UNASPIRATED
+02EE ; Diacritic # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF ; Diacritic # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0300..034E ; Diacritic # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW
+0350..0357 ; Diacritic # Mn [8] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE
+035D..0362 ; Diacritic # Mn [6] COMBINING DOUBLE BREVE..COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0374 ; Diacritic # Lm GREEK NUMERAL SIGN
+0375 ; Diacritic # Sk GREEK LOWER NUMERAL SIGN
+037A ; Diacritic # Lm GREEK YPOGEGRAMMENI
+0384..0385 ; Diacritic # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS
+0483..0487 ; Diacritic # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0559 ; Diacritic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+0591..05A1 ; Diacritic # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER
+05A3..05BD ; Diacritic # Mn [27] HEBREW ACCENT MUNAH..HEBREW POINT METEG
+05BF ; Diacritic # Mn HEBREW POINT RAFE
+05C1..05C2 ; Diacritic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4 ; Diacritic # Mn HEBREW MARK UPPER DOT
+064B..0652 ; Diacritic # Mn [8] ARABIC FATHATAN..ARABIC SUKUN
+0657..0658 ; Diacritic # Mn [2] ARABIC INVERTED DAMMA..ARABIC MARK NOON GHUNNA
+06DF..06E0 ; Diacritic # Mn [2] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E5..06E6 ; Diacritic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06EA..06EC ; Diacritic # Mn [3] ARABIC EMPTY CENTRE LOW STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+0730..074A ; Diacritic # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0 ; Diacritic # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07EB..07F3 ; Diacritic # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5 ; Diacritic # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+0818..0819 ; Diacritic # Mn [2] SAMARITAN MARK OCCLUSION..SAMARITAN MARK DAGESH
+093C ; Diacritic # Mn DEVANAGARI SIGN NUKTA
+094D ; Diacritic # Mn DEVANAGARI SIGN VIRAMA
+0951..0954 ; Diacritic # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT
+0971 ; Diacritic # Lm DEVANAGARI SIGN HIGH SPACING DOT
+09BC ; Diacritic # Mn BENGALI SIGN NUKTA
+09CD ; Diacritic # Mn BENGALI SIGN VIRAMA
+0A3C ; Diacritic # Mn GURMUKHI SIGN NUKTA
+0A4D ; Diacritic # Mn GURMUKHI SIGN VIRAMA
+0ABC ; Diacritic # Mn GUJARATI SIGN NUKTA
+0ACD ; Diacritic # Mn GUJARATI SIGN VIRAMA
+0B3C ; Diacritic # Mn ORIYA SIGN NUKTA
+0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA
+0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA
+0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA
+0CBC ; Diacritic # Mn KANNADA SIGN NUKTA
+0CCD ; Diacritic # Mn KANNADA SIGN VIRAMA
+0D4D ; Diacritic # Mn MALAYALAM SIGN VIRAMA
+0DCA ; Diacritic # Mn SINHALA SIGN AL-LAKUNA
+0E47..0E4C ; Diacritic # Mn [6] THAI CHARACTER MAITAIKHU..THAI CHARACTER THANTHAKHAT
+0E4E ; Diacritic # Mn THAI CHARACTER YAMAKKAN
+0EC8..0ECC ; Diacritic # Mn [5] LAO TONE MAI EK..LAO CANCELLATION MARK
+0F18..0F19 ; Diacritic # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39 ; Diacritic # Mn TIBETAN MARK TSA -PHRU
+0F3E..0F3F ; Diacritic # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F82..0F84 ; Diacritic # Mn [3] TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA
+0F86..0F87 ; Diacritic # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0FC6 ; Diacritic # Mn TIBETAN SYMBOL PADMA GDAN
+1037 ; Diacritic # Mn MYANMAR SIGN DOT BELOW
+1039..103A ; Diacritic # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+1087..108C ; Diacritic # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108D ; Diacritic # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108F ; Diacritic # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
+109A..109B ; Diacritic # Mc [2] MYANMAR SIGN KHAMTI TONE-1..MYANMAR SIGN KHAMTI TONE-3
+17C9..17D3 ; Diacritic # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD ; Diacritic # Mn KHMER SIGN ATTHACAN
+1939..193B ; Diacritic # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1A75..1A7C ; Diacritic # Mn [8] TAI THAM SIGN TONE-1..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; Diacritic # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1B34 ; Diacritic # Mn BALINESE SIGN REREKAN
+1B44 ; Diacritic # Mc BALINESE ADEG ADEG
+1B6B..1B73 ; Diacritic # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1BAA ; Diacritic # Mc SUNDANESE SIGN PAMAAEH
+1C36..1C37 ; Diacritic # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C78..1C7D ; Diacritic # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1CD0..1CD2 ; Diacritic # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD3 ; Diacritic # Po VEDIC SIGN NIHSHVASA
+1CD4..1CE0 ; Diacritic # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE1 ; Diacritic # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CE2..1CE8 ; Diacritic # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CED ; Diacritic # Mn VEDIC SIGN TIRYAK
+1D2C..1D61 ; Diacritic # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D6A ; Diacritic # L& [9] LATIN SUBSCRIPT SMALL LETTER I..GREEK SUBSCRIPT SMALL LETTER CHI
+1DC4..1DCF ; Diacritic # Mn [12] COMBINING MACRON-ACUTE..COMBINING ZIGZAG BELOW
+1DFD..1DFF ; Diacritic # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1FBD ; Diacritic # Sk GREEK KORONIS
+1FBF..1FC1 ; Diacritic # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FCD..1FCF ; Diacritic # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FDD..1FDF ; Diacritic # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FED..1FEF ; Diacritic # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FFD..1FFE ; Diacritic # Sk [2] GREEK OXIA..GREEK DASIA
+2CEF..2CF1 ; Diacritic # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2E2F ; Diacritic # Lm VERTICAL TILDE
+302A..302F ; Diacritic # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A ; Diacritic # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B..309C ; Diacritic # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30FC ; Diacritic # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK
+A66F ; Diacritic # Mn COMBINING CYRILLIC VZMET
+A67C..A67D ; Diacritic # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67F ; Diacritic # Lm CYRILLIC PAYEROK
+A6F0..A6F1 ; Diacritic # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A717..A71F ; Diacritic # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720..A721 ; Diacritic # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+A788 ; Diacritic # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A8C4 ; Diacritic # Mn SAURASHTRA SIGN VIRAMA
+A8E0..A8F1 ; Diacritic # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A92B..A92D ; Diacritic # Mn [3] KAYAH LI TONE PLOPHU..KAYAH LI TONE CALYA PLOPHU
+A92E ; Diacritic # Po KAYAH LI SIGN CWI
+A953 ; Diacritic # Mc REJANG VIRAMA
+A9B3 ; Diacritic # Mn JAVANESE SIGN CECAK TELU
+A9C0 ; Diacritic # Mc JAVANESE PANGKON
+AA7B ; Diacritic # Mc MYANMAR SIGN PAO KAREN TONE
+AABF ; Diacritic # Mn TAI VIET TONE MAI EK
+AAC0 ; Diacritic # Lo TAI VIET TONE MAI NUENG
+AAC1 ; Diacritic # Mn TAI VIET TONE MAI THO
+AAC2 ; Diacritic # Lo TAI VIET TONE MAI SONG
+ABEC ; Diacritic # Mc MEETEI MAYEK LUM IYEK
+ABED ; Diacritic # Mn MEETEI MAYEK APUN IYEK
+FB1E ; Diacritic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FE20..FE26 ; Diacritic # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+FF3E ; Diacritic # Sk FULLWIDTH CIRCUMFLEX ACCENT
+FF40 ; Diacritic # Sk FULLWIDTH GRAVE ACCENT
+FF70 ; Diacritic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFE3 ; Diacritic # Sk FULLWIDTH MACRON
+110B9..110BA ; Diacritic # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+1D167..1D169 ; Diacritic # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16D..1D172 ; Diacritic # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D17B..1D182 ; Diacritic # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+
+# Total code points: 639
+
+# ================================================
+
+00B7 ; Extender # Po MIDDLE DOT
+02D0..02D1 ; Extender # Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON
+0640 ; Extender # Lm ARABIC TATWEEL
+07FA ; Extender # Lm NKO LAJANYALAN
+0E46 ; Extender # Lm THAI CHARACTER MAIYAMOK
+0EC6 ; Extender # Lm LAO KO LA
+1843 ; Extender # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1AA7 ; Extender # Lm TAI THAM SIGN MAI YAMOK
+1C36 ; Extender # Mn LEPCHA SIGN RAN
+1C7B ; Extender # Lm OL CHIKI RELAA
+3005 ; Extender # Lm IDEOGRAPHIC ITERATION MARK
+3031..3035 ; Extender # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+309D..309E ; Extender # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+30FC..30FE ; Extender # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+A015 ; Extender # Lm YI SYLLABLE WU
+A60C ; Extender # Lm VAI SYLLABLE LENGTHENER
+A9CF ; Extender # Lm JAVANESE PANGRANGKEP
+AA70 ; Extender # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AADD ; Extender # Lm TAI VIET SYMBOL SAM
+FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+
+# Total code points: 28
+
+# ================================================
+
+02B0..02B8 ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02C0..02C1 ; Other_Lowercase # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP
+02E0..02E4 ; Other_Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+0345 ; Other_Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI
+037A ; Other_Lowercase # Lm GREEK YPOGEGRAMMENI
+1D2C..1D61 ; Other_Lowercase # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D78 ; Other_Lowercase # Lm MODIFIER LETTER CYRILLIC EN
+1D9B..1DBF ; Other_Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+2090..2094 ; Other_Lowercase # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+2170..217F ; Other_Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+24D0..24E9 ; Other_Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2C7D ; Other_Lowercase # Lm MODIFIER LETTER CAPITAL V
+A770 ; Other_Lowercase # Lm MODIFIER LETTER US
+
+# Total code points: 159
+
+# ================================================
+
+2160..216F ; Other_Uppercase # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND
+24B6..24CF ; Other_Uppercase # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z
+
+# Total code points: 42
+
+# ================================================
+
+FDD0..FDEF ; Noncharacter_Code_Point # Cn [32] <noncharacter-FDD0>..<noncharacter-FDEF>
+FFFE..FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-FFFE>..<noncharacter-FFFF>
+1FFFE..1FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-1FFFE>..<noncharacter-1FFFF>
+2FFFE..2FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-2FFFE>..<noncharacter-2FFFF>
+3FFFE..3FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-3FFFE>..<noncharacter-3FFFF>
+4FFFE..4FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-4FFFE>..<noncharacter-4FFFF>
+5FFFE..5FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-5FFFE>..<noncharacter-5FFFF>
+6FFFE..6FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-6FFFE>..<noncharacter-6FFFF>
+7FFFE..7FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-7FFFE>..<noncharacter-7FFFF>
+8FFFE..8FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-8FFFE>..<noncharacter-8FFFF>
+9FFFE..9FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-9FFFE>..<noncharacter-9FFFF>
+AFFFE..AFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-AFFFE>..<noncharacter-AFFFF>
+BFFFE..BFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-BFFFE>..<noncharacter-BFFFF>
+CFFFE..CFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-CFFFE>..<noncharacter-CFFFF>
+DFFFE..DFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-DFFFE>..<noncharacter-DFFFF>
+EFFFE..EFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-EFFFE>..<noncharacter-EFFFF>
+FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF>
+10FFFE..10FFFF; Noncharacter_Code_Point # Cn [2] <noncharacter-10FFFE>..<noncharacter-10FFFF>
+
+# Total code points: 66
+
+# ================================================
+
+09BE ; Other_Grapheme_Extend # Mc BENGALI VOWEL SIGN AA
+09D7 ; Other_Grapheme_Extend # Mc BENGALI AU LENGTH MARK
+0B3E ; Other_Grapheme_Extend # Mc ORIYA VOWEL SIGN AA
+0B57 ; Other_Grapheme_Extend # Mc ORIYA AU LENGTH MARK
+0BBE ; Other_Grapheme_Extend # Mc TAMIL VOWEL SIGN AA
+0BD7 ; Other_Grapheme_Extend # Mc TAMIL AU LENGTH MARK
+0CC2 ; Other_Grapheme_Extend # Mc KANNADA VOWEL SIGN UU
+0CD5..0CD6 ; Other_Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0D3E ; Other_Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA
+0D57 ; Other_Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK
+0DCF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA
+0DDF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA
+200C..200D ; Other_Grapheme_Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+1D165 ; Other_Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM
+1D16E..1D172 ; Other_Grapheme_Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5
+
+# Total code points: 23
+
+# ================================================
+
+2FF0..2FF1 ; IDS_Binary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF4..2FFB ; IDS_Binary_Operator # So [8] IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+
+# Total code points: 10
+
+# ================================================
+
+2FF2..2FF3 ; IDS_Trinary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+
+# Total code points: 2
+
+# ================================================
+
+2E80..2E99 ; Radical # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3 ; Radical # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5 ; Radical # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+
+# Total code points: 329
+
+# ================================================
+
+3400..4DB5 ; Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FCB ; Unified_Ideograph # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11
+FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
+FA1F ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA21 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA21
+FA23..FA24 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24
+FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29
+20000..2A6D6 ; Unified_Ideograph # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; Unified_Ideograph # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+
+# Total code points: 74394
+
+# ================================================
+
+034F ; Other_Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER
+115F..1160 ; Other_Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
+2065..2069 ; Other_Default_Ignorable_Code_Point # Cn [5] <reserved-2065>..<reserved-2069>
+3164 ; Other_Default_Ignorable_Code_Point # Lo HANGUL FILLER
+FFA0 ; Other_Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER
+FFF0..FFF8 ; Other_Default_Ignorable_Code_Point # Cn [9] <reserved-FFF0>..<reserved-FFF8>
+E0000 ; Other_Default_Ignorable_Code_Point # Cn <reserved-E0000>
+E0002..E001F ; Other_Default_Ignorable_Code_Point # Cn [30] <reserved-E0002>..<reserved-E001F>
+E0080..E00FF ; Other_Default_Ignorable_Code_Point # Cn [128] <reserved-E0080>..<reserved-E00FF>
+E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+
+# Total code points: 3778
+
+# ================================================
+
+0149 ; Deprecated # L& LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0F77 ; Deprecated # Mn TIBETAN VOWEL SIGN VOCALIC RR
+0F79 ; Deprecated # Mn TIBETAN VOWEL SIGN VOCALIC LL
+17A3..17A4 ; Deprecated # Lo [2] KHMER INDEPENDENT VOWEL QAQ..KHMER INDEPENDENT VOWEL QAA
+206A..206F ; Deprecated # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+2329 ; Deprecated # Ps LEFT-POINTING ANGLE BRACKET
+232A ; Deprecated # Pe RIGHT-POINTING ANGLE BRACKET
+E0001 ; Deprecated # Cf LANGUAGE TAG
+E0020..E007F ; Deprecated # Cf [96] TAG SPACE..CANCEL TAG
+
+# Total code points: 110
+
+# ================================================
+
+0069..006A ; Soft_Dotted # L& [2] LATIN SMALL LETTER I..LATIN SMALL LETTER J
+012F ; Soft_Dotted # L& LATIN SMALL LETTER I WITH OGONEK
+0249 ; Soft_Dotted # L& LATIN SMALL LETTER J WITH STROKE
+0268 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE
+029D ; Soft_Dotted # L& LATIN SMALL LETTER J WITH CROSSED-TAIL
+02B2 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J
+03F3 ; Soft_Dotted # L& GREEK LETTER YOT
+0456 ; Soft_Dotted # L& CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0458 ; Soft_Dotted # L& CYRILLIC SMALL LETTER JE
+1D62 ; Soft_Dotted # L& LATIN SUBSCRIPT SMALL LETTER I
+1D96 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1DA4 ; Soft_Dotted # Lm MODIFIER LETTER SMALL I WITH STROKE
+1DA8 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1E2D ; Soft_Dotted # L& LATIN SMALL LETTER I WITH TILDE BELOW
+1ECB ; Soft_Dotted # L& LATIN SMALL LETTER I WITH DOT BELOW
+2071 ; Soft_Dotted # Lm SUPERSCRIPT LATIN SMALL LETTER I
+2148..2149 ; Soft_Dotted # L& [2] DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J
+2C7C ; Soft_Dotted # L& LATIN SUBSCRIPT SMALL LETTER J
+1D422..1D423 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J
+1D456..1D457 ; Soft_Dotted # L& [2] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J
+1D48A..1D48B ; Soft_Dotted # L& [2] MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J
+1D4BE..1D4BF ; Soft_Dotted # L& [2] MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J
+1D4F2..1D4F3 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J
+1D526..1D527 ; Soft_Dotted # L& [2] MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J
+1D55A..1D55B ; Soft_Dotted # L& [2] MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D58E..1D58F ; Soft_Dotted # L& [2] MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J
+1D5C2..1D5C3 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J
+1D5F6..1D5F7 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D62A..1D62B ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J
+
+# Total code points: 46
+
+# ================================================
+
+0E40..0E44 ; Logical_Order_Exception # Lo [5] THAI CHARACTER SARA E..THAI CHARACTER SARA AI MAIMALAI
+0EC0..0EC4 ; Logical_Order_Exception # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+AAB5..AAB6 ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB9 ; Logical_Order_Exception # Lo TAI VIET VOWEL UEA
+AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET VOWEL AY
+
+# Total code points: 15
+
+# ================================================
+
+2118 ; Other_ID_Start # So SCRIPT CAPITAL P
+212E ; Other_ID_Start # So ESTIMATED SYMBOL
+309B..309C ; Other_ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+
+# Total code points: 4
+
+# ================================================
+
+00B7 ; Other_ID_Continue # Po MIDDLE DOT
+0387 ; Other_ID_Continue # Po GREEK ANO TELEIA
+1369..1371 ; Other_ID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE
+
+# Total code points: 11
+
+# ================================================
+
+0021 ; STerm # Po EXCLAMATION MARK
+002E ; STerm # Po FULL STOP
+003F ; STerm # Po QUESTION MARK
+055C ; STerm # Po ARMENIAN EXCLAMATION MARK
+055E ; STerm # Po ARMENIAN QUESTION MARK
+0589 ; STerm # Po ARMENIAN FULL STOP
+061F ; STerm # Po ARABIC QUESTION MARK
+06D4 ; STerm # Po ARABIC FULL STOP
+0700..0702 ; STerm # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
+07F9 ; STerm # Po NKO EXCLAMATION MARK
+0964..0965 ; STerm # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+104A..104B ; STerm # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
+1362 ; STerm # Po ETHIOPIC FULL STOP
+1367..1368 ; STerm # Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR
+166E ; STerm # Po CANADIAN SYLLABICS FULL STOP
+1803 ; STerm # Po MONGOLIAN FULL STOP
+1809 ; STerm # Po MONGOLIAN MANCHU FULL STOP
+1944..1945 ; STerm # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1B5A..1B5B ; STerm # Po [2] BALINESE PANTI..BALINESE PAMADA
+1B5E..1B5F ; STerm # Po [2] BALINESE CARIK SIKI..BALINESE CARIK PAREREN
+1C3B..1C3C ; STerm # Po [2] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION NYET THYOOM TA-ROL
+1C7E..1C7F ; STerm # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+203C..203D ; STerm # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG
+2047..2049 ; STerm # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
+2E2E ; STerm # Po REVERSED QUESTION MARK
+3002 ; STerm # Po IDEOGRAPHIC FULL STOP
+A4FF ; STerm # Po LISU PUNCTUATION FULL STOP
+A60E..A60F ; STerm # Po [2] VAI FULL STOP..VAI QUESTION MARK
+A6F3 ; STerm # Po BAMUM FULL STOP
+A6F7 ; STerm # Po BAMUM QUESTION MARK
+A876..A877 ; STerm # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD
+A8CE..A8CF ; STerm # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A92F ; STerm # Po KAYAH LI SIGN SHYA
+A9C8..A9C9 ; STerm # Po [2] JAVANESE PADA LINGSA..JAVANESE PADA LUNGSI
+AA5D..AA5F ; STerm # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA
+ABEB ; STerm # Po MEETEI MAYEK CHEIKHEI
+FE52 ; STerm # Po SMALL FULL STOP
+FE56..FE57 ; STerm # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK
+FF01 ; STerm # Po FULLWIDTH EXCLAMATION MARK
+FF0E ; STerm # Po FULLWIDTH FULL STOP
+FF1F ; STerm # Po FULLWIDTH QUESTION MARK
+FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP
+110BE..110C1 ; STerm # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
+
+# Total code points: 66
+
+# ================================================
+
+180B..180D ; Variation_Selector # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+FE00..FE0F ; Variation_Selector # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 259
+
+# ================================================
+
+0009..000D ; Pattern_White_Space # Cc [5] <control-0009>..<control-000D>
+0020 ; Pattern_White_Space # Zs SPACE
+0085 ; Pattern_White_Space # Cc <control-0085>
+200E..200F ; Pattern_White_Space # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2028 ; Pattern_White_Space # Zl LINE SEPARATOR
+2029 ; Pattern_White_Space # Zp PARAGRAPH SEPARATOR
+
+# Total code points: 11
+
+# ================================================
+
+0021..0023 ; Pattern_Syntax # Po [3] EXCLAMATION MARK..NUMBER SIGN
+0024 ; Pattern_Syntax # Sc DOLLAR SIGN
+0025..0027 ; Pattern_Syntax # Po [3] PERCENT SIGN..APOSTROPHE
+0028 ; Pattern_Syntax # Ps LEFT PARENTHESIS
+0029 ; Pattern_Syntax # Pe RIGHT PARENTHESIS
+002A ; Pattern_Syntax # Po ASTERISK
+002B ; Pattern_Syntax # Sm PLUS SIGN
+002C ; Pattern_Syntax # Po COMMA
+002D ; Pattern_Syntax # Pd HYPHEN-MINUS
+002E..002F ; Pattern_Syntax # Po [2] FULL STOP..SOLIDUS
+003A..003B ; Pattern_Syntax # Po [2] COLON..SEMICOLON
+003C..003E ; Pattern_Syntax # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040 ; Pattern_Syntax # Po [2] QUESTION MARK..COMMERCIAL AT
+005B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET
+005C ; Pattern_Syntax # Po REVERSE SOLIDUS
+005D ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET
+005E ; Pattern_Syntax # Sk CIRCUMFLEX ACCENT
+0060 ; Pattern_Syntax # Sk GRAVE ACCENT
+007B ; Pattern_Syntax # Ps LEFT CURLY BRACKET
+007C ; Pattern_Syntax # Sm VERTICAL LINE
+007D ; Pattern_Syntax # Pe RIGHT CURLY BRACKET
+007E ; Pattern_Syntax # Sm TILDE
+00A1 ; Pattern_Syntax # Po INVERTED EXCLAMATION MARK
+00A2..00A5 ; Pattern_Syntax # Sc [4] CENT SIGN..YEN SIGN
+00A6..00A7 ; Pattern_Syntax # So [2] BROKEN BAR..SECTION SIGN
+00A9 ; Pattern_Syntax # So COPYRIGHT SIGN
+00AB ; Pattern_Syntax # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; Pattern_Syntax # Sm NOT SIGN
+00AE ; Pattern_Syntax # So REGISTERED SIGN
+00B0 ; Pattern_Syntax # So DEGREE SIGN
+00B1 ; Pattern_Syntax # Sm PLUS-MINUS SIGN
+00B6 ; Pattern_Syntax # So PILCROW SIGN
+00BB ; Pattern_Syntax # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF ; Pattern_Syntax # Po INVERTED QUESTION MARK
+00D7 ; Pattern_Syntax # Sm MULTIPLICATION SIGN
+00F7 ; Pattern_Syntax # Sm DIVISION SIGN
+2010..2015 ; Pattern_Syntax # Pd [6] HYPHEN..HORIZONTAL BAR
+2016..2017 ; Pattern_Syntax # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018 ; Pattern_Syntax # Pi LEFT SINGLE QUOTATION MARK
+2019 ; Pattern_Syntax # Pf RIGHT SINGLE QUOTATION MARK
+201A ; Pattern_Syntax # Ps SINGLE LOW-9 QUOTATION MARK
+201B..201C ; Pattern_Syntax # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D ; Pattern_Syntax # Pf RIGHT DOUBLE QUOTATION MARK
+201E ; Pattern_Syntax # Ps DOUBLE LOW-9 QUOTATION MARK
+201F ; Pattern_Syntax # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027 ; Pattern_Syntax # Po [8] DAGGER..HYPHENATION POINT
+2030..2038 ; Pattern_Syntax # Po [9] PER MILLE SIGN..CARET
+2039 ; Pattern_Syntax # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; Pattern_Syntax # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E ; Pattern_Syntax # Po [4] REFERENCE MARK..OVERLINE
+2041..2043 ; Pattern_Syntax # Po [3] CARET INSERTION POINT..HYPHEN BULLET
+2044 ; Pattern_Syntax # Sm FRACTION SLASH
+2045 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH QUILL
+2046 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH QUILL
+2047..2051 ; Pattern_Syntax # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; Pattern_Syntax # Sm COMMERCIAL MINUS SIGN
+2053 ; Pattern_Syntax # Po SWUNG DASH
+2055..205E ; Pattern_Syntax # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+2190..2194 ; Pattern_Syntax # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199 ; Pattern_Syntax # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B ; Pattern_Syntax # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F ; Pattern_Syntax # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0 ; Pattern_Syntax # Sm RIGHTWARDS TWO HEADED ARROW
+21A1..21A2 ; Pattern_Syntax # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3 ; Pattern_Syntax # Sm RIGHTWARDS ARROW WITH TAIL
+21A4..21A5 ; Pattern_Syntax # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6 ; Pattern_Syntax # Sm RIGHTWARDS ARROW FROM BAR
+21A7..21AD ; Pattern_Syntax # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE ; Pattern_Syntax # Sm LEFT RIGHT ARROW WITH STROKE
+21AF..21CD ; Pattern_Syntax # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF ; Pattern_Syntax # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; Pattern_Syntax # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2 ; Pattern_Syntax # Sm RIGHTWARDS DOUBLE ARROW
+21D3 ; Pattern_Syntax # So DOWNWARDS DOUBLE ARROW
+21D4 ; Pattern_Syntax # Sm LEFT RIGHT DOUBLE ARROW
+21D5..21F3 ; Pattern_Syntax # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..22FF ; Pattern_Syntax # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2300..2307 ; Pattern_Syntax # So [8] DIAMETER SIGN..WAVY LINE
+2308..230B ; Pattern_Syntax # Sm [4] LEFT CEILING..RIGHT FLOOR
+230C..231F ; Pattern_Syntax # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321 ; Pattern_Syntax # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328 ; Pattern_Syntax # So [7] FROWN..KEYBOARD
+2329 ; Pattern_Syntax # Ps LEFT-POINTING ANGLE BRACKET
+232A ; Pattern_Syntax # Pe RIGHT-POINTING ANGLE BRACKET
+232B..237B ; Pattern_Syntax # So [81] ERASE TO THE LEFT..NOT CHECK MARK
+237C ; Pattern_Syntax # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A ; Pattern_Syntax # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3 ; Pattern_Syntax # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4..23DB ; Pattern_Syntax # So [40] TOP SQUARE BRACKET..FUSE
+23DC..23E1 ; Pattern_Syntax # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
+23E2..23E8 ; Pattern_Syntax # So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL
+23E9..23FF ; Pattern_Syntax # Cn [23] <reserved-23E9>..<reserved-23FF>
+2400..2426 ; Pattern_Syntax # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2427..243F ; Pattern_Syntax # Cn [25] <reserved-2427>..<reserved-243F>
+2440..244A ; Pattern_Syntax # So [11] OCR HOOK..OCR DOUBLE BACKSLASH
+244B..245F ; Pattern_Syntax # Cn [21] <reserved-244B>..<reserved-245F>
+2500..25B6 ; Pattern_Syntax # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7 ; Pattern_Syntax # Sm WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0 ; Pattern_Syntax # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1 ; Pattern_Syntax # Sm WHITE LEFT-POINTING TRIANGLE
+25C2..25F7 ; Pattern_Syntax # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF ; Pattern_Syntax # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..266E ; Pattern_Syntax # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
+266F ; Pattern_Syntax # Sm MUSIC SHARP SIGN
+2670..26CD ; Pattern_Syntax # So [94] WEST SYRIAC CROSS..DISABLED CAR
+26CE ; Pattern_Syntax # Cn <reserved-26CE>
+26CF..26E1 ; Pattern_Syntax # So [19] PICK..RESTRICTED LEFT ENTRY-2
+26E2 ; Pattern_Syntax # Cn <reserved-26E2>
+26E3 ; Pattern_Syntax # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
+26E4..26E7 ; Pattern_Syntax # Cn [4] <reserved-26E4>..<reserved-26E7>
+26E8..26FF ; Pattern_Syntax # So [24] BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+2700 ; Pattern_Syntax # Cn <reserved-2700>
+2701..2704 ; Pattern_Syntax # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2705 ; Pattern_Syntax # Cn <reserved-2705>
+2706..2709 ; Pattern_Syntax # So [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270A..270B ; Pattern_Syntax # Cn [2] <reserved-270A>..<reserved-270B>
+270C..2727 ; Pattern_Syntax # So [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2728 ; Pattern_Syntax # Cn <reserved-2728>
+2729..274B ; Pattern_Syntax # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274C ; Pattern_Syntax # Cn <reserved-274C>
+274D ; Pattern_Syntax # So SHADOWED WHITE CIRCLE
+274E ; Pattern_Syntax # Cn <reserved-274E>
+274F..2752 ; Pattern_Syntax # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2753..2755 ; Pattern_Syntax # Cn [3] <reserved-2753>..<reserved-2755>
+2756..275E ; Pattern_Syntax # So [9] BLACK DIAMOND MINUS WHITE X..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+275F..2760 ; Pattern_Syntax # Cn [2] <reserved-275F>..<reserved-2760>
+2761..2767 ; Pattern_Syntax # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768 ; Pattern_Syntax # Ps MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; Pattern_Syntax # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; Pattern_Syntax # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; Pattern_Syntax # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; Pattern_Syntax # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; Pattern_Syntax # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; Pattern_Syntax # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; Pattern_Syntax # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; Pattern_Syntax # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; Pattern_Syntax # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2794 ; Pattern_Syntax # So HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2795..2797 ; Pattern_Syntax # Cn [3] <reserved-2795>..<reserved-2797>
+2798..27AF ; Pattern_Syntax # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B0 ; Pattern_Syntax # Cn <reserved-27B0>
+27B1..27BE ; Pattern_Syntax # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27BF ; Pattern_Syntax # Cn <reserved-27BF>
+27C0..27C4 ; Pattern_Syntax # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5 ; Pattern_Syntax # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; Pattern_Syntax # Pe RIGHT S-SHAPED BAG DELIMITER
+27C7..27CA ; Pattern_Syntax # Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
+27CB ; Pattern_Syntax # Cn <reserved-27CB>
+27CC ; Pattern_Syntax # Sm LONG DIVISION
+27CD..27CF ; Pattern_Syntax # Cn [3] <reserved-27CD>..<reserved-27CF>
+27D0..27E5 ; Pattern_Syntax # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; Pattern_Syntax # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; Pattern_Syntax # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; Pattern_Syntax # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; Pattern_Syntax # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; Pattern_Syntax # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0..27FF ; Pattern_Syntax # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2800..28FF ; Pattern_Syntax # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+2900..2982 ; Pattern_Syntax # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983 ; Pattern_Syntax # Ps LEFT WHITE CURLY BRACKET
+2984 ; Pattern_Syntax # Pe RIGHT WHITE CURLY BRACKET
+2985 ; Pattern_Syntax # Ps LEFT WHITE PARENTHESIS
+2986 ; Pattern_Syntax # Pe RIGHT WHITE PARENTHESIS
+2987 ; Pattern_Syntax # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; Pattern_Syntax # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; Pattern_Syntax # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; Pattern_Syntax # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; Pattern_Syntax # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; Pattern_Syntax # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; Pattern_Syntax # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; Pattern_Syntax # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; Pattern_Syntax # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; Pattern_Syntax # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7 ; Pattern_Syntax # Sm [63] DOTTED FENCE..BLACK HOURGLASS
+29D8 ; Pattern_Syntax # Ps LEFT WIGGLY FENCE
+29D9 ; Pattern_Syntax # Pe RIGHT WIGGLY FENCE
+29DA ; Pattern_Syntax # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; Pattern_Syntax # Pe RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB ; Pattern_Syntax # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC ; Pattern_Syntax # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; Pattern_Syntax # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF ; Pattern_Syntax # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B2F ; Pattern_Syntax # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE
+2B30..2B44 ; Pattern_Syntax # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET
+2B45..2B46 ; Pattern_Syntax # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW
+2B47..2B4C ; Pattern_Syntax # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4D..2B4F ; Pattern_Syntax # Cn [3] <reserved-2B4D>..<reserved-2B4F>
+2B50..2B59 ; Pattern_Syntax # So [10] WHITE MEDIUM STAR..HEAVY CIRCLED SALTIRE
+2B5A..2BFF ; Pattern_Syntax # Cn [166] <reserved-2B5A>..<reserved-2BFF>
+2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET
+2E03 ; Pattern_Syntax # Pf RIGHT SUBSTITUTION BRACKET
+2E04 ; Pattern_Syntax # Pi LEFT DOTTED SUBSTITUTION BRACKET
+2E05 ; Pattern_Syntax # Pf RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08 ; Pattern_Syntax # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09 ; Pattern_Syntax # Pi LEFT TRANSPOSITION BRACKET
+2E0A ; Pattern_Syntax # Pf RIGHT TRANSPOSITION BRACKET
+2E0B ; Pattern_Syntax # Po RAISED SQUARE
+2E0C ; Pattern_Syntax # Pi LEFT RAISED OMISSION BRACKET
+2E0D ; Pattern_Syntax # Pf RIGHT RAISED OMISSION BRACKET
+2E0E..2E16 ; Pattern_Syntax # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17 ; Pattern_Syntax # Pd DOUBLE OBLIQUE HYPHEN
+2E18..2E19 ; Pattern_Syntax # Po [2] INVERTED INTERROBANG..PALM BRANCH
+2E1A ; Pattern_Syntax # Pd HYPHEN WITH DIAERESIS
+2E1B ; Pattern_Syntax # Po TILDE WITH RING ABOVE
+2E1C ; Pattern_Syntax # Pi LEFT LOW PARAPHRASE BRACKET
+2E1D ; Pattern_Syntax # Pf RIGHT LOW PARAPHRASE BRACKET
+2E1E..2E1F ; Pattern_Syntax # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW
+2E20 ; Pattern_Syntax # Pi LEFT VERTICAL BAR WITH QUILL
+2E21 ; Pattern_Syntax # Pf RIGHT VERTICAL BAR WITH QUILL
+2E22 ; Pattern_Syntax # Ps TOP LEFT HALF BRACKET
+2E23 ; Pattern_Syntax # Pe TOP RIGHT HALF BRACKET
+2E24 ; Pattern_Syntax # Ps BOTTOM LEFT HALF BRACKET
+2E25 ; Pattern_Syntax # Pe BOTTOM RIGHT HALF BRACKET
+2E26 ; Pattern_Syntax # Ps LEFT SIDEWAYS U BRACKET
+2E27 ; Pattern_Syntax # Pe RIGHT SIDEWAYS U BRACKET
+2E28 ; Pattern_Syntax # Ps LEFT DOUBLE PARENTHESIS
+2E29 ; Pattern_Syntax # Pe RIGHT DOUBLE PARENTHESIS
+2E2A..2E2E ; Pattern_Syntax # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK
+2E2F ; Pattern_Syntax # Lm VERTICAL TILDE
+2E30..2E31 ; Pattern_Syntax # Po [2] RING POINT..WORD SEPARATOR MIDDLE DOT
+2E32..2E7F ; Pattern_Syntax # Cn [78] <reserved-2E32>..<reserved-2E7F>
+3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
+3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET
+3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET
+300A ; Pattern_Syntax # Ps LEFT DOUBLE ANGLE BRACKET
+300B ; Pattern_Syntax # Pe RIGHT DOUBLE ANGLE BRACKET
+300C ; Pattern_Syntax # Ps LEFT CORNER BRACKET
+300D ; Pattern_Syntax # Pe RIGHT CORNER BRACKET
+300E ; Pattern_Syntax # Ps LEFT WHITE CORNER BRACKET
+300F ; Pattern_Syntax # Pe RIGHT WHITE CORNER BRACKET
+3010 ; Pattern_Syntax # Ps LEFT BLACK LENTICULAR BRACKET
+3011 ; Pattern_Syntax # Pe RIGHT BLACK LENTICULAR BRACKET
+3012..3013 ; Pattern_Syntax # So [2] POSTAL MARK..GETA MARK
+3014 ; Pattern_Syntax # Ps LEFT TORTOISE SHELL BRACKET
+3015 ; Pattern_Syntax # Pe RIGHT TORTOISE SHELL BRACKET
+3016 ; Pattern_Syntax # Ps LEFT WHITE LENTICULAR BRACKET
+3017 ; Pattern_Syntax # Pe RIGHT WHITE LENTICULAR BRACKET
+3018 ; Pattern_Syntax # Ps LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; Pattern_Syntax # Pe RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; Pattern_Syntax # Ps LEFT WHITE SQUARE BRACKET
+301B ; Pattern_Syntax # Pe RIGHT WHITE SQUARE BRACKET
+301C ; Pattern_Syntax # Pd WAVE DASH
+301D ; Pattern_Syntax # Ps REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F ; Pattern_Syntax # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020 ; Pattern_Syntax # So POSTAL MARK FACE
+3030 ; Pattern_Syntax # Pd WAVY DASH
+FD3E ; Pattern_Syntax # Ps ORNATE LEFT PARENTHESIS
+FD3F ; Pattern_Syntax # Pe ORNATE RIGHT PARENTHESIS
+FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT
+
+# Total code points: 2760
+
+# EOF
diff --git a/boost/spirit/home/support/char_encoding/unicode/Scripts.txt b/boost/spirit/home/support/char_encoding/unicode/Scripts.txt
new file mode 100644
index 0000000000..3ecf0082c3
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/Scripts.txt
@@ -0,0 +1,1976 @@
+# Scripts-5.2.0.txt
+# Date: 2009-08-22, 04:58:43 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2009 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see http://www.unicode.org/reports/tr44/
+
+# It is ok to redistribute this file "solely for informational
+# purposes in the creation of products supporting the Unicode Standard".
+# We don't nee to add a Boost License to this file: boostinspect:nolicense.
+
+# ================================================
+
+# Property: Script
+
+# All code points not explicitly listed for Script
+# have the value Unknown (Zzzz).
+
+# @missing: 0000..10FFFF; Unknown
+
+# ================================================
+
+0000..001F ; Common # Cc [32] <control-0000>..<control-001F>
+0020 ; Common # Zs SPACE
+0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN
+0024 ; Common # Sc DOLLAR SIGN
+0025..0027 ; Common # Po [3] PERCENT SIGN..APOSTROPHE
+0028 ; Common # Ps LEFT PARENTHESIS
+0029 ; Common # Pe RIGHT PARENTHESIS
+002A ; Common # Po ASTERISK
+002B ; Common # Sm PLUS SIGN
+002C ; Common # Po COMMA
+002D ; Common # Pd HYPHEN-MINUS
+002E..002F ; Common # Po [2] FULL STOP..SOLIDUS
+0030..0039 ; Common # Nd [10] DIGIT ZERO..DIGIT NINE
+003A..003B ; Common # Po [2] COLON..SEMICOLON
+003C..003E ; Common # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040 ; Common # Po [2] QUESTION MARK..COMMERCIAL AT
+005B ; Common # Ps LEFT SQUARE BRACKET
+005C ; Common # Po REVERSE SOLIDUS
+005D ; Common # Pe RIGHT SQUARE BRACKET
+005E ; Common # Sk CIRCUMFLEX ACCENT
+005F ; Common # Pc LOW LINE
+0060 ; Common # Sk GRAVE ACCENT
+007B ; Common # Ps LEFT CURLY BRACKET
+007C ; Common # Sm VERTICAL LINE
+007D ; Common # Pe RIGHT CURLY BRACKET
+007E ; Common # Sm TILDE
+007F..009F ; Common # Cc [33] <control-007F>..<control-009F>
+00A0 ; Common # Zs NO-BREAK SPACE
+00A1 ; Common # Po INVERTED EXCLAMATION MARK
+00A2..00A5 ; Common # Sc [4] CENT SIGN..YEN SIGN
+00A6..00A7 ; Common # So [2] BROKEN BAR..SECTION SIGN
+00A8 ; Common # Sk DIAERESIS
+00A9 ; Common # So COPYRIGHT SIGN
+00AB ; Common # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; Common # Sm NOT SIGN
+00AD ; Common # Cf SOFT HYPHEN
+00AE ; Common # So REGISTERED SIGN
+00AF ; Common # Sk MACRON
+00B0 ; Common # So DEGREE SIGN
+00B1 ; Common # Sm PLUS-MINUS SIGN
+00B2..00B3 ; Common # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
+00B4 ; Common # Sk ACUTE ACCENT
+00B5 ; Common # L& MICRO SIGN
+00B6 ; Common # So PILCROW SIGN
+00B7 ; Common # Po MIDDLE DOT
+00B8 ; Common # Sk CEDILLA
+00B9 ; Common # No SUPERSCRIPT ONE
+00BB ; Common # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC..00BE ; Common # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
+00BF ; Common # Po INVERTED QUESTION MARK
+00D7 ; Common # Sm MULTIPLICATION SIGN
+00F7 ; Common # Sm DIVISION SIGN
+02B9..02C1 ; Common # Lm [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5 ; Common # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1 ; Common # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF ; Common # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E5..02EB ; Common # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; Common # Lm MODIFIER LETTER VOICING
+02ED ; Common # Sk MODIFIER LETTER UNASPIRATED
+02EE ; Common # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF ; Common # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0374 ; Common # Lm GREEK NUMERAL SIGN
+037E ; Common # Po GREEK QUESTION MARK
+0385 ; Common # Sk GREEK DIALYTIKA TONOS
+0387 ; Common # Po GREEK ANO TELEIA
+0589 ; Common # Po ARMENIAN FULL STOP
+0600..0603 ; Common # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
+060C ; Common # Po ARABIC COMMA
+061B ; Common # Po ARABIC SEMICOLON
+061F ; Common # Po ARABIC QUESTION MARK
+0640 ; Common # Lm ARABIC TATWEEL
+0660..0669 ; Common # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+06DD ; Common # Cf ARABIC END OF AYAH
+0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0970 ; Common # Po DEVANAGARI ABBREVIATION SIGN
+0CF1..0CF2 ; Common # So [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT
+0FD5..0FD8 ; Common # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS
+10FB ; Common # Po GEORGIAN PARAGRAPH SEPARATOR
+16EB..16ED ; Common # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+1735..1736 ; Common # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+1802..1803 ; Common # Po [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP
+1805 ; Common # Po MONGOLIAN FOUR DOTS
+1CD3 ; Common # Po VEDIC SIGN NIHSHVASA
+1CE1 ; Common # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CE9..1CEC ; Common # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL
+1CEE..1CF1 ; Common # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA
+1CF2 ; Common # Mc VEDIC SIGN ARDHAVISARGA
+2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE
+200B ; Common # Cf ZERO WIDTH SPACE
+200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2010..2015 ; Common # Pd [6] HYPHEN..HORIZONTAL BAR
+2016..2017 ; Common # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018 ; Common # Pi LEFT SINGLE QUOTATION MARK
+2019 ; Common # Pf RIGHT SINGLE QUOTATION MARK
+201A ; Common # Ps SINGLE LOW-9 QUOTATION MARK
+201B..201C ; Common # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D ; Common # Pf RIGHT DOUBLE QUOTATION MARK
+201E ; Common # Ps DOUBLE LOW-9 QUOTATION MARK
+201F ; Common # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027 ; Common # Po [8] DAGGER..HYPHENATION POINT
+2028 ; Common # Zl LINE SEPARATOR
+2029 ; Common # Zp PARAGRAPH SEPARATOR
+202A..202E ; Common # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+202F ; Common # Zs NARROW NO-BREAK SPACE
+2030..2038 ; Common # Po [9] PER MILLE SIGN..CARET
+2039 ; Common # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; Common # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E ; Common # Po [4] REFERENCE MARK..OVERLINE
+203F..2040 ; Common # Pc [2] UNDERTIE..CHARACTER TIE
+2041..2043 ; Common # Po [3] CARET INSERTION POINT..HYPHEN BULLET
+2044 ; Common # Sm FRACTION SLASH
+2045 ; Common # Ps LEFT SQUARE BRACKET WITH QUILL
+2046 ; Common # Pe RIGHT SQUARE BRACKET WITH QUILL
+2047..2051 ; Common # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; Common # Sm COMMERCIAL MINUS SIGN
+2053 ; Common # Po SWUNG DASH
+2054 ; Common # Pc INVERTED UNDERTIE
+2055..205E ; Common # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+205F ; Common # Zs MEDIUM MATHEMATICAL SPACE
+2060..2064 ; Common # Cf [5] WORD JOINER..INVISIBLE PLUS
+206A..206F ; Common # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+2070 ; Common # No SUPERSCRIPT ZERO
+2074..2079 ; Common # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
+207A..207C ; Common # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN
+207D ; Common # Ps SUPERSCRIPT LEFT PARENTHESIS
+207E ; Common # Pe SUPERSCRIPT RIGHT PARENTHESIS
+2080..2089 ; Common # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
+208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN
+208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS
+208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS
+20A0..20B8 ; Common # Sc [25] EURO-CURRENCY SIGN..TENGE SIGN
+2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
+2102 ; Common # L& DOUBLE-STRUCK CAPITAL C
+2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA
+2107 ; Common # L& EULER CONSTANT
+2108..2109 ; Common # So [2] SCRUPLE..DEGREE FAHRENHEIT
+210A..2113 ; Common # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2114 ; Common # So L B BAR SYMBOL
+2115 ; Common # L& DOUBLE-STRUCK CAPITAL N
+2116..2118 ; Common # So [3] NUMERO SIGN..SCRIPT CAPITAL P
+2119..211D ; Common # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+211E..2123 ; Common # So [6] PRESCRIPTION TAKE..VERSICLE
+2124 ; Common # L& DOUBLE-STRUCK CAPITAL Z
+2125 ; Common # So OUNCE SIGN
+2127 ; Common # So INVERTED OHM SIGN
+2128 ; Common # L& BLACK-LETTER CAPITAL Z
+2129 ; Common # So TURNED GREEK SMALL LETTER IOTA
+212C..212D ; Common # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212E ; Common # So ESTIMATED SYMBOL
+212F..2131 ; Common # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134 ; Common # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138 ; Common # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; Common # L& INFORMATION SOURCE
+213A..213B ; Common # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN
+213C..213F ; Common # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2140..2144 ; Common # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
+2145..2149 ; Common # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214A ; Common # So PROPERTY LINE
+214B ; Common # Sm TURNED AMPERSAND
+214C..214D ; Common # So [2] PER SIGN..AKTIESELSKAB
+214F ; Common # So SYMBOL FOR SAMARITAN SOURCE
+2150..215F ; Common # No [16] VULGAR FRACTION ONE SEVENTH..FRACTION NUMERATOR ONE
+2189 ; Common # No VULGAR FRACTION ZERO THIRDS
+2190..2194 ; Common # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199 ; Common # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B ; Common # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F ; Common # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0 ; Common # Sm RIGHTWARDS TWO HEADED ARROW
+21A1..21A2 ; Common # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3 ; Common # Sm RIGHTWARDS ARROW WITH TAIL
+21A4..21A5 ; Common # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6 ; Common # Sm RIGHTWARDS ARROW FROM BAR
+21A7..21AD ; Common # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE ; Common # Sm LEFT RIGHT ARROW WITH STROKE
+21AF..21CD ; Common # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF ; Common # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; Common # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2 ; Common # Sm RIGHTWARDS DOUBLE ARROW
+21D3 ; Common # So DOWNWARDS DOUBLE ARROW
+21D4 ; Common # Sm LEFT RIGHT DOUBLE ARROW
+21D5..21F3 ; Common # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..22FF ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2300..2307 ; Common # So [8] DIAMETER SIGN..WAVY LINE
+2308..230B ; Common # Sm [4] LEFT CEILING..RIGHT FLOOR
+230C..231F ; Common # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321 ; Common # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328 ; Common # So [7] FROWN..KEYBOARD
+2329 ; Common # Ps LEFT-POINTING ANGLE BRACKET
+232A ; Common # Pe RIGHT-POINTING ANGLE BRACKET
+232B..237B ; Common # So [81] ERASE TO THE LEFT..NOT CHECK MARK
+237C ; Common # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A ; Common # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4..23DB ; Common # So [40] TOP SQUARE BRACKET..FUSE
+23DC..23E1 ; Common # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
+23E2..23E8 ; Common # So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL
+2400..2426 ; Common # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH
+2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP
+249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+24EA..24FF ; Common # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO
+2500..25B6 ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7 ; Common # Sm WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0 ; Common # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1 ; Common # Sm WHITE LEFT-POINTING TRIANGLE
+25C2..25F7 ; Common # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF ; Common # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..266E ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
+266F ; Common # Sm MUSIC SHARP SIGN
+2670..26CD ; Common # So [94] WEST SYRIAC CROSS..DISABLED CAR
+26CF..26E1 ; Common # So [19] PICK..RESTRICTED LEFT ENTRY-2
+26E3 ; Common # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
+26E8..26FF ; Common # So [24] BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+2701..2704 ; Common # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2706..2709 ; Common # So [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270C..2727 ; Common # So [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2729..274B ; Common # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D ; Common # So SHADOWED WHITE CIRCLE
+274F..2752 ; Common # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2756..275E ; Common # So [9] BLACK DIAMOND MINUS WHITE X..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761..2767 ; Common # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768 ; Common # Ps MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; Common # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; Common # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; Common # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; Common # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; Common # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; Common # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; Common # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; Common # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; Common # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; Common # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; Common # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; Common # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; Common # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776..2793 ; Common # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794 ; Common # So HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798..27AF ; Common # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1..27BE ; Common # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27C0..27C4 ; Common # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5 ; Common # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; Common # Pe RIGHT S-SHAPED BAG DELIMITER
+27C7..27CA ; Common # Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
+27CC ; Common # Sm LONG DIVISION
+27D0..27E5 ; Common # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; Common # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; Common # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; Common # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; Common # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; Common # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; Common # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; Common # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; Common # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; Common # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; Common # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0..27FF ; Common # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2900..2982 ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983 ; Common # Ps LEFT WHITE CURLY BRACKET
+2984 ; Common # Pe RIGHT WHITE CURLY BRACKET
+2985 ; Common # Ps LEFT WHITE PARENTHESIS
+2986 ; Common # Pe RIGHT WHITE PARENTHESIS
+2987 ; Common # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; Common # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; Common # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; Common # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; Common # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; Common # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; Common # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; Common # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; Common # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; Common # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; Common # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; Common # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; Common # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; Common # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7 ; Common # Sm [63] DOTTED FENCE..BLACK HOURGLASS
+29D8 ; Common # Ps LEFT WIGGLY FENCE
+29D9 ; Common # Pe RIGHT WIGGLY FENCE
+29DA ; Common # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; Common # Pe RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB ; Common # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC ; Common # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; Common # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B2F ; Common # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE
+2B30..2B44 ; Common # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET
+2B45..2B46 ; Common # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW
+2B47..2B4C ; Common # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50..2B59 ; Common # So [10] WHITE MEDIUM STAR..HEAVY CIRCLED SALTIRE
+2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET
+2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET
+2E04 ; Common # Pi LEFT DOTTED SUBSTITUTION BRACKET
+2E05 ; Common # Pf RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08 ; Common # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09 ; Common # Pi LEFT TRANSPOSITION BRACKET
+2E0A ; Common # Pf RIGHT TRANSPOSITION BRACKET
+2E0B ; Common # Po RAISED SQUARE
+2E0C ; Common # Pi LEFT RAISED OMISSION BRACKET
+2E0D ; Common # Pf RIGHT RAISED OMISSION BRACKET
+2E0E..2E16 ; Common # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17 ; Common # Pd DOUBLE OBLIQUE HYPHEN
+2E18..2E19 ; Common # Po [2] INVERTED INTERROBANG..PALM BRANCH
+2E1A ; Common # Pd HYPHEN WITH DIAERESIS
+2E1B ; Common # Po TILDE WITH RING ABOVE
+2E1C ; Common # Pi LEFT LOW PARAPHRASE BRACKET
+2E1D ; Common # Pf RIGHT LOW PARAPHRASE BRACKET
+2E1E..2E1F ; Common # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW
+2E20 ; Common # Pi LEFT VERTICAL BAR WITH QUILL
+2E21 ; Common # Pf RIGHT VERTICAL BAR WITH QUILL
+2E22 ; Common # Ps TOP LEFT HALF BRACKET
+2E23 ; Common # Pe TOP RIGHT HALF BRACKET
+2E24 ; Common # Ps BOTTOM LEFT HALF BRACKET
+2E25 ; Common # Pe BOTTOM RIGHT HALF BRACKET
+2E26 ; Common # Ps LEFT SIDEWAYS U BRACKET
+2E27 ; Common # Pe RIGHT SIDEWAYS U BRACKET
+2E28 ; Common # Ps LEFT DOUBLE PARENTHESIS
+2E29 ; Common # Pe RIGHT DOUBLE PARENTHESIS
+2E2A..2E2E ; Common # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK
+2E2F ; Common # Lm VERTICAL TILDE
+2E30..2E31 ; Common # Po [2] RING POINT..WORD SEPARATOR MIDDLE DOT
+2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000 ; Common # Zs IDEOGRAPHIC SPACE
+3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
+3004 ; Common # So JAPANESE INDUSTRIAL STANDARD SYMBOL
+3006 ; Common # Lo IDEOGRAPHIC CLOSING MARK
+3008 ; Common # Ps LEFT ANGLE BRACKET
+3009 ; Common # Pe RIGHT ANGLE BRACKET
+300A ; Common # Ps LEFT DOUBLE ANGLE BRACKET
+300B ; Common # Pe RIGHT DOUBLE ANGLE BRACKET
+300C ; Common # Ps LEFT CORNER BRACKET
+300D ; Common # Pe RIGHT CORNER BRACKET
+300E ; Common # Ps LEFT WHITE CORNER BRACKET
+300F ; Common # Pe RIGHT WHITE CORNER BRACKET
+3010 ; Common # Ps LEFT BLACK LENTICULAR BRACKET
+3011 ; Common # Pe RIGHT BLACK LENTICULAR BRACKET
+3012..3013 ; Common # So [2] POSTAL MARK..GETA MARK
+3014 ; Common # Ps LEFT TORTOISE SHELL BRACKET
+3015 ; Common # Pe RIGHT TORTOISE SHELL BRACKET
+3016 ; Common # Ps LEFT WHITE LENTICULAR BRACKET
+3017 ; Common # Pe RIGHT WHITE LENTICULAR BRACKET
+3018 ; Common # Ps LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; Common # Pe RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; Common # Ps LEFT WHITE SQUARE BRACKET
+301B ; Common # Pe RIGHT WHITE SQUARE BRACKET
+301C ; Common # Pd WAVE DASH
+301D ; Common # Ps REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F ; Common # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020 ; Common # So POSTAL MARK FACE
+3030 ; Common # Pd WAVY DASH
+3031..3035 ; Common # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3036..3037 ; Common # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303C ; Common # Lo MASU MARK
+303D ; Common # Po PART ALTERNATION MARK
+303E..303F ; Common # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE
+309B..309C ; Common # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0 ; Common # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB ; Common # Po KATAKANA MIDDLE DOT
+30FC ; Common # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK
+3190..3191 ; Common # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192..3195 ; Common # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
+3196..319F ; Common # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+31C0..31E3 ; Common # So [36] CJK STROKE T..CJK STROKE Q
+3220..3229 ; Common # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
+322A..3250 ; Common # So [39] PARENTHESIZED IDEOGRAPH MOON..PARTNERSHIP SIGN
+3251..325F ; Common # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
+327F ; Common # So KOREAN STANDARD SYMBOL
+3280..3289 ; Common # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
+328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
+32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
+32C0..32CF ; Common # So [16] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..LIMITED LIABILITY SIGN
+3358..33FF ; Common # So [168] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE GAL
+4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+A700..A716 ; Common # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717..A71F ; Common # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720..A721 ; Common # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+A788 ; Common # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789..A78A ; Common # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN
+A830..A835 ; Common # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS
+A836..A837 ; Common # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK
+A838 ; Common # Sc NORTH INDIC RUPEE MARK
+A839 ; Common # So NORTH INDIC QUANTITY MARK
+FD3E ; Common # Ps ORNATE LEFT PARENTHESIS
+FD3F ; Common # Pe ORNATE RIGHT PARENTHESIS
+FDFD ; Common # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE10..FE16 ; Common # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19 ; Common # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE30 ; Common # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31..FE32 ; Common # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE33..FE34 ; Common # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45..FE46 ; Common # Po [2] SESAME DOT..WHITE SESAME DOT
+FE47 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49..FE4C ; Common # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
+FE4D..FE4F ; Common # Pc [3] DASHED LOW LINE..WAVY LOW LINE
+FE50..FE52 ; Common # Po [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57 ; Common # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FE58 ; Common # Pd SMALL EM DASH
+FE59 ; Common # Ps SMALL LEFT PARENTHESIS
+FE5A ; Common # Pe SMALL RIGHT PARENTHESIS
+FE5B ; Common # Ps SMALL LEFT CURLY BRACKET
+FE5C ; Common # Pe SMALL RIGHT CURLY BRACKET
+FE5D ; Common # Ps SMALL LEFT TORTOISE SHELL BRACKET
+FE5E ; Common # Pe SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F..FE61 ; Common # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK
+FE62 ; Common # Sm SMALL PLUS SIGN
+FE63 ; Common # Pd SMALL HYPHEN-MINUS
+FE64..FE66 ; Common # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE68 ; Common # Po SMALL REVERSE SOLIDUS
+FE69 ; Common # Sc SMALL DOLLAR SIGN
+FE6A..FE6B ; Common # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
+FEFF ; Common # Cf ZERO WIDTH NO-BREAK SPACE
+FF01..FF03 ; Common # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN
+FF04 ; Common # Sc FULLWIDTH DOLLAR SIGN
+FF05..FF07 ; Common # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE
+FF08 ; Common # Ps FULLWIDTH LEFT PARENTHESIS
+FF09 ; Common # Pe FULLWIDTH RIGHT PARENTHESIS
+FF0A ; Common # Po FULLWIDTH ASTERISK
+FF0B ; Common # Sm FULLWIDTH PLUS SIGN
+FF0C ; Common # Po FULLWIDTH COMMA
+FF0D ; Common # Pd FULLWIDTH HYPHEN-MINUS
+FF0E..FF0F ; Common # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS
+FF10..FF19 ; Common # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF1A..FF1B ; Common # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1C..FF1E ; Common # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF1F..FF20 ; Common # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT
+FF3B ; Common # Ps FULLWIDTH LEFT SQUARE BRACKET
+FF3C ; Common # Po FULLWIDTH REVERSE SOLIDUS
+FF3D ; Common # Pe FULLWIDTH RIGHT SQUARE BRACKET
+FF3E ; Common # Sk FULLWIDTH CIRCUMFLEX ACCENT
+FF3F ; Common # Pc FULLWIDTH LOW LINE
+FF40 ; Common # Sk FULLWIDTH GRAVE ACCENT
+FF5B ; Common # Ps FULLWIDTH LEFT CURLY BRACKET
+FF5C ; Common # Sm FULLWIDTH VERTICAL LINE
+FF5D ; Common # Pe FULLWIDTH RIGHT CURLY BRACKET
+FF5E ; Common # Sm FULLWIDTH TILDE
+FF5F ; Common # Ps FULLWIDTH LEFT WHITE PARENTHESIS
+FF60 ; Common # Pe FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61 ; Common # Po HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62 ; Common # Ps HALFWIDTH LEFT CORNER BRACKET
+FF63 ; Common # Pe HALFWIDTH RIGHT CORNER BRACKET
+FF64..FF65 ; Common # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT
+FF70 ; Common # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF9E..FF9F ; Common # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFE0..FFE1 ; Common # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
+FFE2 ; Common # Sm FULLWIDTH NOT SIGN
+FFE3 ; Common # Sk FULLWIDTH MACRON
+FFE4 ; Common # So FULLWIDTH BROKEN BAR
+FFE5..FFE6 ; Common # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
+FFE8 ; Common # So HALFWIDTH FORMS LIGHT VERTICAL
+FFE9..FFEC ; Common # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+FFED..FFEE ; Common # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
+FFF9..FFFB ; Common # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
+10100..10101 ; Common # Po [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT
+10102 ; Common # So AEGEAN CHECK MARK
+10107..10133 ; Common # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+10137..1013F ; Common # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
+10190..1019B ; Common # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN
+101D0..101FC ; Common # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND
+1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100..1D126 ; Common # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+1D129..1D164 ; Common # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165..1D166 ; Common # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D16A..1D16C ; Common # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D..1D172 ; Common # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D173..1D17A ; Common # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
+1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
+1D1AE..1D1DD ; Common # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS
+1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+1D360..1D371 ; Common # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
+1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Common # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Common # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; Common # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Common # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Common # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; Common # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Common # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Common # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Common # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; Common # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Common # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Common # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Common # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Common # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; Common # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1 ; Common # Sm MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA ; Common # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB ; Common # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA ; Common # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB ; Common # Sm MATHEMATICAL ITALIC NABLA
+1D6FC..1D714 ; Common # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715 ; Common # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734 ; Common # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735 ; Common # Sm MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E ; Common # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F ; Common # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E ; Common # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F ; Common # Sm MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8 ; Common # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7CB ; Common # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1F000..1F02B ; Common # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK
+1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
+1F100..1F10A ; Common # No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA
+1F110..1F12E ; Common # So [31] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ
+1F131 ; Common # So SQUARED LATIN CAPITAL LETTER B
+1F13D ; Common # So SQUARED LATIN CAPITAL LETTER N
+1F13F ; Common # So SQUARED LATIN CAPITAL LETTER P
+1F142 ; Common # So SQUARED LATIN CAPITAL LETTER S
+1F146 ; Common # So SQUARED LATIN CAPITAL LETTER W
+1F14A..1F14E ; Common # So [5] SQUARED HV..SQUARED PPV
+1F157 ; Common # So NEGATIVE CIRCLED LATIN CAPITAL LETTER H
+1F15F ; Common # So NEGATIVE CIRCLED LATIN CAPITAL LETTER P
+1F179 ; Common # So NEGATIVE SQUARED LATIN CAPITAL LETTER J
+1F17B..1F17C ; Common # So [2] NEGATIVE SQUARED LATIN CAPITAL LETTER L..NEGATIVE SQUARED LATIN CAPITAL LETTER M
+1F17F ; Common # So NEGATIVE SQUARED LATIN CAPITAL LETTER P
+1F18A..1F18D ; Common # So [4] CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P..NEGATIVE SQUARED SA
+1F190 ; Common # So SQUARE DJ
+1F210..1F231 ; Common # So [34] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-6253
+1F240..1F248 ; Common # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557
+E0001 ; Common # Cf LANGUAGE TAG
+E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG
+
+# Total code points: 5395
+
+# ================================================
+
+0041..005A ; Latin # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A ; Latin # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; Latin # L& FEMININE ORDINAL INDICATOR
+00BA ; Latin # L& MASCULINE ORDINAL INDICATOR
+00C0..00D6 ; Latin # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; Latin # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; Latin # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; Latin # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; Latin # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293 ; Latin # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294 ; Latin # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; Latin # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02B8 ; Latin # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02E0..02E4 ; Latin # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+1D00..1D25 ; Latin # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN
+1D2C..1D5C ; Latin # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN
+1D62..1D65 ; Latin # L& [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V
+1D6B..1D77 ; Latin # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G
+1D79..1D9A ; Latin # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBE ; Latin # Lm [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH
+1E00..1EFF ; Latin # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP
+2071 ; Latin # Lm SUPERSCRIPT LATIN SMALL LETTER I
+207F ; Latin # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094 ; Latin # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+212A..212B ; Latin # L& [2] KELVIN SIGN..ANGSTROM SIGN
+2132 ; Latin # L& TURNED CAPITAL F
+214E ; Latin # L& TURNED SMALL F
+2160..2182 ; Latin # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; Latin # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; Latin # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2C60..2C7C ; Latin # L& [29] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; Latin # Lm MODIFIER LETTER CAPITAL V
+2C7E..2C7F ; Latin # L& [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL
+A722..A76F ; Latin # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; Latin # Lm MODIFIER LETTER US
+A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A78B..A78C ; Latin # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A7FF ; Latin # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M
+FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+
+# Total code points: 1244
+
+# ================================================
+
+0370..0373 ; Greek # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0375 ; Greek # Sk GREEK LOWER NUMERAL SIGN
+0376..0377 ; Greek # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; Greek # Lm GREEK YPOGEGRAMMENI
+037B..037D ; Greek # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0384 ; Greek # Sk GREEK TONOS
+0386 ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; Greek # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Greek # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; Greek # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03E1 ; Greek # L& [63] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER SAMPI
+03F0..03F5 ; Greek # L& [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F6 ; Greek # Sm GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7..03FF ; Greek # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+1D26..1D2A ; Greek # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI
+1D5D..1D61 ; Greek # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI
+1D66..1D6A ; Greek # L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI
+1DBF ; Greek # Lm MODIFIER LETTER SMALL THETA
+1F00..1F15 ; Greek # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; Greek # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; Greek # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; Greek # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Greek # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; Greek # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; Greek # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; Greek # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD ; Greek # Sk GREEK KORONIS
+1FBE ; Greek # L& GREEK PROSGEGRAMMENI
+1FBF..1FC1 ; Greek # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FC2..1FC4 ; Greek # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; Greek # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD..1FCF ; Greek # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FD0..1FD3 ; Greek # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; Greek # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD..1FDF ; Greek # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FE0..1FEC ; Greek # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FED..1FEF ; Greek # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FF2..1FF4 ; Greek # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; Greek # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD..1FFE ; Greek # Sk [2] GREEK OXIA..GREEK DASIA
+2126 ; Greek # L& OHM SIGN
+10140..10174 ; Greek # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175..10178 ; Greek # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN
+10179..10189 ; Greek # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN
+1018A ; Greek # No GREEK ZERO SIGN
+1D200..1D241 ; Greek # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242..1D244 ; Greek # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1D245 ; Greek # So GREEK MUSICAL LEIMMA
+
+# Total code points: 511
+
+# ================================================
+
+0400..0481 ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA
+0482 ; Cyrillic # So CYRILLIC THOUSANDS SIGN
+0483..0484 ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PALATALIZATION
+0487 ; Cyrillic # Mn COMBINING CYRILLIC POKRYTIE
+0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+048A..0525 ; Cyrillic # L& [156] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER PE WITH DESCENDER
+1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL
+1D78 ; Cyrillic # Lm MODIFIER LETTER CYRILLIC EN
+2DE0..2DFF ; Cyrillic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+A640..A65F ; Cyrillic # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; Cyrillic # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; Cyrillic # Lo CYRILLIC LETTER MULTIOCULAR O
+A66F ; Cyrillic # Mn COMBINING CYRILLIC VZMET
+A670..A672 ; Cyrillic # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673 ; Cyrillic # Po SLAVONIC ASTERISK
+A67C..A67D ; Cyrillic # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67E ; Cyrillic # Po CYRILLIC KAVYKA
+A67F ; Cyrillic # Lm CYRILLIC PAYEROK
+A680..A697 ; Cyrillic # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+
+# Total code points: 404
+
+# ================================================
+
+0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+0561..0587 ; Armenian # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+058A ; Armenian # Pd ARMENIAN HYPHEN
+FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+
+# Total code points: 90
+
+# ================================================
+
+0591..05BD ; Hebrew # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BE ; Hebrew # Pd HEBREW PUNCTUATION MAQAF
+05BF ; Hebrew # Mn HEBREW POINT RAFE
+05C0 ; Hebrew # Po HEBREW PUNCTUATION PASEQ
+05C1..05C2 ; Hebrew # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C3 ; Hebrew # Po HEBREW PUNCTUATION SOF PASUQ
+05C4..05C5 ; Hebrew # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA
+05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN
+05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; Hebrew # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
+FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F..FB28 ; Hebrew # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB29 ; Hebrew # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A..FB36 ; Hebrew # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; Hebrew # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; Hebrew # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
+
+# Total code points: 133
+
+# ================================================
+
+0606..0608 ; Arabic # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY
+0609..060A ; Arabic # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN
+060B ; Arabic # Sc AFGHANI SIGN
+060D ; Arabic # Po ARABIC DATE SEPARATOR
+060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA
+0610..061A ; Arabic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+061E ; Arabic # Po ARABIC TRIPLE DOT PUNCTUATION MARK
+0621..063F ; Arabic # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+0656..065E ; Arabic # Mn [9] ARABIC SUBSCRIPT ALEF..ARABIC FATHA WITH TWO DOTS
+066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR
+066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4 ; Arabic # Po ARABIC FULL STOP
+06D5 ; Arabic # Lo ARABIC LETTER AE
+06D6..06DC ; Arabic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DE ; Arabic # Me ARABIC START OF RUB EL HIZB
+06DF..06E4 ; Arabic # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E5..06E6 ; Arabic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8 ; Arabic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06E9 ; Arabic # So ARABIC PLACE OF SAJDAH
+06EA..06ED ; Arabic # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+06EE..06EF ; Arabic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06F0..06F9 ; Arabic # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA..06FC ; Arabic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FD..06FE ; Arabic # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V
+0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE
+FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FD3D ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F ; Arabic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; Arabic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB ; Arabic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FDFC ; Arabic # Sc RIAL SIGN
+FE70..FE74 ; Arabic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+10E60..10E7E ; Arabic # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS
+
+# Total code points: 1030
+
+# ================================================
+
+0700..070D ; Syriac # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+070F ; Syriac # Cf SYRIAC ABBREVIATION MARK
+0710 ; Syriac # Lo SYRIAC LETTER ALAPH
+0711 ; Syriac # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE
+
+# Total code points: 77
+
+# ================================================
+
+0780..07A5 ; Thaana # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU
+07A6..07B0 ; Thaana # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07B1 ; Thaana # Lo THAANA LETTER NAA
+
+# Total code points: 50
+
+# ================================================
+
+0900..0902 ; Devanagari # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903 ; Devanagari # Mc DEVANAGARI SIGN VISARGA
+0904..0939 ; Devanagari # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093C ; Devanagari # Mn DEVANAGARI SIGN NUKTA
+093D ; Devanagari # Lo DEVANAGARI SIGN AVAGRAHA
+093E..0940 ; Devanagari # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948 ; Devanagari # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C ; Devanagari # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094D ; Devanagari # Mn DEVANAGARI SIGN VIRAMA
+094E ; Devanagari # Mc DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+0950 ; Devanagari # Lo DEVANAGARI OM
+0953..0955 ; Devanagari # Mn [3] DEVANAGARI GRAVE ACCENT..DEVANAGARI VOWEL SIGN CANDRA LONG E
+0958..0961 ; Devanagari # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0962..0963 ; Devanagari # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0966..096F ; Devanagari # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0971 ; Devanagari # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972 ; Devanagari # Lo DEVANAGARI LETTER CANDRA A
+0979..097F ; Devanagari # Lo [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+A8E0..A8F1 ; Devanagari # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A8F2..A8F7 ; Devanagari # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8F8..A8FA ; Devanagari # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
+A8FB ; Devanagari # Lo DEVANAGARI HEADSTROKE
+
+# Total code points: 140
+
+# ================================================
+
+0981 ; Bengali # Mn BENGALI SIGN CANDRABINDU
+0982..0983 ; Bengali # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C ; Bengali # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; Bengali # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; Bengali # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; Bengali # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; Bengali # Lo BENGALI LETTER LA
+09B6..09B9 ; Bengali # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BC ; Bengali # Mn BENGALI SIGN NUKTA
+09BD ; Bengali # Lo BENGALI SIGN AVAGRAHA
+09BE..09C0 ; Bengali # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4 ; Bengali # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8 ; Bengali # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; Bengali # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CD ; Bengali # Mn BENGALI SIGN VIRAMA
+09CE ; Bengali # Lo BENGALI LETTER KHANDA TA
+09D7 ; Bengali # Mc BENGALI AU LENGTH MARK
+09DC..09DD ; Bengali # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; Bengali # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E2..09E3 ; Bengali # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09E6..09EF ; Bengali # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1 ; Bengali # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2..09F3 ; Bengali # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN
+09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA ; Bengali # So BENGALI ISSHAR
+09FB ; Bengali # Sc BENGALI GANDA MARK
+
+# Total code points: 92
+
+# ================================================
+
+0A01..0A02 ; Gurmukhi # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; Gurmukhi # Mc GURMUKHI SIGN VISARGA
+0A05..0A0A ; Gurmukhi # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; Gurmukhi # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; Gurmukhi # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; Gurmukhi # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; Gurmukhi # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; Gurmukhi # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; Gurmukhi # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3C ; Gurmukhi # Mn GURMUKHI SIGN NUKTA
+0A3E..0A40 ; Gurmukhi # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; Gurmukhi # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; Gurmukhi # Mn GURMUKHI SIGN UDAAT
+0A59..0A5C ; Gurmukhi # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; Gurmukhi # Lo GURMUKHI LETTER FA
+0A66..0A6F ; Gurmukhi # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH
+
+# Total code points: 79
+
+# ================================================
+
+0A81..0A82 ; Gujarati # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83 ; Gujarati # Mc GUJARATI SIGN VISARGA
+0A85..0A8D ; Gujarati # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; Gujarati # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; Gujarati # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; Gujarati # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; Gujarati # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; Gujarati # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABC ; Gujarati # Mn GUJARATI SIGN NUKTA
+0ABD ; Gujarati # Lo GUJARATI SIGN AVAGRAHA
+0ABE..0AC0 ; Gujarati # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5 ; Gujarati # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9 ; Gujarati # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; Gujarati # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0ACD ; Gujarati # Mn GUJARATI SIGN VIRAMA
+0AD0 ; Gujarati # Lo GUJARATI OM
+0AE0..0AE1 ; Gujarati # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AE6..0AEF ; Gujarati # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN
+
+# Total code points: 83
+
+# ================================================
+
+0B01 ; Oriya # Mn ORIYA SIGN CANDRABINDU
+0B02..0B03 ; Oriya # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C ; Oriya # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; Oriya # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; Oriya # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; Oriya # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; Oriya # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; Oriya # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3C ; Oriya # Mn ORIYA SIGN NUKTA
+0B3D ; Oriya # Lo ORIYA SIGN AVAGRAHA
+0B3E ; Oriya # Mc ORIYA VOWEL SIGN AA
+0B3F ; Oriya # Mn ORIYA VOWEL SIGN I
+0B40 ; Oriya # Mc ORIYA VOWEL SIGN II
+0B41..0B44 ; Oriya # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48 ; Oriya # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; Oriya # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B4D ; Oriya # Mn ORIYA SIGN VIRAMA
+0B56 ; Oriya # Mn ORIYA AI LENGTH MARK
+0B57 ; Oriya # Mc ORIYA AU LENGTH MARK
+0B5C..0B5D ; Oriya # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; Oriya # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B62..0B63 ; Oriya # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B66..0B6F ; Oriya # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B70 ; Oriya # So ORIYA ISSHAR
+0B71 ; Oriya # Lo ORIYA LETTER WA
+
+# Total code points: 84
+
+# ================================================
+
+0B82 ; Tamil # Mn TAMIL SIGN ANUSVARA
+0B83 ; Tamil # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; Tamil # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; Tamil # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; Tamil # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; Tamil # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; Tamil # Lo TAMIL LETTER JA
+0B9E..0B9F ; Tamil # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; Tamil # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; Tamil # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; Tamil # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBE..0BBF ; Tamil # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0 ; Tamil # Mn TAMIL VOWEL SIGN II
+0BC1..0BC2 ; Tamil # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; Tamil # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; Tamil # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BCD ; Tamil # Mn TAMIL SIGN VIRAMA
+0BD0 ; Tamil # Lo TAMIL OM
+0BD7 ; Tamil # Mc TAMIL AU LENGTH MARK
+0BE6..0BEF ; Tamil # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0BF0..0BF2 ; Tamil # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
+0BF3..0BF8 ; Tamil # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN
+0BF9 ; Tamil # Sc TAMIL RUPEE SIGN
+0BFA ; Tamil # So TAMIL NUMBER SIGN
+
+# Total code points: 72
+
+# ================================================
+
+0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33 ; Telugu # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39 ; Telugu # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D ; Telugu # Lo TELUGU SIGN AVAGRAHA
+0C3E..0C40 ; Telugu # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44 ; Telugu # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48 ; Telugu # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; Telugu # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; Telugu # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C58..0C59 ; Telugu # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61 ; Telugu # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C62..0C63 ; Telugu # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C66..0C6F ; Telugu # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C78..0C7E ; Telugu # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F ; Telugu # So TELUGU SIGN TUUMU
+
+# Total code points: 93
+
+# ================================================
+
+0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; Kannada # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; Kannada # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBC ; Kannada # Mn KANNADA SIGN NUKTA
+0CBD ; Kannada # Lo KANNADA SIGN AVAGRAHA
+0CBE ; Kannada # Mc KANNADA VOWEL SIGN AA
+0CBF ; Kannada # Mn KANNADA VOWEL SIGN I
+0CC0..0CC4 ; Kannada # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; Kannada # Mn KANNADA VOWEL SIGN E
+0CC7..0CC8 ; Kannada # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; Kannada # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC..0CCD ; Kannada # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6 ; Kannada # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE ; Kannada # Lo KANNADA LETTER FA
+0CE0..0CE1 ; Kannada # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE2..0CE3 ; Kannada # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+
+# Total code points: 84
+
+# ================================================
+
+0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C ; Malayalam # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28 ; Malayalam # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39 ; Malayalam # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D ; Malayalam # Lo MALAYALAM SIGN AVAGRAHA
+0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44 ; Malayalam # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA
+0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK
+0D60..0D61 ; Malayalam # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D62..0D63 ; Malayalam # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D70..0D75 ; Malayalam # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS
+0D79 ; Malayalam # So MALAYALAM DATE MARK
+0D7A..0D7F ; Malayalam # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+
+# Total code points: 95
+
+# ================================================
+
+0D82..0D83 ; Sinhala # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96 ; Sinhala # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; Sinhala # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; Sinhala # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; Sinhala # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; Sinhala # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCA ; Sinhala # Mn SINHALA SIGN AL-LAKUNA
+0DCF..0DD1 ; Sinhala # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4 ; Sinhala # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; Sinhala # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF ; Sinhala # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3 ; Sinhala # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4 ; Sinhala # Po SINHALA PUNCTUATION KUNDDALIYA
+
+# Total code points: 80
+
+# ================================================
+
+0E01..0E30 ; Thai # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E31 ; Thai # Mn THAI CHARACTER MAI HAN-AKAT
+0E32..0E33 ; Thai # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E34..0E3A ; Thai # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E40..0E45 ; Thai # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; Thai # Lm THAI CHARACTER MAIYAMOK
+0E47..0E4E ; Thai # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0E4F ; Thai # Po THAI CHARACTER FONGMAN
+0E50..0E59 ; Thai # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E5A..0E5B ; Thai # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+
+# Total code points: 86
+
+# ================================================
+
+0E81..0E82 ; Lao # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; Lao # Lo LAO LETTER KHO TAM
+0E87..0E88 ; Lao # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; Lao # Lo LAO LETTER SO TAM
+0E8D ; Lao # Lo LAO LETTER NYO
+0E94..0E97 ; Lao # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; Lao # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; Lao # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; Lao # Lo LAO LETTER LO LOOT
+0EA7 ; Lao # Lo LAO LETTER WO
+0EAA..0EAB ; Lao # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; Lao # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB1 ; Lao # Mn LAO VOWEL SIGN MAI KAN
+0EB2..0EB3 ; Lao # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EB4..0EB9 ; Lao # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; Lao # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EBD ; Lao # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; Lao # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; Lao # Lm LAO KO LA
+0EC8..0ECD ; Lao # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
+0ED0..0ED9 ; Lao # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDD ; Lao # Lo [2] LAO HO NO..LAO HO MO
+
+# Total code points: 65
+
+# ================================================
+
+0F00 ; Tibetan # Lo TIBETAN SYLLABLE OM
+0F01..0F03 ; Tibetan # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04..0F12 ; Tibetan # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD
+0F13..0F17 ; Tibetan # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18..0F19 ; Tibetan # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A..0F1F ; Tibetan # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20..0F29 ; Tibetan # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F2A..0F33 ; Tibetan # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO
+0F34 ; Tibetan # So TIBETAN MARK BSDUS RTAGS
+0F35 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38 ; Tibetan # So TIBETAN MARK CHE MGO
+0F39 ; Tibetan # Mn TIBETAN MARK TSA -PHRU
+0F3A ; Tibetan # Ps TIBETAN MARK GUG RTAGS GYON
+0F3B ; Tibetan # Pe TIBETAN MARK GUG RTAGS GYAS
+0F3C ; Tibetan # Ps TIBETAN MARK ANG KHANG GYON
+0F3D ; Tibetan # Pe TIBETAN MARK ANG KHANG GYAS
+0F3E..0F3F ; Tibetan # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47 ; Tibetan # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; Tibetan # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F71..0F7E ; Tibetan # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F ; Tibetan # Mc TIBETAN SIGN RNAM BCAD
+0F80..0F84 ; Tibetan # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F85 ; Tibetan # Po TIBETAN MARK PALUTA
+0F86..0F87 ; Tibetan # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F88..0F8B ; Tibetan # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0F90..0F97 ; Tibetan # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; Tibetan # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE..0FC5 ; Tibetan # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+0FC6 ; Tibetan # Mn TIBETAN SYMBOL PADMA GDAN
+0FC7..0FCC ; Tibetan # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE..0FCF ; Tibetan # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM
+0FD0..0FD4 ; Tibetan # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+
+# Total code points: 201
+
+# ================================================
+
+1000..102A ; Myanmar # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+102B..102C ; Myanmar # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031 ; Myanmar # Mc MYANMAR VOWEL SIGN E
+1032..1037 ; Myanmar # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1038 ; Myanmar # Mc MYANMAR SIGN VISARGA
+1039..103A ; Myanmar # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103B..103C ; Myanmar # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E ; Myanmar # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+103F ; Myanmar # Lo MYANMAR LETTER GREAT SA
+1040..1049 ; Myanmar # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+104A..104F ; Myanmar # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+1050..1055 ; Myanmar # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105A..105D ; Myanmar # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+105E..1060 ; Myanmar # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061 ; Myanmar # Lo MYANMAR LETTER SGAW KAREN SHA
+1062..1064 ; Myanmar # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO
+1065..1066 ; Myanmar # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+1067..106D ; Myanmar # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E..1070 ; Myanmar # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071..1074 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1075..1081 ; Myanmar # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+1082 ; Myanmar # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+1087..108C ; Myanmar # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108D ; Myanmar # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E ; Myanmar # Lo MYANMAR LETTER RUMAI PALAUNG FA
+108F ; Myanmar # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090..1099 ; Myanmar # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE
+109A..109C ; Myanmar # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A
+109D ; Myanmar # Mn MYANMAR VOWEL SIGN AITON AI
+109E..109F ; Myanmar # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION
+AA60..AA6F ; Myanmar # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA
+AA70 ; Myanmar # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AA71..AA76 ; Myanmar # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM
+AA77..AA79 ; Myanmar # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO
+AA7A ; Myanmar # Lo MYANMAR LETTER AITON RA
+AA7B ; Myanmar # Mc MYANMAR SIGN PAO KAREN TONE
+
+# Total code points: 188
+
+# ================================================
+
+10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA ; Georgian # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR
+2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+
+# Total code points: 120
+
+# ================================================
+
+1100..11FF ; Hangul # Lo [256] HANGUL CHOSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN
+3131..318E ; Hangul # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+3200..321E ; Hangul # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
+3260..327E ; Hangul # So [31] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL IEUNG U
+A960..A97C ; Hangul # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+AC00..D7A3 ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+D7B0..D7C6 ; Hangul # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7CB..D7FB ; Hangul # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+FFA0..FFBE ; Hangul # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; Hangul # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+
+# Total code points: 11737
+
+# ================================================
+
+1200..1248 ; Ethiopic # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA
+124A..124D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; Ethiopic # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; Ethiopic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; Ethiopic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; Ethiopic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; Ethiopic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135F ; Ethiopic # Mn ETHIOPIC COMBINING GEMINATION MARK
+1360 ; Ethiopic # So ETHIOPIC SECTION MARK
+1361..1368 ; Ethiopic # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+1369..137C ; Ethiopic # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND
+1380..138F ; Ethiopic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+1390..1399 ; Ethiopic # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
+2D80..2D96 ; Ethiopic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+
+# Total code points: 461
+
+# ================================================
+
+13A0..13F4 ; Cherokee # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+
+# Total code points: 85
+
+# ================================================
+
+1400 ; Canadian_Aboriginal # Pd CANADIAN SYLLABICS HYPHEN
+1401..166C ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166D..166E ; Canadian_Aboriginal # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+166F..167F ; Canadian_Aboriginal # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+18B0..18F5 ; Canadian_Aboriginal # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+
+# Total code points: 710
+
+# ================================================
+
+1680 ; Ogham # Zs OGHAM SPACE MARK
+1681..169A ; Ogham # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+169B ; Ogham # Ps OGHAM FEATHER MARK
+169C ; Ogham # Pe OGHAM REVERSED FEATHER MARK
+
+# Total code points: 29
+
+# ================================================
+
+16A0..16EA ; Runic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0 ; Runic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+
+# Total code points: 78
+
+# ================================================
+
+1780..17B3 ; Khmer # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B4..17B5 ; Khmer # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B6 ; Khmer # Mc KHMER VOWEL SIGN AA
+17B7..17BD ; Khmer # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5 ; Khmer # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6 ; Khmer # Mn KHMER SIGN NIKAHIT
+17C7..17C8 ; Khmer # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17C9..17D3 ; Khmer # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17D4..17D6 ; Khmer # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17D7 ; Khmer # Lm KHMER SIGN LEK TOO
+17D8..17DA ; Khmer # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT
+17DB ; Khmer # Sc KHMER CURRENCY SYMBOL RIEL
+17DC ; Khmer # Lo KHMER SIGN AVAKRAHASANYA
+17DD ; Khmer # Mn KHMER SIGN ATTHACAN
+17E0..17E9 ; Khmer # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+17F0..17F9 ; Khmer # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+19E0..19FF ; Khmer # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
+
+# Total code points: 146
+
+# ================================================
+
+1800..1801 ; Mongolian # Po [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS
+1804 ; Mongolian # Po MONGOLIAN COLON
+1806 ; Mongolian # Pd MONGOLIAN TODO SOFT HYPHEN
+1807..180A ; Mongolian # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
+180B..180D ; Mongolian # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180E ; Mongolian # Zs MONGOLIAN VOWEL SEPARATOR
+1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8 ; Mongolian # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+
+# Total code points: 153
+
+# ================================================
+
+3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI
+1F200 ; Hiragana # So SQUARE HIRAGANA HOKA
+
+# Total code points: 90
+
+# ================================================
+
+30A1..30FA ; Katakana # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FD..30FE ; Katakana # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK
+30FF ; Katakana # Lo KATAKANA DIGRAPH KOTO
+31F0..31FF ; Katakana # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+32D0..32FE ; Katakana # So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO
+3300..3357 ; Katakana # So [88] SQUARE APAATO..SQUARE WATTO
+FF66..FF6F ; Katakana # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+
+# Total code points: 299
+
+# ================================================
+
+3105..312D ; Bopomofo # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+31A0..31B7 ; Bopomofo # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+
+# Total code points: 65
+
+# ================================================
+
+2E80..2E99 ; Han # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3 ; Han # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5 ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+3005 ; Han # Lm IDEOGRAPHIC ITERATION MARK
+3007 ; Han # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; Han # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FCB ; Han # Lo [20940] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCB
+F900..FA2D ; Han # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6D ; Han # Lo [62] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A700..2B734 ; Han # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 75738
+
+# ================================================
+
+A000..A014 ; Yi # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; Yi # Lm YI SYLLABLE WU
+A016..A48C ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE
+
+# Total code points: 1220
+
+# ================================================
+
+10300..1031E ; Old_Italic # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+
+# Total code points: 35
+
+# ================================================
+
+10330..10340 ; Gothic # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; Gothic # Nl GOTHIC LETTER NINETY
+10342..10349 ; Gothic # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; Gothic # Nl GOTHIC LETTER NINE HUNDRED
+
+# Total code points: 27
+
+# ================================================
+
+10400..1044F ; Deseret # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+
+# Total code points: 80
+
+# ================================================
+
+0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0485..0486 ; Inherited # Mn [2] COMBINING CYRILLIC DASIA PNEUMATA..COMBINING CYRILLIC PSILI PNEUMATA
+064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW
+0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF
+0951..0952 ; Inherited # Mn [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA
+1CD0..1CD2 ; Inherited # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD4..1CE0 ; Inherited # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE2..1CE8 ; Inherited # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CED ; Inherited # Mn VEDIC SIGN TIRYAK
+1DC0..1DE6 ; Inherited # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DFD..1DFF ; Inherited # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; Inherited # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4 ; Inherited # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0 ; Inherited # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+302A..302F ; Inherited # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A ; Inherited # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE26 ; Inherited # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 523
+
+# ================================================
+
+1700..170C ; Tagalog # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; Tagalog # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1712..1714 ; Tagalog # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+
+# Total code points: 20
+
+# ================================================
+
+1720..1731 ; Hanunoo # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1732..1734 ; Hanunoo # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+
+# Total code points: 21
+
+# ================================================
+
+1740..1751 ; Buhid # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1752..1753 ; Buhid # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+
+# Total code points: 20
+
+# ================================================
+
+1760..176C ; Tagbanwa # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; Tagbanwa # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1772..1773 ; Tagbanwa # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+
+# Total code points: 18
+
+# ================================================
+
+1900..191C ; Limbu # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1920..1922 ; Limbu # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; Limbu # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; Limbu # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; Limbu # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; Limbu # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; Limbu # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; Limbu # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1939..193B ; Limbu # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1940 ; Limbu # So LIMBU SIGN LOO
+1944..1945 ; Limbu # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1946..194F ; Limbu # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+
+# Total code points: 66
+
+# ================================================
+
+1950..196D ; Tai_Le # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; Tai_Le # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+
+# Total code points: 35
+
+# ================================================
+
+10000..1000B ; Linear_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; Linear_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; Linear_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; Linear_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; Linear_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; Linear_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+
+# Total code points: 211
+
+# ================================================
+
+10380..1039D ; Ugaritic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+1039F ; Ugaritic # Po UGARITIC WORD DIVIDER
+
+# Total code points: 31
+
+# ================================================
+
+10450..1047F ; Shavian # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW
+
+# Total code points: 48
+
+# ================================================
+
+10480..1049D ; Osmanya # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO
+104A0..104A9 ; Osmanya # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+
+# Total code points: 40
+
+# ================================================
+
+10800..10805 ; Cypriot # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; Cypriot # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; Cypriot # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; Cypriot # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; Cypriot # Lo CYPRIOT SYLLABLE ZA
+1083F ; Cypriot # Lo CYPRIOT SYLLABLE ZO
+
+# Total code points: 55
+
+# ================================================
+
+2800..28FF ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+
+# Total code points: 256
+
+# ================================================
+
+1A00..1A16 ; Buginese # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A17..1A18 ; Buginese # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B ; Buginese # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A1E..1A1F ; Buginese # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION
+
+# Total code points: 30
+
+# ================================================
+
+03E2..03EF ; Coptic # L& [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI
+2C80..2CE4 ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI
+2CE5..2CEA ; Coptic # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA
+2CEB..2CEE ; Coptic # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2CEF..2CF1 ; Coptic # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2CF9..2CFC ; Coptic # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD ; Coptic # No COPTIC FRACTION ONE HALF
+2CFE..2CFF ; Coptic # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
+
+# Total code points: 135
+
+# ================================================
+
+1980..19AB ; New_Tai_Lue # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19B0..19C0 ; New_Tai_Lue # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C1..19C7 ; New_Tai_Lue # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+19C8..19C9 ; New_Tai_Lue # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+19D0..19DA ; New_Tai_Lue # Nd [11] NEW TAI LUE DIGIT ZERO..NEW TAI LUE THAM DIGIT ONE
+19DE..19DF ; New_Tai_Lue # Po [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV
+
+# Total code points: 83
+
+# ================================================
+
+2C00..2C2E ; Glagolitic # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; Glagolitic # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+
+# Total code points: 94
+
+# ================================================
+
+2D30..2D65 ; Tifinagh # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F ; Tifinagh # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+
+# Total code points: 55
+
+# ================================================
+
+A800..A801 ; Syloti_Nagri # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I
+A802 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN DVISVARA
+A803..A805 ; Syloti_Nagri # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A806 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN HASANTA
+A807..A80A ; Syloti_Nagri # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80B ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ANUSVARA
+A80C..A822 ; Syloti_Nagri # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824 ; Syloti_Nagri # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826 ; Syloti_Nagri # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827 ; Syloti_Nagri # Mc SYLOTI NAGRI VOWEL SIGN OO
+A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+
+# Total code points: 44
+
+# ================================================
+
+103A0..103C3 ; Old_Persian # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; Old_Persian # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D0 ; Old_Persian # Po OLD PERSIAN WORD DIVIDER
+103D1..103D5 ; Old_Persian # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+
+# Total code points: 50
+
+# ================================================
+
+10A00 ; Kharoshthi # Lo KHAROSHTHI LETTER A
+10A01..10A03 ; Kharoshthi # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; Kharoshthi # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; Kharoshthi # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA
+10A40..10A47 ; Kharoshthi # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
+
+# Total code points: 65
+
+# ================================================
+
+1B00..1B03 ; Balinese # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04 ; Balinese # Mc BALINESE SIGN BISAH
+1B05..1B33 ; Balinese # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B34 ; Balinese # Mn BALINESE SIGN REREKAN
+1B35 ; Balinese # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; Balinese # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B ; Balinese # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; Balinese # Mn BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41 ; Balinese # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; Balinese # Mn BALINESE VOWEL SIGN PEPET
+1B43..1B44 ; Balinese # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B45..1B4B ; Balinese # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B50..1B59 ; Balinese # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+1B5A..1B60 ; Balinese # Po [7] BALINESE PANTI..BALINESE PAMENENG
+1B61..1B6A ; Balinese # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B..1B73 ; Balinese # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74..1B7C ; Balinese # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+
+# Total code points: 121
+
+# ================================================
+
+12000..1236E ; Cuneiform # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462 ; Cuneiform # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470..12473 ; Cuneiform # Po [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+
+# Total code points: 982
+
+# ================================================
+
+10900..10915 ; Phoenician # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10916..1091B ; Phoenician # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE
+1091F ; Phoenician # Po PHOENICIAN WORD SEPARATOR
+
+# Total code points: 29
+
+# ================================================
+
+A840..A873 ; Phags_Pa # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A874..A877 ; Phags_Pa # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD
+
+# Total code points: 56
+
+# ================================================
+
+07C0..07C9 ; Nko # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE
+07CA..07EA ; Nko # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07EB..07F3 ; Nko # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5 ; Nko # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07F6 ; Nko # So NKO SYMBOL OO DENNEN
+07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
+07FA ; Nko # Lm NKO LAJANYALAN
+
+# Total code points: 59
+
+# ================================================
+
+1B80..1B81 ; Sundanese # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82 ; Sundanese # Mc SUNDANESE SIGN PANGWISAD
+1B83..1BA0 ; Sundanese # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BA1 ; Sundanese # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5 ; Sundanese # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7 ; Sundanese # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9 ; Sundanese # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA ; Sundanese # Mc SUNDANESE SIGN PAMAAEH
+1BAE..1BAF ; Sundanese # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1BB0..1BB9 ; Sundanese # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE
+
+# Total code points: 55
+
+# ================================================
+
+1C00..1C23 ; Lepcha # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C24..1C2B ; Lepcha # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33 ; Lepcha # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35 ; Lepcha # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1C36..1C37 ; Lepcha # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C3B..1C3F ; Lepcha # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+1C40..1C49 ; Lepcha # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+1C4D..1C4F ; Lepcha # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+
+# Total code points: 74
+
+# ================================================
+
+1C50..1C59 ; Ol_Chiki # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE
+1C5A..1C77 ; Ol_Chiki # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; Ol_Chiki # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1C7E..1C7F ; Ol_Chiki # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+
+# Total code points: 48
+
+# ================================================
+
+A500..A60B ; Vai # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; Vai # Lm VAI SYLLABLE LENGTHENER
+A60D..A60F ; Vai # Po [3] VAI COMMA..VAI QUESTION MARK
+A610..A61F ; Vai # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A620..A629 ; Vai # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE
+A62A..A62B ; Vai # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+
+# Total code points: 300
+
+# ================================================
+
+A880..A881 ; Saurashtra # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A882..A8B3 ; Saurashtra # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8B4..A8C3 ; Saurashtra # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A8C4 ; Saurashtra # Mn SAURASHTRA SIGN VIRAMA
+A8CE..A8CF ; Saurashtra # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A8D0..A8D9 ; Saurashtra # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+
+# Total code points: 81
+
+# ================================================
+
+A900..A909 ; Kayah_Li # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE
+A90A..A925 ; Kayah_Li # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A926..A92D ; Kayah_Li # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A92E..A92F ; Kayah_Li # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA
+
+# Total code points: 48
+
+# ================================================
+
+A930..A946 ; Rejang # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A947..A951 ; Rejang # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952..A953 ; Rejang # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A95F ; Rejang # Po REJANG SECTION MARK
+
+# Total code points: 37
+
+# ================================================
+
+10280..1029C ; Lycian # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+
+# Total code points: 29
+
+# ================================================
+
+102A0..102D0 ; Carian # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+
+# Total code points: 49
+
+# ================================================
+
+10920..10939 ; Lydian # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+1093F ; Lydian # Po LYDIAN TRIANGULAR MARK
+
+# Total code points: 27
+
+# ================================================
+
+AA00..AA28 ; Cham # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA29..AA2E ; Cham # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30 ; Cham # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32 ; Cham # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34 ; Cham # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36 ; Cham # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA40..AA42 ; Cham # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA43 ; Cham # Mn CHAM CONSONANT SIGN FINAL NG
+AA44..AA4B ; Cham # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA4C ; Cham # Mn CHAM CONSONANT SIGN FINAL M
+AA4D ; Cham # Mc CHAM CONSONANT SIGN FINAL H
+AA50..AA59 ; Cham # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE
+AA5C..AA5F ; Cham # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA
+
+# Total code points: 83
+
+# ================================================
+
+1A20..1A54 ; Tai_Tham # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
+1A55 ; Tai_Tham # Mc TAI THAM CONSONANT SIGN MEDIAL RA
+1A56 ; Tai_Tham # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A57 ; Tai_Tham # Mc TAI THAM CONSONANT SIGN LA TANG LAI
+1A58..1A5E ; Tai_Tham # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60 ; Tai_Tham # Mn TAI THAM SIGN SAKOT
+1A61 ; Tai_Tham # Mc TAI THAM VOWEL SIGN A
+1A62 ; Tai_Tham # Mn TAI THAM VOWEL SIGN MAI SAT
+1A63..1A64 ; Tai_Tham # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA
+1A65..1A6C ; Tai_Tham # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A6D..1A72 ; Tai_Tham # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1A73..1A7C ; Tai_Tham # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; Tai_Tham # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1A80..1A89 ; Tai_Tham # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE
+1A90..1A99 ; Tai_Tham # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE
+1AA0..1AA6 ; Tai_Tham # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA
+1AA7 ; Tai_Tham # Lm TAI THAM SIGN MAI YAMOK
+1AA8..1AAD ; Tai_Tham # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG
+
+# Total code points: 127
+
+# ================================================
+
+AA80..AAAF ; Tai_Viet # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O
+AAB0 ; Tai_Viet # Mn TAI VIET MAI KANG
+AAB1 ; Tai_Viet # Lo TAI VIET VOWEL AA
+AAB2..AAB4 ; Tai_Viet # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB5..AAB6 ; Tai_Viet # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB7..AAB8 ; Tai_Viet # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AAB9..AABD ; Tai_Viet # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN
+AABE..AABF ; Tai_Viet # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC0 ; Tai_Viet # Lo TAI VIET TONE MAI NUENG
+AAC1 ; Tai_Viet # Mn TAI VIET TONE MAI THO
+AAC2 ; Tai_Viet # Lo TAI VIET TONE MAI SONG
+AADB..AADC ; Tai_Viet # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG
+AADD ; Tai_Viet # Lm TAI VIET SYMBOL SAM
+AADE..AADF ; Tai_Viet # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI
+
+# Total code points: 72
+
+# ================================================
+
+10B00..10B35 ; Avestan # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE
+10B39..10B3F ; Avestan # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION
+
+# Total code points: 61
+
+# ================================================
+
+13000..1342E ; Egyptian_Hieroglyphs # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+
+# Total code points: 1071
+
+# ================================================
+
+0800..0815 ; Samaritan # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
+0816..0819 ; Samaritan # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081A ; Samaritan # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+081B..0823 ; Samaritan # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0824 ; Samaritan # Lm SAMARITAN MODIFIER LETTER SHORT A
+0825..0827 ; Samaritan # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0828 ; Samaritan # Lm SAMARITAN MODIFIER LETTER I
+0829..082D ; Samaritan # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0830..083E ; Samaritan # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU
+
+# Total code points: 61
+
+# ================================================
+
+A4D0..A4F7 ; Lisu # Lo [40] LISU LETTER BA..LISU LETTER OE
+A4F8..A4FD ; Lisu # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A4FE..A4FF ; Lisu # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
+
+# Total code points: 48
+
+# ================================================
+
+A6A0..A6E5 ; Bamum # Lo [70] BAMUM LETTER A..BAMUM LETTER KI
+A6E6..A6EF ; Bamum # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A6F0..A6F1 ; Bamum # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A6F2..A6F7 ; Bamum # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK
+
+# Total code points: 88
+
+# ================================================
+
+A980..A982 ; Javanese # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A983 ; Javanese # Mc JAVANESE SIGN WIGNYAN
+A984..A9B2 ; Javanese # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA
+A9B3 ; Javanese # Mn JAVANESE SIGN CECAK TELU
+A9B4..A9B5 ; Javanese # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9B6..A9B9 ; Javanese # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BA..A9BB ; Javanese # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BC ; Javanese # Mn JAVANESE VOWEL SIGN PEPET
+A9BD..A9C0 ; Javanese # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON
+A9C1..A9CD ; Javanese # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH
+A9CF ; Javanese # Lm JAVANESE PANGRANGKEP
+A9D0..A9D9 ; Javanese # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE
+A9DE..A9DF ; Javanese # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN
+
+# Total code points: 91
+
+# ================================================
+
+ABC0..ABE2 ; Meetei_Mayek # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
+ABE3..ABE4 ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE5 ; Meetei_Mayek # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE6..ABE7 ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE8 ; Meetei_Mayek # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABE9..ABEA ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+ABEB ; Meetei_Mayek # Po MEETEI MAYEK CHEIKHEI
+ABEC ; Meetei_Mayek # Mc MEETEI MAYEK LUM IYEK
+ABED ; Meetei_Mayek # Mn MEETEI MAYEK APUN IYEK
+ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
+
+# Total code points: 56
+
+# ================================================
+
+10840..10855 ; Imperial_Aramaic # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW
+10857 ; Imperial_Aramaic # Po IMPERIAL ARAMAIC SECTION SIGN
+10858..1085F ; Imperial_Aramaic # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND
+
+# Total code points: 31
+
+# ================================================
+
+10A60..10A7C ; Old_South_Arabian # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10A7D..10A7E ; Old_South_Arabian # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY
+10A7F ; Old_South_Arabian # Po OLD SOUTH ARABIAN NUMERIC INDICATOR
+
+# Total code points: 32
+
+# ================================================
+
+10B40..10B55 ; Inscriptional_Parthian # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B58..10B5F ; Inscriptional_Parthian # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
+
+# Total code points: 30
+
+# ================================================
+
+10B60..10B72 ; Inscriptional_Pahlavi # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10B78..10B7F ; Inscriptional_Pahlavi # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
+
+# Total code points: 27
+
+# ================================================
+
+10C00..10C48 ; Old_Turkic # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+
+# Total code points: 73
+
+# ================================================
+
+11080..11081 ; Kaithi # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
+11082 ; Kaithi # Mc KAITHI SIGN VISARGA
+11083..110AF ; Kaithi # Lo [45] KAITHI LETTER A..KAITHI LETTER HA
+110B0..110B2 ; Kaithi # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B3..110B6 ; Kaithi # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B7..110B8 ; Kaithi # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+110B9..110BA ; Kaithi # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+110BB..110BC ; Kaithi # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN
+110BD ; Kaithi # Cf KAITHI NUMBER SIGN
+110BE..110C1 ; Kaithi # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
+
+# Total code points: 66
+
+# EOF
diff --git a/boost/spirit/home/support/char_encoding/unicode/UnicodeData.txt b/boost/spirit/home/support/char_encoding/unicode/UnicodeData.txt
new file mode 100644
index 0000000000..77db788cf2
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/UnicodeData.txt
@@ -0,0 +1,19336 @@
+0000;<control>;Cc;0;BN;;;;;N;NULL;;;;
+0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;;
+0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;;
+0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;;
+0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;;
+0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;;
+0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;;
+0007;<control>;Cc;0;BN;;;;;N;BELL;;;;
+0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;;
+0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;;
+000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;;
+000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;;
+000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;;
+000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;;
+000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;;
+000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;;
+0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;;
+0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;;
+0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;;
+0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;;
+0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;;
+0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;;
+0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;;
+0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;;
+0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;;
+0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;;
+001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;;
+001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;;
+001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;;
+001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
+001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;;
+001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;;
+0020;SPACE;Zs;0;WS;;;;;N;;;;;
+0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;;
+0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;;
+0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;;
+0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+0026;AMPERSAND;Po;0;ON;;;;;N;;;;;
+0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
+0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
+0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
+002A;ASTERISK;Po;0;ON;;;;;N;;;;;
+002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;;
+002C;COMMA;Po;0;CS;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
+002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
+002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;;
+0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
+0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
+0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
+0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
+0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
+0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
+0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
+0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
+0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
+0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
+003A;COLON;Po;0;CS;;;;;N;;;;;
+003B;SEMICOLON;Po;0;ON;;;;;N;;;;;
+003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003F;QUESTION MARK;Po;0;ON;;;;;N;;;;;
+0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;;
+0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
+0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062;
+0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063;
+0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064;
+0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065;
+0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066;
+0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067;
+0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068;
+0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069;
+004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A;
+004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B;
+004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C;
+004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D;
+004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E;
+004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F;
+0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070;
+0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071;
+0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072;
+0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073;
+0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074;
+0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075;
+0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076;
+0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077;
+0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078;
+0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079;
+005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A;
+005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;;
+005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;;
+005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;;
+005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;;
+005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;;
+0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;;
+0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
+0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042
+0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043
+0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044
+0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045
+0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046
+0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047
+0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048
+0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
+006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A
+006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B
+006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C
+006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D
+006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E
+006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F
+0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050
+0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
+0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052
+0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053
+0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054
+0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055
+0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056
+0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057
+0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058
+0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059
+007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
+007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;;
+007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;;
+007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;;
+007E;TILDE;Sm;0;ON;;;;;N;;;;;
+007F;<control>;Cc;0;BN;;;;;N;DELETE;;;;
+0080;<control>;Cc;0;BN;;;;;N;;;;;
+0081;<control>;Cc;0;BN;;;;;N;;;;;
+0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;;
+0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;;
+0084;<control>;Cc;0;BN;;;;;N;;;;;
+0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;;
+0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;;
+0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;;
+0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;;
+0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;;
+008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;;
+008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;;
+008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;;
+008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;;
+008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;;
+008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;;
+0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;;
+0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;;
+0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;;
+0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;;
+0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;;
+0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;;
+0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;;
+0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;;
+0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;;
+0099;<control>;Cc;0;BN;;;;;N;;;;;
+009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;;
+009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;;
+009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;;
+009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;;
+009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;;
+009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;;
+00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;;
+00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;;
+00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;;
+00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;;
+00A7;SECTION SIGN;So;0;ON;;;;;N;;;;;
+00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;;
+00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;;
+00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;;
+00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;;
+00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;;
+00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
+00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
+00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
+00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
+00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
+00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;;
+00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C
+00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;;
+00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;;
+00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
+00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;;
+00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;;
+00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
+00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;;
+00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;;
+00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0;
+00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1;
+00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2;
+00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3;
+00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4;
+00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5;
+00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6;
+00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7;
+00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8;
+00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9;
+00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA;
+00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB;
+00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC;
+00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED;
+00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE;
+00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF;
+00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0;
+00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1;
+00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2;
+00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3;
+00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4;
+00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5;
+00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6;
+00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;;
+00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8;
+00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9;
+00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA;
+00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB;
+00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC;
+00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD;
+00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE;
+00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;;
+00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0
+00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1
+00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2
+00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3
+00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4
+00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5
+00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6
+00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7
+00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8
+00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9
+00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA
+00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB
+00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC
+00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD
+00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE
+00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF
+00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0
+00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1
+00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2
+00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3
+00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4
+00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5
+00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6
+00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8
+00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9
+00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA
+00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB
+00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC
+00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD
+00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE
+00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178
+0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101;
+0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100
+0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103;
+0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102
+0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105;
+0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104
+0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107;
+0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106
+0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109;
+0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108
+010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B;
+010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A
+010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D;
+010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C
+010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F;
+010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E
+0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111;
+0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110
+0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113;
+0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112
+0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115;
+0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114
+0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117;
+0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116
+0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119;
+0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118
+011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B;
+011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A
+011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D;
+011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C
+011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F;
+011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E
+0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121;
+0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120
+0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123;
+0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122
+0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125;
+0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124
+0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127;
+0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126
+0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129;
+0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128
+012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
+012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
+012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D;
+012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C
+012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F;
+012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E
+0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069;
+0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
+0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133;
+0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
+0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135;
+0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134
+0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137;
+0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136
+0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;;
+0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
+013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139
+013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C;
+013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B
+013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E;
+013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D
+013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
+0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F
+0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
+0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141
+0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144;
+0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143
+0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146;
+0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145
+0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148;
+0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
+0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;;
+014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B;
+014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A
+014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D;
+014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C
+014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F;
+014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E
+0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151;
+0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150
+0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153;
+0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152
+0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155;
+0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154
+0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157;
+0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156
+0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159;
+0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158
+015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B;
+015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A
+015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D;
+015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C
+015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F;
+015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E
+0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161;
+0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160
+0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163;
+0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162
+0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165;
+0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164
+0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167;
+0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166
+0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169;
+0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168
+016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B;
+016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A
+016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D;
+016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C
+016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F;
+016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E
+0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171;
+0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170
+0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173;
+0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172
+0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175;
+0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174
+0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177;
+0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176
+0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF;
+0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A;
+017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179
+017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C;
+017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B
+017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
+017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
+017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053
+0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243
+0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
+0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
+0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
+0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185;
+0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184
+0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254;
+0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188;
+0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187
+0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256;
+018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257;
+018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C;
+018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B
+018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;;
+018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD;
+018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259;
+0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B;
+0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192;
+0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191
+0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260;
+0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263;
+0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6
+0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269;
+0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
+0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
+0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
+019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D
+019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
+019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
+019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
+019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220
+019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275;
+01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1;
+01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0
+01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3;
+01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2
+01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
+01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
+01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280;
+01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
+01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
+01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
+01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;;
+01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;;
+01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD;
+01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC
+01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288;
+01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0;
+01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF
+01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A;
+01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B;
+01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4;
+01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3
+01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6;
+01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5
+01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292;
+01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9;
+01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8
+01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;;
+01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;;
+01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD;
+01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC
+01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;;
+01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7
+01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;;
+01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;;
+01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
+01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
+01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
+01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5
+01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
+01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
+01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8
+01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
+01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
+01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB
+01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
+01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
+01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
+01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0;
+01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF
+01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2;
+01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1
+01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4;
+01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3
+01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6;
+01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5
+01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8;
+01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7
+01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA;
+01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9
+01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC;
+01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB
+01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E
+01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF;
+01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE
+01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1;
+01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0
+01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3;
+01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2
+01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5;
+01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4
+01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7;
+01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6
+01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9;
+01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8
+01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB;
+01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA
+01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED;
+01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC
+01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF;
+01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
+01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
+01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2
+01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2
+01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2
+01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
+01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
+01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195;
+01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF;
+01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9;
+01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8
+01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB;
+01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA
+01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD;
+01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC
+01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF;
+01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE
+0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201;
+0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200
+0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203;
+0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202
+0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205;
+0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204
+0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207;
+0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206
+0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209;
+0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208
+020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B;
+020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A
+020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D;
+020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C
+020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F;
+020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E
+0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211;
+0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210
+0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213;
+0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212
+0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215;
+0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214
+0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217;
+0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216
+0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219;
+0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218
+021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B;
+021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A
+021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D;
+021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C
+021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
+021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
+0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E;
+0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;;
+0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
+0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
+0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
+0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224
+0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227;
+0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226
+0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229;
+0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228
+022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B;
+022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A
+022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D;
+022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C
+022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F;
+022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E
+0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231;
+0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
+0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
+0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
+0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
+0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
+0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
+0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;;
+0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;;
+0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;;
+023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65;
+023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C;
+023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B
+023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A;
+023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66;
+023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242;
+0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241
+0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180;
+0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289;
+0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C;
+0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247;
+0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246
+0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249;
+0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248
+024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B;
+024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A
+024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D;
+024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C
+024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F;
+024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E
+0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F
+0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D
+0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;;
+0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
+0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
+0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;;
+0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189
+0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A
+0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;;
+0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F
+025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;;
+025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190
+025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;;
+025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;;
+025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;;
+025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;;
+0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193
+0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;;
+0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;;
+0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194
+0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;;
+0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;;
+0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;;
+0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;;
+0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
+0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
+026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;;
+026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62
+026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;;
+026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
+026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
+026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
+0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E
+0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
+0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
+0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
+0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F
+0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;;
+0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;;
+0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;;
+0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;;
+027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
+027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64
+027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
+027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
+0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6
+0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
+0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
+0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
+0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
+0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
+0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
+0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;;
+0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
+0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244
+028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
+028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
+028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245
+028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
+028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
+028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
+0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;;
+0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
+0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
+0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
+0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
+0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
+0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;;
+0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;;
+029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;;
+029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;;
+029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;;
+029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;;
+029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;;
+029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;;
+02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;;
+02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;;
+02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;;
+02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;;
+02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;;
+02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;;
+02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;;
+02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;;
+02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;;
+02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
+02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
+02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
+02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;;
+02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;;
+02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;;
+02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;;
+02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;;
+02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;;
+02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;;
+02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;;
+02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
+02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
+02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;;
+02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;Mandarin Chinese first tone;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
+02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
+02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;;
+02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;;
+02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;;
+02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;;
+02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;;
+02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;;
+02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;;
+02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;;
+02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;;
+02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;;
+02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;;
+02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;;
+02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;;
+02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;;
+02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;;
+02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;;
+02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;;
+02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
+02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;;
+02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;;
+02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;;
+02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;;
+02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;;
+02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;;
+0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;;
+0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia, Tonos;;;
+0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
+0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;;
+0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;;
+0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;;
+0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;;
+0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
+0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;;
+0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;;
+030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;;
+030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;;
+030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;;
+030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;;
+030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;;
+030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;;
+0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;;
+0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;;
+0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;;
+0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;;
+0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;;
+0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;;
+0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;;
+0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;;
+0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;;
+0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;;
+031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;;
+031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;;
+031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;;
+031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;;
+031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;;
+031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;;
+0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;;
+0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;;
+0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;;
+0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;
+0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;;
+0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;;
+0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;;
+0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;;
+0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;;
+0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;;
+032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;;
+032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;;
+032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;;
+032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
+032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;;
+032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;;
+0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;;
+0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;;
+0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;;
+0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;;
+0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;;
+0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;;
+0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;;
+0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;;
+0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;;
+0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;;
+033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;;
+033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;;
+033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;;
+033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;;
+033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;;
+033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;;
+0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;;
+0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;;
+0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;;
+0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;;
+0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;;
+0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399
+0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
+0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;;
+034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;;
+034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;;
+034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;;
+034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;;
+0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;;
+0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;;
+0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
+0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;;
+035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;;
+035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
+035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
+035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
+035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;;
+0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
+0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
+0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
+0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;;
+0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;;
+0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;;
+0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;;
+0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;;
+0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;;
+0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;;
+036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;;
+036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;;
+036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;;
+036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;;
+036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;;
+036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;;
+0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371;
+0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370
+0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373;
+0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372
+0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
+0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;;
+0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377;
+0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376
+037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
+037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD
+037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE
+037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF
+037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;;
+0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;;
+0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
+0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC;
+0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;;
+0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD;
+0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE;
+038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF;
+038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC;
+038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD;
+038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE;
+0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;;
+0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1;
+0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2;
+0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3;
+0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4;
+0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5;
+0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6;
+0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7;
+0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;
+0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9;
+039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA;
+039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB;
+039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC;
+039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD;
+039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE;
+039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF;
+03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0;
+03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
+03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
+03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4;
+03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5;
+03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6;
+03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7;
+03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8;
+03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9;
+03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA;
+03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB;
+03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386
+03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388
+03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389
+03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A
+03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;;
+03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391
+03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
+03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393
+03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394
+03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395
+03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396
+03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397
+03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399
+03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A
+03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B
+03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C
+03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D
+03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E
+03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F
+03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0
+03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
+03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4
+03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5
+03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6
+03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7
+03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8
+03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9
+03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA
+03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB
+03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
+03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
+03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
+03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7;
+03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
+03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
+03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;;
+03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
+03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
+03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
+03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF
+03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9;
+03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8
+03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
+03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA
+03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD;
+03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC
+03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF;
+03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE
+03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1;
+03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0
+03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3;
+03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2
+03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5;
+03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4
+03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7;
+03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6
+03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9;
+03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8
+03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB;
+03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA
+03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED;
+03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC
+03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF;
+03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
+03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
+03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
+03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9
+03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;;
+03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;
+03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395
+03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;;
+03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8;
+03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7
+03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2;
+03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
+03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
+03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;;
+03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B;
+03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C;
+03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D;
+0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
+0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
+0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452;
+0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453;
+0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454;
+0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455;
+0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456;
+0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457;
+0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458;
+0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459;
+040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A;
+040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B;
+040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C;
+040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D;
+040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E;
+040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F;
+0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430;
+0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431;
+0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432;
+0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433;
+0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434;
+0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435;
+0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436;
+0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437;
+0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438;
+0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439;
+041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A;
+041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B;
+041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C;
+041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D;
+041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E;
+041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F;
+0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440;
+0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441;
+0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442;
+0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443;
+0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444;
+0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445;
+0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446;
+0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447;
+0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448;
+0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449;
+042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A;
+042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B;
+042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C;
+042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D;
+042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E;
+042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F;
+0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410
+0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411
+0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412
+0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413
+0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414
+0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415
+0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416
+0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417
+0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418
+0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419
+043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A
+043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B
+043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C
+043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D
+043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E
+043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F
+0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420
+0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421
+0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422
+0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423
+0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424
+0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425
+0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426
+0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427
+0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428
+0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429
+044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
+044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B
+044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C
+044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D
+044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E
+044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F
+0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400
+0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401
+0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402
+0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403
+0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404
+0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
+0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406
+0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407
+0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408
+0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409
+045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A
+045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B
+045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C
+045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D
+045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E
+045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F
+0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461;
+0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460
+0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463;
+0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462
+0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465;
+0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464
+0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467;
+0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466
+0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469;
+0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468
+046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B;
+046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A
+046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D;
+046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C
+046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F;
+046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E
+0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471;
+0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470
+0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473;
+0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472
+0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475;
+0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474
+0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477;
+0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476
+0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479;
+0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478
+047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B;
+047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A
+047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D;
+047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C
+047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F;
+047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E
+0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481;
+0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480
+0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;;
+0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;;
+0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
+0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
+0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
+0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;;
+0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
+0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B;
+048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A
+048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D;
+048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C
+048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F;
+048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E
+0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491;
+0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490
+0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493;
+0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492
+0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495;
+0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494
+0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497;
+0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496
+0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499;
+0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498
+049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B;
+049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A
+049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D;
+049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C
+049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F;
+049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E
+04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1;
+04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0
+04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3;
+04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2
+04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5;
+04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4
+04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7;
+04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6
+04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9;
+04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8
+04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB;
+04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA
+04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD;
+04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC
+04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF;
+04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE
+04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1;
+04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0
+04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3;
+04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2
+04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5;
+04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4
+04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7;
+04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6
+04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9;
+04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8
+04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB;
+04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA
+04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD;
+04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
+04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
+04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
+04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF;
+04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
+04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
+04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
+04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3
+04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6;
+04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5
+04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8;
+04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7
+04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA;
+04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9
+04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC;
+04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
+04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE;
+04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD
+04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0
+04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
+04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
+04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
+04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2
+04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5;
+04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4
+04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7;
+04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6
+04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9;
+04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8
+04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB;
+04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA
+04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD;
+04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC
+04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF;
+04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE
+04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1;
+04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0
+04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3;
+04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2
+04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5;
+04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4
+04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7;
+04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6
+04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9;
+04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8
+04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB;
+04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA
+04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED;
+04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC
+04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF;
+04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE
+04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1;
+04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0
+04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3;
+04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
+04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
+04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
+04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7;
+04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6
+04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
+04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
+04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB;
+04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA
+04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD;
+04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC
+04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF;
+04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE
+0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501;
+0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500
+0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503;
+0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502
+0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505;
+0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504
+0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507;
+0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506
+0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509;
+0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508
+050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B;
+050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A
+050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D;
+050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C
+050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F;
+050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E
+0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511;
+0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510
+0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513;
+0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512
+0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515;
+0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514
+0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517;
+0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516
+0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519;
+0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518
+051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B;
+051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A
+051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D;
+051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C
+051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F;
+051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E
+0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521;
+0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520
+0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523;
+0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522
+0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
+0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
+0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
+0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564;
+0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565;
+0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566;
+0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567;
+0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568;
+0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569;
+053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A;
+053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B;
+053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C;
+053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D;
+053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E;
+053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F;
+0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570;
+0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571;
+0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572;
+0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573;
+0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574;
+0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575;
+0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576;
+0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577;
+0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578;
+0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579;
+054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A;
+054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B;
+054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C;
+054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D;
+054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E;
+054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F;
+0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580;
+0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581;
+0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582;
+0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583;
+0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584;
+0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585;
+0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586;
+0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;;
+055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;;
+055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;;
+055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
+055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
+055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
+0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
+0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
+0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534
+0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535
+0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536
+0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537
+0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538
+0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539
+056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A
+056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B
+056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C
+056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D
+056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E
+056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F
+0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540
+0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541
+0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542
+0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543
+0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544
+0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545
+0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546
+0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547
+0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548
+0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549
+057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A
+057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B
+057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C
+057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D
+057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E
+057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F
+0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550
+0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551
+0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552
+0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553
+0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554
+0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
+0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
+0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
+058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
+0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;;
+0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;;
+0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;;
+0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;;
+0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;;
+0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;;
+0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;;
+0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;;
+0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;;
+059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;;
+059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;;
+059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;;
+059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;;
+059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;;
+059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
+05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
+05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
+05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;;
+05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
+05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
+05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;;
+05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;;
+05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;;
+05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;;
+05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;;
+05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;;
+05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;;
+05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;;
+05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;;
+05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;;
+05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;;
+05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;;
+05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;;
+05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;;
+05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;;
+05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;;
+05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;;
+05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;;
+05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
+05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
+05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
+05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;;
+05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
+05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;;
+05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;;
+05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;;
+05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
+05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;;
+05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
+05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
+05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;;
+05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
+05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;;
+05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;;
+05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;;
+05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
+05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
+05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;;
+05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;;
+05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;;
+05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;;
+05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;;
+05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;;
+05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;;
+05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;;
+05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;;
+05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
+05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;;
+05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;;
+05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;;
+05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;;
+05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;;
+05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;;
+05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;;
+05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;;
+05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
+05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
+05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
+05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
+05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
+05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
+05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
+0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;;
+0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;;
+0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;;
+0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;;
+0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;;
+0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;;
+0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;;
+0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;;
+060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
+060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
+060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;;
+0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
+0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
+0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
+0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;;
+0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;;
+0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;;
+0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;;
+0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;;
+061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;;
+061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;;
+061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
+0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
+0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
+0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;;
+0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;;
+0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;;
+0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;;
+0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;;
+0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;;
+0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;;
+062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;;
+062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;;
+062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
+062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;;
+062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;;
+062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;;
+0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;;
+0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;;
+0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;;
+0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;;
+0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;;
+0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;;
+0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;;
+0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
+0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
+063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
+063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
+0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
+0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
+0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;;
+0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;;
+0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;;
+0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;;
+0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;;
+0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;;
+064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;;
+064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;;
+064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;;
+064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;;
+064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;;
+064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;;
+0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;;
+0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;;
+0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;;
+0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
+0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
+0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
+0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
+0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;;
+065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;;
+065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;;
+0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
+066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;;
+066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;;
+066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;;
+066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;;
+066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;;
+0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;;
+0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;;
+0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;;
+0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;;
+0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;;
+0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;;
+0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;;
+0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;;
+0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;;
+0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;;
+067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;;
+067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;;
+067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;;
+067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;;
+067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;;
+067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;;
+0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;;
+0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;;
+0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;;
+0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;;
+0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;;
+0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;;
+0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;;
+0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;;
+0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;;
+0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;;
+068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;;
+068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;;
+068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;;
+068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;;
+0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;;
+0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;;
+0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;;
+0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;;
+0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;;
+0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;;
+0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;;
+0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;;
+0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;;
+069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;;
+06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;;
+06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;;
+06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;;
+06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;;
+06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;;
+06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;;
+06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;;
+06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;;
+06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;;
+06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;;
+06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;;
+06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;;
+06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;;
+06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;;
+06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;;
+06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;;
+06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;;
+06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;;
+06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;;
+06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;;
+06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;;
+06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;;
+06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;;
+06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;;
+06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;;
+06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;;
+06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;;
+06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;;
+06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;;
+06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;;
+06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;;
+06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;;
+06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;;
+06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;;
+06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;;
+06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;;
+06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;;
+06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;;
+06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;;
+06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;;
+06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;;
+06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;;
+06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;;
+06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;;
+06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;;
+06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;;
+06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;;
+06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;;
+06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;;
+06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;;
+06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;;
+06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;;
+06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;;
+06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;;
+06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;;
+06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;;
+06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;;
+06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;;
+06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;;
+06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;;
+06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;;
+06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;;
+06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;;
+06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;;
+06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;;
+06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;;
+06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;;
+06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;;
+06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;;
+06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;;
+06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;;
+06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;;
+06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;;
+06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;;
+0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;;
+0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;;
+0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;;
+0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;;
+070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;;
+070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;;
+070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;;
+070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;;
+0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;;
+0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;;
+0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;;
+0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;;
+0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;;
+0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;;
+0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;;
+0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;;
+0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;;
+071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;;
+071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;;
+071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;;
+071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;;
+071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;;
+0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;;
+0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;;
+0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;;
+0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;;
+0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;;
+0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;;
+0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;;
+0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;;
+072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;;
+072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;;
+072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;;
+072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;;
+072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;;
+0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;;
+0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;;
+073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;;
+073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;;
+0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;;
+0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;;
+0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;;
+0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;;
+074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;;
+074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;;
+074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;;
+074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;;
+0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;;
+0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;;
+075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;;
+075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;;
+0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;;
+076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;;
+076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;;
+0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;;
+077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
+0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
+0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;;
+0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;;
+0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;;
+0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;;
+0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;;
+0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;;
+078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;;
+078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;;
+078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;;
+078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;;
+078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;;
+078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;;
+0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;;
+0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;;
+0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;;
+0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;;
+0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;;
+0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;;
+0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;;
+0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;;
+0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;;
+079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;;
+079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;;
+079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;;
+079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;;
+079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;;
+079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;;
+07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;;
+07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;;
+07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;;
+07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;;
+07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;;
+07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;;
+07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;;
+07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;;
+07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;;
+07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;;
+07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;;
+07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;;
+07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;;
+07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;;
+07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;;
+07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;;
+07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;;
+07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;;
+07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
+07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
+07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
+07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;;
+07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;;
+07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;;
+07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;;
+07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;;
+07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;;
+07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
+07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;;
+07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;;
+07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;;
+07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;;
+07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;;
+07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;;
+07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;;
+07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;;
+07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;;
+07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;;
+07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;;
+07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;;
+07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;;
+07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;;
+07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;;
+07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;;
+07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;;
+07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;;
+07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;;
+07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;;
+07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;;
+07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;;
+07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;;
+07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;;
+07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;;
+07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;;
+07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;;
+07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;;
+07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;;
+07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;;
+07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;;
+07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;;
+07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
+07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;;
+07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;;
+07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
+07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;;
+0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;;
+0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;;
+0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
+0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;;
+0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;;
+0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;;
+090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;;
+090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;;
+090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;;
+090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;;
+0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;;
+0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;;
+0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;;
+0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;;
+0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;;
+0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;;
+0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;;
+0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;;
+091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;;
+091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;;
+091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;;
+091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;;
+091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;;
+091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;;
+0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;;
+0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;;
+0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;;
+0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;;
+092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;;
+092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;;
+092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;;
+092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;;
+092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;;
+092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;;
+0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;;
+0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;;
+0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;;
+0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;;
+0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;;
+0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;;
+0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;;
+093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;;
+0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;;
+094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;;
+0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;;
+0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;;
+0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;;
+0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;;
+095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;;
+095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;;
+095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;;
+095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;;
+095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;;
+095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;;
+0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;;
+0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;;
+0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;;
+097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;;
+097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;;
+0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;;
+0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;;
+0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;;
+0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;;
+0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;;
+098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;;
+098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;;
+0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;;
+0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;;
+0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;;
+0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;;
+0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;;
+0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;;
+099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;;
+099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;;
+099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;;
+099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;;
+099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;;
+099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;;
+09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;;
+09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;;
+09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;;
+09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;;
+09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;;
+09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;;
+09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;;
+09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;;
+09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;;
+09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;;
+09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;;
+09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;;
+09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;;
+09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;;
+09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;;
+09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;;
+09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;;
+09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;;
+09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;;
+09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;;
+09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;;
+09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;;
+09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;;
+09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;;
+09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;;
+09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;;
+09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;;
+09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;;
+09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;;
+09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;;
+09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;;
+09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;;
+09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;;
+09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
+09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
+0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;;
+0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;;
+0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;;
+0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;;
+0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;;
+0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;;
+0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;;
+0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;;
+0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;;
+0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;;
+0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;;
+0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;;
+0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;;
+0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;;
+0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;;
+0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;;
+0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;;
+0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;;
+0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;;
+0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;;
+0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;;
+0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;;
+0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;;
+0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;;
+0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;;
+0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;;
+0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;;
+0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;;
+0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;;
+0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;;
+0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
+0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
+0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;;
+0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;;
+0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;;
+0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;;
+0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;;
+0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;;
+0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;;
+0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;;
+0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;;
+0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;;
+0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;;
+0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;;
+0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;;
+0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;;
+0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;;
+0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;;
+0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;;
+0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;;
+0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;;
+0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;;
+0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;;
+0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;;
+0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;;
+0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;;
+0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;;
+0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;;
+0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;;
+0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;;
+0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;;
+0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;;
+0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;;
+0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;;
+0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;;
+0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;;
+0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;;
+0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;;
+0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;;
+0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;;
+0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;;
+0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;;
+0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;;
+0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;;
+0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;;
+0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;;
+0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;;
+0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;;
+0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;;
+0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;;
+0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;;
+0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;;
+0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;;
+0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;;
+0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;;
+0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;;
+0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;;
+0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;;
+0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;;
+0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;;
+0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;;
+0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;;
+0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;;
+0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;;
+0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;;
+0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;;
+0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;;
+0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;;
+0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;;
+0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;;
+0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;;
+0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;;
+0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;;
+0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;;
+0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;;
+0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;;
+0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;;
+0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;;
+0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;;
+0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;;
+0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;;
+0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;;
+0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;;
+0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;;
+0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;;
+0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;;
+0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;;
+0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;;
+0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;;
+0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;;
+0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;;
+0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;;
+0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;;
+0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;;
+0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;;
+0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;;
+0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;;
+0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;Naal;;;
+0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;Maatham;;;
+0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;Varudam;;;
+0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;Patru;;;
+0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;Varavu;;;
+0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;Merpadi;;;
+0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;Rupai;;;
+0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;Enn;;;
+0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
+0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
+0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
+0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
+0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;;
+0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;;
+0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;;
+0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;;
+0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;;
+0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;;
+0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;;
+0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;;
+0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;;
+0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;;
+0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;;
+0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;;
+0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;;
+0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;;
+0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;;
+0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;;
+0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;;
+0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;;
+0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;;
+0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;;
+0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;;
+0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;;
+0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;;
+0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;;
+0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;;
+0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;;
+0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;;
+0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;;
+0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;;
+0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;;
+0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;;
+0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;;
+0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;;
+0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
+0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
+0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;;
+0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;;
+0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;;
+0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;;
+0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;;
+0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;;
+0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;;
+0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
+0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
+0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
+0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;;
+0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;;
+0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;;
+0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;;
+0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;;
+0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;;
+0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;;
+0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;;
+0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;;
+0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;;
+0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;;
+0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;;
+0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;;
+0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;;
+0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;;
+0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;;
+0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;;
+0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;;
+0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;;
+0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;;
+0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;;
+0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;;
+0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;;
+0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;;
+0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;;
+0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;;
+0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;;
+0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;;
+0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;;
+0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;;
+0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;;
+0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;;
+0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;;
+0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;;
+0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
+0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;;
+0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;N;;;;;
+0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
+0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;;
+0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;;
+0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;;
+0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;;
+0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;;
+0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;;
+0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;;
+0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;;
+0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;;
+0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;;
+0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;;
+0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;;
+0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;;
+0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;;
+0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;;
+0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;;
+0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;;
+0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;;
+0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;;
+0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;;
+0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;;
+0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;;
+0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;;
+0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;;
+0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;;
+0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;;
+0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;;
+0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
+0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;;
+0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;;
+0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;;
+0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;;
+0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
+0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;;
+0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
+0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;;
+0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;;
+0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;;
+0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;;
+0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;;
+0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;;
+0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;;
+0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
+0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
+0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
+0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;;
+0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;;
+0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;;
+0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;;
+0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;;
+0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;;
+0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;;
+0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;;
+0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;;
+0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;;
+0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;;
+0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;;
+0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;;
+0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;;
+0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;;
+0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;;
+0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;;
+0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;;
+0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;;
+0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;;
+0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;;
+0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;;
+0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;;
+0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;;
+0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;;
+0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;;
+0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;;
+0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;;
+0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;;
+0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;;
+0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;;
+0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;;
+0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;;
+0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;;
+0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;;
+0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;;
+0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;;
+0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;;
+0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;;
+0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;;
+0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;;
+0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;;
+0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;;
+0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;;
+0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;;
+0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;;
+0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;;
+0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;;
+0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;;
+0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;;
+0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;;
+0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;;
+0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;;
+0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;;
+0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;;
+0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;;
+0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;;
+0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;;
+0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;;
+0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;;
+0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;;
+0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;;
+0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;;
+0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;;
+0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;;
+0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;;
+0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;;
+0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;;
+0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;;
+0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;;
+0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;;
+0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;;
+0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;;
+0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;;
+0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;;
+0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;;
+0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;;
+0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;;
+0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;;
+0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;;
+0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;;
+0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;;
+0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;;
+0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;;
+0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;;
+0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;;
+0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;;
+0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;;
+0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;;
+0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;;
+0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;;
+0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;;
+0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;;
+0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;;
+0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;;
+0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;;
+0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;;
+0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;;
+0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;;
+0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;;
+0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;;
+0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;;
+0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;;
+0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;;
+0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;;
+0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;;
+0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;;
+0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;;
+0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;;
+0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
+0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
+0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
+0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
+0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
+0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
+0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
+0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
+0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
+0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;;
+0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
+0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
+0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
+0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
+0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
+0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
+0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
+0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
+0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
+0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
+0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;;
+0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;;
+0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;;
+0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
+0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
+0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
+0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
+0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;;
+0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;;
+0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;;
+0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;;
+0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;;
+0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;;
+0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
+0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
+0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;;
+0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;;
+0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;;
+0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;;
+0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;;
+0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;;
+0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;;
+0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;;
+0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;;
+0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;;
+0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;;
+0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;;
+0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;;
+0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;tsek tar;;;
+0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;;
+0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;;
+0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;;
+0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;;
+0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;;
+0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;;
+0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;;
+0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;;
+0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;;
+0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;;
+0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;;
+0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;;
+0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;;
+0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;;
+0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;;
+0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;;
+0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;;
+0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;;
+0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;;
+0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;
+0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;;
+0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;;
+0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;;
+0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;;
+0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;;
+0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;ang kang ye;;;
+0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;;
+0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;;
+0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
+0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;;
+0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;;
+0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;;
+0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;;
+0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;;
+0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;;
+0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;;
+0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;;
+0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;;
+0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;;
+0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;;
+0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;;
+0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;;
+0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;;
+0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;;
+0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;;
+0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;;
+0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;;
+0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;;
+0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;;
+0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;;
+0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;;
+0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;;
+0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;;
+0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;;
+0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;;
+0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;;
+0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;;
+0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;;
+0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;;
+0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;;
+0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
+0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
+0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;;
+0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;;
+0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;;
+0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
+0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
+0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
+0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;;
+0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;;
+0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;;
+0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;;
+0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;;
+0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;;
+0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;;
+0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;;
+0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;;
+0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;;
+0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;;
+0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;;
+0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;;
+0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;;
+0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;;
+0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;;
+0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;;
+0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;;
+0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;;
+0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;;
+0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;;
+0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;;
+0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;;
+0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;;
+0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;;
+0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;;
+0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;;
+0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;;
+0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;;
+0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;;
+0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;;
+0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;;
+0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;;
+0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;;
+0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;;
+0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;;
+0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;;
+0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;;
+0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;;
+0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;;
+0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;;
+0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;;
+0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;;
+0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;;
+0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;;
+0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;;
+0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;;
+0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;;
+0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;;
+0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;;
+0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;;
+0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;;
+0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;;
+0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;;
+0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
+0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
+0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
+0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;dena deka;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;;
+0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;;
+0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;;
+0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;nyi tsek;;;
+0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;da nying yik go dun ma;;;
+0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;da nying yik go kab ma;;;
+1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
+1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
+1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
+1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;;
+1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;;
+1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;;
+1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;;
+1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;;
+1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;;
+100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;;
+100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;;
+100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;;
+100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;;
+100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;;
+1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;;
+1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;;
+1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;;
+1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;;
+1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;;
+1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;;
+1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;;
+1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;;
+1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;;
+1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;;
+101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;;
+101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;;
+101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;;
+101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;;
+101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;;
+101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;;
+1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;;
+1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;;
+1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;;
+1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;;
+1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;;
+1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;;
+1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;;
+1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;;
+1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;;
+1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;;
+102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;;
+102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;;
+102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;;
+1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;;
+1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;;
+1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;;
+103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;;
+103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;;
+103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;;
+103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;;
+1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;;
+104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;;
+104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;;
+104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;;
+104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;;
+104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;;
+1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;;
+1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;;
+1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;;
+105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;;
+105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;;
+105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;;
+105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;;
+105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;;
+1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
+1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;;
+1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;;
+1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;;
+1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;;
+1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;;
+1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;;
+1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;;
+1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;;
+1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;;
+106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;;
+106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;;
+106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;;
+106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;;
+106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;;
+106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;;
+1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;;
+1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;;
+1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;;
+1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;;
+1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;;
+1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;;
+1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;;
+1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;;
+1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;;
+1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;;
+107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;;
+107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;;
+107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;;
+107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;;
+107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;;
+107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;;
+1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;;
+1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;;
+1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;;
+1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;;
+1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;;
+1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;;
+1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;;
+1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;;
+108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;;
+108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;;
+108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;;
+108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;;
+108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;;
+108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;;
+1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;;
+109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;;
+10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;2D00;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25;
+10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
+10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
+10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
+10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
+10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
+10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
+10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
+10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
+10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
+10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
+10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
+10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
+10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
+10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
+10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
+10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
+10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
+10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
+10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
+10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
+10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
+10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
+10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
+10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
+10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
+10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
+10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
+10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
+10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
+10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
+10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
+10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
+10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
+10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
+10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
+10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
+10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
+10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
+10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
+10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
+10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
+10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
+10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
+10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;;
+1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;;
+1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;;
+1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;;
+1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;;
+110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;;
+110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;;
+1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;;
+111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;;
+111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;;
+1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;;
+1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;;
+112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;;
+112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;;
+112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;;
+1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;;
+1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;;
+113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;;
+113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;;
+113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;;
+113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;;
+1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;;
+1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;;
+1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;;
+1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;;
+114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;;
+114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;;
+114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;;
+114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;;
+114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;;
+1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;;
+1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;;
+1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;;
+1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;;
+1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;;
+1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;;
+1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;;
+1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;;
+1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;;
+1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;;
+1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;;
+116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;;
+116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;;
+116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;;
+116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;;
+116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;;
+116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;;
+1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;;
+1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;;
+1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;;
+1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;;
+1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;;
+1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;;
+1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;;
+1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;;
+1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;;
+1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;;
+117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;;
+117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;;
+117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;;
+117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;;
+117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;;
+117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;;
+1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;;
+1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;;
+1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;;
+1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;;
+1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;;
+1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;;
+1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;;
+1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;;
+1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;;
+1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;;
+118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;;
+118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;;
+118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;;
+118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;;
+118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;;
+118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;;
+1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;;
+1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;;
+1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;;
+1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;;
+1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;;
+1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;;
+1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;;
+1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;;
+1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;;
+1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;;
+119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;;
+119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;;
+119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;;
+119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;;
+119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;;
+119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;;
+11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;;
+11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;;
+11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;;
+11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;;
+11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;;
+11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;;
+11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;;
+11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;;
+11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;;
+11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;;
+11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;;
+11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;;
+11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;;
+11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;;
+11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;;
+11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;;
+11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;;
+11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;;
+11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;;
+11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;;
+11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;;
+11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;;
+11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;;
+11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;;
+11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;;
+11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;;
+11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;;
+11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;;
+11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;;
+11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;;
+11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;;
+11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;;
+11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;;
+11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;;
+1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;;
+1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;;
+120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;;
+1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;;
+1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;;
+1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;;
+1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;;
+1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;;
+1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;;
+1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;;
+1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;;
+1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;;
+121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;;
+1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;;
+1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;;
+1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;;
+1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;;
+1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;;
+1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;;
+1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;;
+1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;;
+1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;;
+122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;;
+1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;;
+1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;;
+1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;;
+123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;;
+1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;;
+1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;;
+1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;;
+1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;;
+1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;;
+1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;;
+124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;;
+124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;;
+124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;;
+124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;;
+1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;;
+1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;;
+1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;;
+1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;;
+1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;;
+1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;;
+1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;;
+1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;;
+125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;;
+125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;;
+125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;;
+125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;;
+1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;;
+1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;;
+1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;;
+126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;;
+1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;;
+1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;;
+1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;;
+127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;;
+1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;;
+1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;;
+1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;;
+1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;;
+1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;;
+1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;;
+1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;;
+128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;;
+128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;;
+128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;;
+128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;;
+1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;;
+1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;;
+1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;;
+129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;;
+12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;;
+12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;;
+12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;;
+12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;;
+12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;;
+12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;;
+12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;;
+12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;;
+12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;;
+12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;;
+12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
+12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
+12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;;
+12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;;
+12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;;
+12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;;
+12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;;
+12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;;
+12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;;
+12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;;
+12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;;
+12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;;
+12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;;
+12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;;
+12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;;
+12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;;
+12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;;
+12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;;
+12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;;
+12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;;
+12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;;
+12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;;
+12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;;
+12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;;
+12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;;
+12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;;
+12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;;
+12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;;
+12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;;
+12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;;
+12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;;
+12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;;
+12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;;
+12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;;
+12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;;
+12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;;
+12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;;
+1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;;
+1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;;
+1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;;
+130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;;
+1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
+1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
+1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;;
+1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;;
+1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;;
+1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;;
+131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;;
+131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;;
+1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;;
+1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;;
+1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;;
+132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;;
+132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;;
+132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;;
+1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;;
+1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;;
+1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;;
+1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;;
+1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;;
+1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;;
+1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;;
+1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;;
+1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;;
+1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;;
+133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;;
+133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;;
+133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;;
+133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;;
+133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;;
+133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;;
+1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;;
+1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;;
+1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;;
+1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;;
+1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;;
+1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;;
+1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;;
+1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;;
+1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;;
+134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;;
+1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;;
+1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;;
+1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
+1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
+135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;;
+135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;;
+1360;ETHIOPIC SECTION MARK;So;0;L;;;;;N;;;;;
+1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;;
+1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;;
+1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;;
+1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;;
+1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;;
+1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;;
+1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;;
+1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;;
+1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;;
+1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;;
+1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
+137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;;
+137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;;
+1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;;
+1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;;
+1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;;
+1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;;
+1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;;
+1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;;
+1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;;
+1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;;
+1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;;
+138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;;
+138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;;
+138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;;
+138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;;
+138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;;
+138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;;
+1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;;
+1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;;
+1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;;
+1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;;
+1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;;
+1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;;
+1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;;
+1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;;
+1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;;
+1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;;
+13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;;
+13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;;
+13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;;
+13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;;
+13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;;
+13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;;
+13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;;
+13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;;
+13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;;
+13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;;
+13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;;
+13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;;
+13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;;
+13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;;
+13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;;
+13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;;
+13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;;
+13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;;
+13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;;
+13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;;
+13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;;
+13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;;
+13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;;
+13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;;
+13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;;
+13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;;
+13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;;
+13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;;
+13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;;
+13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;;
+13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;;
+13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;;
+13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;;
+13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;;
+13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;;
+13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;;
+13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;;
+13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;;
+13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;;
+13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;;
+13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;;
+13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;;
+13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;;
+13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;;
+13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;;
+13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;;
+13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;;
+13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;;
+13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;;
+13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;;
+13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;;
+13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;;
+13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;;
+13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;;
+13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;;
+13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;;
+13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;;
+13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;;
+13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;;
+13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;;
+13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;;
+13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;;
+13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;;
+13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;;
+13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;;
+13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;;
+13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;;
+13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;;
+13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;;
+13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;;
+13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;;
+13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;;
+13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;;
+13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;;
+13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;;
+13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;;
+13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;;
+13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;;
+13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;;
+13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;;
+13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;;
+13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;;
+13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;;
+13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;;
+13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;;
+1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;;
+1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;;
+1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;;
+1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;;
+1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;;
+1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;;
+1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;;
+1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;;
+1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;;
+140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;;
+140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;;
+140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;;
+140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;;
+140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;;
+140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;;
+1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;;
+1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;;
+1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;;
+1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;;
+1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;;
+1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;;
+1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;;
+1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;;
+1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;;
+1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;;
+141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;;
+141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;;
+141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;;
+141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;;
+141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;;
+1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;;
+1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;;
+1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;;
+1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;;
+1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;;
+1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;;
+1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;;
+1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;;
+1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;;
+1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;;
+142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;;
+142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;;
+142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;;
+142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;;
+142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;;
+142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;;
+1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;;
+1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;;
+1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;;
+1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;;
+1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;;
+1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;;
+1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;;
+1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;;
+1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;;
+1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;;
+143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;;
+143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;;
+143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;;
+143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;;
+143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;;
+143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;;
+1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;;
+1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;;
+1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;;
+1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;;
+1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;;
+1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;;
+1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;;
+1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;;
+144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;;
+144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;;
+144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;;
+144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;;
+144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;;
+144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;;
+1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;;
+1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;;
+1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;;
+1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;;
+1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;;
+1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;;
+1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;;
+1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;;
+1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;;
+1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;;
+145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;;
+145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;;
+145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;;
+145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;;
+145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;;
+145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;;
+1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;;
+1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;;
+1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;;
+1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;;
+1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;;
+1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;;
+1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;;
+1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;;
+1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;;
+1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;;
+146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;;
+146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;;
+146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;;
+146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;;
+146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;;
+146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;;
+1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;;
+1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;;
+1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;;
+1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;;
+1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;;
+1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;;
+1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;;
+1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;;
+1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;;
+1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;;
+147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;;
+147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;;
+147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;;
+147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;;
+147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;;
+147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;;
+1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;;
+1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;;
+1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;;
+1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;;
+1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;;
+1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;;
+1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;;
+1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;;
+1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;;
+1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;;
+148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;;
+148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;;
+148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;;
+148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;;
+148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;;
+148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;;
+1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;;
+1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;;
+1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;;
+1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;;
+1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;;
+1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;;
+1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;;
+1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;;
+1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;;
+1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;;
+149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;;
+149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;;
+149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;;
+149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;;
+149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;;
+149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;;
+14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;;
+14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;;
+14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;;
+14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;;
+14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;;
+14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;;
+14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;;
+14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;;
+14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;;
+14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;;
+14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;;
+14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;;
+14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;;
+14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;;
+14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;;
+14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;;
+14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;;
+14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;;
+14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;;
+14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;;
+14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;;
+14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;;
+14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;;
+14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;;
+14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;;
+14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;;
+14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;;
+14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;;
+14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;;
+14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;;
+14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;;
+14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;;
+14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;;
+14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;;
+14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;;
+14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;;
+14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;;
+14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;;
+14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;;
+14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;;
+14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;;
+14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;;
+14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;;
+14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;;
+14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;;
+14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;;
+14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;;
+14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;;
+14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;;
+14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;;
+14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;;
+14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;;
+14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;;
+14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;;
+14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;;
+14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;;
+14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;;
+14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;;
+14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;;
+14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;;
+14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;;
+14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;;
+14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;;
+14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;;
+14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;;
+14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;;
+14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;;
+14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;;
+14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;;
+14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;;
+14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;;
+14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;;
+14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;;
+14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;;
+14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;;
+14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;;
+14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;;
+14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;;
+14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;;
+14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;;
+14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;;
+14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;;
+14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;;
+14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;;
+14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;;
+14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;;
+14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;;
+14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;;
+14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;;
+14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;;
+14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;;
+14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;;
+14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;;
+14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;;
+14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;;
+14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;;
+1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;;
+1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;;
+1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;;
+1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;;
+1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;;
+1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;;
+1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;;
+1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;;
+1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;;
+1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;;
+150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;;
+150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;;
+150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;;
+150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;;
+150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;;
+150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;;
+1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;;
+1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;;
+1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;;
+1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;;
+1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;;
+1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;;
+1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;;
+1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;;
+1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;;
+1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;;
+151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;;
+151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;;
+151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;;
+151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;;
+151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;;
+151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;;
+1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;;
+1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;;
+1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;;
+1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;;
+1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;;
+1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;;
+1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;;
+1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;;
+1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;;
+1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;;
+152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;;
+152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;;
+152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;;
+152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;;
+152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;;
+152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;;
+1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;;
+1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;;
+1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;;
+1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;;
+1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;;
+1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;;
+1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;;
+1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;;
+1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;;
+1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;;
+153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;;
+153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;;
+153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;;
+153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;;
+153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;;
+153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;;
+1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;;
+1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;;
+1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;;
+1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;;
+1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;;
+1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;;
+1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;;
+1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;;
+1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;;
+1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;;
+154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;;
+154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;;
+154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;;
+154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;;
+154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;;
+154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;;
+1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;;
+1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;;
+1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;;
+1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;;
+1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;;
+1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;;
+1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;;
+1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;;
+1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;;
+1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;;
+155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;;
+155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;;
+155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;;
+155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;;
+155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;;
+155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;;
+1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;;
+1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;;
+1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;;
+1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;;
+1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;;
+1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;;
+1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;;
+1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;;
+1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;;
+1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;;
+156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;;
+156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;;
+156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;;
+156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;;
+156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;;
+156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;;
+1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;;
+1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;;
+1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;;
+1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;;
+1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;;
+1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;;
+1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;;
+1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;;
+1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;;
+1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;;
+157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;;
+157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;;
+157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;;
+157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;;
+157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;;
+157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;;
+1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;;
+1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;;
+1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;;
+1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;;
+1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;;
+1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;;
+1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;;
+1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;;
+1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;;
+1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;;
+158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;;
+158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;;
+158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;;
+158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;;
+158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;;
+158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;;
+1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;;
+1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;;
+1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;;
+1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;;
+1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;;
+1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;;
+1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;;
+1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;;
+1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;;
+1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;;
+159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;;
+159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;;
+159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;;
+159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;;
+159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;;
+159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;;
+15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;;
+15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;;
+15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;;
+15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;;
+15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;;
+15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;;
+15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;;
+15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;;
+15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;;
+15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;;
+15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;;
+15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;;
+15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;;
+15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;;
+15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;;
+15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;;
+15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;;
+15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;;
+15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;;
+15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;;
+15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;;
+15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;;
+15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;;
+15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;;
+15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;;
+15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;;
+15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;;
+15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;;
+15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;;
+15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;;
+15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;;
+15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;;
+15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;;
+15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;;
+15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;;
+15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;;
+15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;;
+15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;;
+15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;;
+15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;;
+15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;;
+15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;;
+15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;;
+15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;;
+15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;;
+15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;;
+15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;;
+15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;;
+15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;;
+15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;;
+15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;;
+15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;;
+15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;;
+15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;;
+15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;;
+15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;;
+15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;;
+15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;;
+15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;;
+15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;;
+15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;;
+15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;;
+15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;;
+15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;;
+15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;;
+15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;;
+15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;;
+15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;;
+15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;;
+15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;;
+15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;;
+15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;;
+15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;;
+15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;;
+15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;;
+15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;;
+15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;;
+15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;;
+15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;;
+15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;;
+15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;;
+15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;;
+15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;;
+15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;;
+15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;;
+15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;;
+15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;;
+15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;;
+15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;;
+15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;;
+15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;;
+15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;;
+15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;;
+15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;;
+15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;;
+15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;;
+1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;;
+1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;;
+1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;;
+1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;;
+1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;;
+1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;;
+1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;;
+1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;;
+1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;;
+1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;;
+160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;;
+160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;;
+160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;;
+160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;;
+160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;;
+160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;;
+1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;;
+1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;;
+1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;;
+1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;;
+1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;;
+1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;;
+1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;;
+1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;;
+1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;;
+1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;;
+161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;;
+161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;;
+161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;;
+161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;;
+161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;;
+161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;;
+1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;;
+1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;;
+1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;;
+1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;;
+1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;;
+1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;;
+1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;;
+1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;;
+1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;;
+1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;;
+162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;;
+162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;;
+162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;;
+162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;;
+162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;;
+162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;;
+1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;;
+1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;;
+1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;;
+1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;;
+1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;;
+1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;;
+1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;;
+1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;;
+1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;;
+1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;;
+163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;;
+163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;;
+163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;;
+163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;;
+163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;;
+163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;;
+1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;;
+1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;;
+1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;;
+1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;;
+1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;;
+1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;;
+1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;;
+1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;;
+1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;;
+1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;;
+164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;;
+164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;;
+164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;;
+164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;;
+164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;;
+164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;;
+1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;;
+1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;;
+1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;;
+1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;;
+1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;;
+1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;;
+1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;;
+1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;;
+1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;;
+1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;;
+165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;;
+165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;;
+165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;;
+165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;;
+165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;;
+165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;;
+1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;;
+1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;;
+1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;;
+1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;;
+1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;;
+1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;;
+1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;;
+1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;;
+1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;;
+1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;;
+166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;;
+166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;;
+166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;;
+166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;;
+166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;;
+166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;;
+1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;;
+1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;;
+1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;;
+1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;;
+1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;;
+1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;;
+1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;;
+1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;
+1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;;
+1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;;
+1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;;
+1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;;
+1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;;
+1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;;
+1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;;
+1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;;
+1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;;
+168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;;
+168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;;
+168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;;
+168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;;
+168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;;
+168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;;
+1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;;
+1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;;
+1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;;
+1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;;
+1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;;
+1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;;
+1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;;
+1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;;
+1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;;
+1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;;
+169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;;
+169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;;
+16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;;
+16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;;
+16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;;
+16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;;
+16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;;
+16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;;
+16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;;
+16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;;
+16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;;
+16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;;
+16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;;
+16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;;
+16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;;
+16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;;
+16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;;
+16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;;
+16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;;
+16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;;
+16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;;
+16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;;
+16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;;
+16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;;
+16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;;
+16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;;
+16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;;
+16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;;
+16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;;
+16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;;
+16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;;
+16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;;
+16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;;
+16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;;
+16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;;
+16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;;
+16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;;
+16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;;
+16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;;
+16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;;
+16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;;
+16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;;
+16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;;
+16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;;
+16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;;
+16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;;
+16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;;
+16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;;
+16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;;
+16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;;
+16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;;
+16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;;
+16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;;
+16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;;
+16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;;
+16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;;
+16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;;
+16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;;
+16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;;
+16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;;
+16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;;
+16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;;
+16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;;
+16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;;
+16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;;
+16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;;
+16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;;
+16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;;
+16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;;
+16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;;
+16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;;
+16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;;
+16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;;
+16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;golden number 17;;;
+16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;golden number 18;;;
+16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;golden number 19;;;
+1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;;
+1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;;
+1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;;
+1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;;
+1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;;
+1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;;
+1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;;
+1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;;
+1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;;
+1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;;
+170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;;
+170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;;
+170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;;
+170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;;
+170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;;
+1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;;
+1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;;
+1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;;
+1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;;
+1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;;
+1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;;
+1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;;
+1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;;
+1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;;
+1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;;
+1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;;
+1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;;
+172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;;
+172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;;
+172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;;
+172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;;
+172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;;
+172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;;
+1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;;
+1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;;
+1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;;
+1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;;
+1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;;
+1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;;
+1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;;
+1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;;
+1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;;
+1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;;
+1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;;
+1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;;
+1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;;
+174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;;
+174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;;
+174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;;
+174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;;
+174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;;
+174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;;
+1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;;
+1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;;
+1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;;
+1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;;
+1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;;
+1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;;
+1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;;
+1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;;
+1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;;
+1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;;
+1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;;
+176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;;
+176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;;
+176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;;
+176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;;
+176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;;
+1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;;
+1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;;
+1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;;
+1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;;
+1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;;
+1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;;
+1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;;
+1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;;
+1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;;
+1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;;
+1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;;
+178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;;
+178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;;
+178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;;
+178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;;
+178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;;
+178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;;
+1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;;
+1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;;
+1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;;
+1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;;
+1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;;
+1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;;
+1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;;
+1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;;
+1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;;
+1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;;
+179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;;
+179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;;
+179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;;
+179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;;
+179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;;
+179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;;
+17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;;
+17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;;
+17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;;
+17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;*;;;
+17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;*;;;
+17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;;
+17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;;
+17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;;
+17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;;
+17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;;
+17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;;
+17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;;
+17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;;
+17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;;
+17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;;
+17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;;
+17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;;
+17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;;
+17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;;
+17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;;
+17B4;KHMER VOWEL INHERENT AQ;Cf;0;L;;;;;N;;*;;;
+17B5;KHMER VOWEL INHERENT AA;Cf;0;L;;;;;N;;*;;;
+17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;;
+17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;;
+17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;;
+17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;;
+17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;;
+17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;;
+17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;;
+17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;;
+17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;;
+17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;;
+17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;;
+17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;;
+17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;;
+17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;;
+17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;;
+17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;;
+17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;;
+17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;*;;;
+17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;;
+17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;;
+17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;;
+17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;;
+17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;*;;;
+17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;;
+17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;;
+17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;;
+17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;;
+17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;;
+17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;;
+17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;;
+17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;;
+17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;;
+17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;;
+17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;;
+17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;;
+17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;;
+17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;;
+17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;;
+1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;;
+1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;;
+1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;;
+1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;;
+1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;;
+1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;;
+1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;;
+1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;;
+180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;;
+180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;;
+180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;;
+180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;;
+1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;;
+1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;;
+1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;;
+1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;;
+1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;;
+1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;;
+1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;;
+1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;;
+1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;;
+1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;;
+182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;;
+182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;;
+182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;;
+182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;;
+182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;;
+182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;;
+1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;;
+1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;;
+1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;;
+1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;;
+1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;;
+1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;;
+1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;;
+1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;;
+183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;;
+183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;;
+183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;;
+1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;;
+1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;;
+1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;;
+1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;;
+1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;;
+1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;;
+1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;;
+1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;;
+1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;;
+1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;;
+184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;;
+184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;;
+184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;;
+184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;;
+184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;;
+184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;;
+1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;;
+1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;;
+1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;;
+1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;;
+1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;;
+1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;;
+1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;;
+1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;;
+1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;;
+1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;;
+185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;;
+185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;;
+185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;;
+185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;;
+185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;;
+185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;;
+1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;;
+1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;;
+1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;;
+1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;;
+1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;;
+1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;;
+1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;;
+1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;;
+1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;;
+1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;;
+186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;;
+186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;;
+186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;;
+186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;;
+186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;;
+186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;;
+1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;;
+1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;;
+1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;;
+1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;;
+1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;;
+1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
+1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
+1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
+1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
+1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
+1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;;
+1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;;
+1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;;
+1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;;
+1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;;
+1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;;
+1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;;
+188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;;
+188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;;
+188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;;
+188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;;
+1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;;
+1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;;
+1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;;
+1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;;
+1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;;
+189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;;
+189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;;
+189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;;
+18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;;
+18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;;
+18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;;
+18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;;
+18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
+18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
+18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;;
+1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;;
+1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;;
+1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;;
+1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;;
+1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;;
+1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;;
+1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;;
+1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;;
+1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;;
+1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;;
+190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;;
+190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;;
+190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;;
+190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;;
+190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;;
+190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;;
+1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;;
+1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;;
+1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;;
+1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;;
+1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;;
+1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;;
+1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;;
+1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;;
+1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;;
+1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;;
+191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;;
+191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;;
+191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;;
+1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;;
+1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;;
+1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;;
+1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;;
+1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;;
+1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;;
+1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;;
+1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;;
+1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;;
+1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;;
+1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;;
+193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;;
+193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;;
+1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;;
+1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;;
+1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;;
+1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;;
+1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;;
+1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;;
+1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;;
+1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;;
+1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;;
+1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;;
+1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;;
+195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;;
+195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;;
+195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;;
+195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;;
+195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;;
+195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;;
+1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;;
+1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;;
+1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;;
+1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;;
+1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;;
+1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;;
+1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;;
+1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;;
+196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;;
+196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;;
+196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;;
+196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;;
+1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;;
+1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;;
+1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;;
+1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;;
+1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;;
+1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;;
+1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;;
+1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;;
+1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;;
+1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;;
+1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;;
+1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;;
+1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;;
+1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;;
+1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;;
+198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;;
+198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;;
+198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;;
+198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;;
+198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;;
+198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;;
+1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;;
+1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;;
+1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;;
+1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;;
+1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;;
+1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;;
+1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;;
+1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;;
+1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;;
+1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;;
+199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;;
+199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;;
+199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;;
+199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;;
+199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;;
+199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;;
+19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;;
+19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;;
+19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;;
+19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;;
+19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;;
+19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;;
+19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;;
+19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;;
+19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;;
+19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;;
+19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;;
+19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;;
+19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;;
+19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;;
+19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;;
+19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;;
+19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;;
+19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;;
+19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;;
+19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;;
+19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;;
+19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;;
+19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;;
+19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;;
+19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;;
+19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;;
+19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;;
+19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;;
+19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;;
+19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;;
+19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;;
+19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;;
+19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;;
+19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;;
+19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;;
+19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;;
+19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;;
+19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;;
+19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;;
+19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;;
+19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;;
+19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;;
+19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;;
+19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;;
+19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;;
+19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;;
+19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;;
+19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;;
+19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;;
+19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;;
+19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;;
+19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;;
+19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;;
+19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;;
+19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;;
+19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;;
+19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;;
+19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;;
+19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;;
+1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;;
+1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;;
+1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;;
+1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;;
+1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;;
+1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;;
+1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;;
+1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;;
+1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;;
+1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;ardhacandra;;;
+1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;candrabindu;;;
+1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;anusvara;;;
+1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;repha;;;
+1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;visarga;;;
+1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;a;;;
+1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;aa;;;
+1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;i;;;
+1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;ii;;;
+1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;u;;;
+1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;uu;;;
+1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;vocalic r;;;
+1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;vocalic rr;;;
+1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;vocalic l;;;
+1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;vocalic ll;;;
+1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;e;;;
+1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;ai;;;
+1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;o;;;
+1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;au;;;
+1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;kha;;;
+1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;gha;;;
+1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;cha;;;
+1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;jha;;;
+1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;tta;;;
+1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ttha;;;
+1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;dda;;;
+1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ddha;;;
+1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;nna;;;
+1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;tha;;;
+1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;dha;;;
+1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;pha;;;
+1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;bha;;;
+1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;sha;;;
+1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;ssa;;;
+1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;nukta;;;
+1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;aa;;;
+1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;i;;;
+1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;ii;;;
+1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;u;;;
+1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;uu;;;
+1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;vocalic r;;;
+1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;vocalic rr;;;
+1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;vocalic l;;;
+1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;vocalic ll;;;
+1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;e;;;
+1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;ai;;;
+1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;o;;;
+1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;au;;;
+1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;ae;;;
+1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;oe;;;
+1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;virama;;;
+1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;;
+1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;;
+1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;;
+1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;;
+1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;;
+1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;;
+1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;;
+1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1B5A;BALINESE PANTI;Po;0;L;;;;;N;;section;;;
+1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;honorific section;;;
+1B5C;BALINESE WINDU;Po;0;L;;;;;N;;punctuation ring;;;
+1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;colon;;;
+1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;danda;;;
+1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;double danda;;;
+1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;line-breaking hyphen;;;
+1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;;
+1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;;
+1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;;
+1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;;
+1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;;
+1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;;
+1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;;
+1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;;
+1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;;
+1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;;
+1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;;
+1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;;
+1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;;
+1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;;
+1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;;
+1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;;
+1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;;
+1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;;
+1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;;
+1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;;
+1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;;
+1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;;
+1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;;
+1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;;
+1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;;
+1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;;
+1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;;
+1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;;
+1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;;
+1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;;
+1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;;
+1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;;
+1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;;
+1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;;
+1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;;
+1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;;
+1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;;
+1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;;
+1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;;
+1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;;
+1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;;
+1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;;
+1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;;
+1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;;
+1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;;
+1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;;
+1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;;
+1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;;
+1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;;
+1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;;
+1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;;
+1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;;
+1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;;
+1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;;
+1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;;
+1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;;
+1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;;
+1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;;
+1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;;
+1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;;
+1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;;
+1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;;
+1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;;
+1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;;
+1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;;
+1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;;
+1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;;
+1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;;
+1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;;
+1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;;
+1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;;
+1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;;
+1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;;
+1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;;
+1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;;
+1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;;
+1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;;
+1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;;
+1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;;
+1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;;
+1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;;
+1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;;
+1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;;
+1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;;
+1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;;
+1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;;
+1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;;
+1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;;
+1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;;
+1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;;
+1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;;
+1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;;
+1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;;
+1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;;
+1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;;
+1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;;
+1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;;
+1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;;
+1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;;
+1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;;
+1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;;
+1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;;
+1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;;
+1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;;
+1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;;
+1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;;
+1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;;
+1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;;
+1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;;
+1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;;
+1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;;
+1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;;
+1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;;
+1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;;
+1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;;
+1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;;
+1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;;
+1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;;
+1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;;
+1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;;
+1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;;
+1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;;
+1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;;
+1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;;
+1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;;
+1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;;
+1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;;
+1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;;
+1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;;
+1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;;
+1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;;
+1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;;
+1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
+1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
+1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
+1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;;
+1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;;
+1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;;
+1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;;
+1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;;
+1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;;
+1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;;
+1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;;
+1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;;
+1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;;
+1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;;
+1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;;
+1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;;
+1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;;
+1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;;
+1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;;
+1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;;
+1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;;
+1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;;
+1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;;
+1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;;
+1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;;
+1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;;
+1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;;
+1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;;
+1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;;
+1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;;
+1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;;
+1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;;
+1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;;
+1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;;
+1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;;
+1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;;
+1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;;
+1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;;
+1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;;
+1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;;
+1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;;
+1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;;
+1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;;
+1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;;
+1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;;
+1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;;
+1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;;
+1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;;
+1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;;
+1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;;
+1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;;
+1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;;
+1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;;
+1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;;
+1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;;
+1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;;
+1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;;
+1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;;
+1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;;
+1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;;
+1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;;
+1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;;
+1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;;
+1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;;
+1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;;
+1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;;
+1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;;
+1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;;
+1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;;
+1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;;
+1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;;
+1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;;
+1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;;
+1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;;
+1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;;
+1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;;
+1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;;
+1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;;
+1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;;
+1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;;
+1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;;
+1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;;
+1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;;
+1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;;
+1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;;
+1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;;
+1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;;
+1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;;
+1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;;
+1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;;
+1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;;
+1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;;
+1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;;
+1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;;
+1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;;
+1D62;LATIN SUBSCRIPT SMALL LETTER I;Ll;0;L;<sub> 0069;;;;N;;;;;
+1D63;LATIN SUBSCRIPT SMALL LETTER R;Ll;0;L;<sub> 0072;;;;N;;;;;
+1D64;LATIN SUBSCRIPT SMALL LETTER U;Ll;0;L;<sub> 0075;;;;N;;;;;
+1D65;LATIN SUBSCRIPT SMALL LETTER V;Ll;0;L;<sub> 0076;;;;N;;;;;
+1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Ll;0;L;<sub> 03B2;;;;N;;;;;
+1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Ll;0;L;<sub> 03B3;;;;N;;;;;
+1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Ll;0;L;<sub> 03C1;;;;N;;;;;
+1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;;
+1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;;
+1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;;
+1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;;
+1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;;
+1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D
+1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;;
+1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63
+1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;;
+1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;;
+1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;;
+1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;;
+1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;;
+1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;;
+1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;;
+1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;;
+1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;;
+1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;;
+1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;;
+1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;;
+1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;;
+1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;;
+1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;;
+1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;;
+1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;;
+1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;;
+1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;;
+1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;;
+1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;;
+1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;;
+1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;;
+1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;;
+1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;;
+1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;;
+1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;;
+1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;;
+1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;;
+1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;;
+1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;;
+1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;;
+1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;;
+1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;;
+1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;;
+1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;;
+1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;;
+1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;;
+1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;;
+1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;;
+1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;;
+1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;;
+1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;;
+1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;;
+1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;;
+1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;;
+1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;;
+1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;;
+1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;;
+1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;;
+1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;;
+1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;;
+1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;;
+1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;;
+1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;;
+1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;;
+1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;;
+1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;;
+1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;;
+1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;;
+1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;;
+1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;;
+1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
+1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
+1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
+1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02
+1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05;
+1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04
+1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07;
+1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06
+1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09;
+1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08
+1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B;
+1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A
+1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D;
+1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C
+1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F;
+1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E
+1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11;
+1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10
+1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13;
+1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12
+1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15;
+1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14
+1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17;
+1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16
+1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19;
+1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18
+1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B;
+1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A
+1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D;
+1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C
+1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F;
+1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E
+1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21;
+1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20
+1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23;
+1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22
+1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25;
+1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24
+1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27;
+1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26
+1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29;
+1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28
+1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B;
+1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A
+1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D;
+1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C
+1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F;
+1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E
+1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31;
+1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30
+1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33;
+1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32
+1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35;
+1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34
+1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37;
+1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36
+1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39;
+1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38
+1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B;
+1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A
+1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D;
+1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C
+1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F;
+1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E
+1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41;
+1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40
+1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43;
+1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42
+1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45;
+1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44
+1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47;
+1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46
+1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49;
+1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48
+1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B;
+1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A
+1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D;
+1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C
+1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F;
+1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E
+1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51;
+1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50
+1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53;
+1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52
+1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55;
+1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54
+1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57;
+1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56
+1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59;
+1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58
+1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B;
+1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A
+1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D;
+1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C
+1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F;
+1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E
+1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61;
+1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60
+1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63;
+1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62
+1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65;
+1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64
+1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67;
+1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66
+1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69;
+1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68
+1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B;
+1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A
+1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D;
+1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C
+1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F;
+1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E
+1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71;
+1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70
+1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73;
+1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72
+1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75;
+1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74
+1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77;
+1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76
+1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79;
+1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78
+1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B;
+1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A
+1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D;
+1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C
+1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F;
+1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E
+1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81;
+1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80
+1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83;
+1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82
+1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85;
+1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84
+1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87;
+1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86
+1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89;
+1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88
+1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B;
+1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A
+1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D;
+1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C
+1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F;
+1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E
+1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91;
+1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90
+1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93;
+1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92
+1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95;
+1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94
+1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;;
+1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;;
+1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;;
+1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;;
+1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
+1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60
+1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;;
+1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;;
+1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF;
+1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;;
+1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1;
+1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0
+1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3;
+1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2
+1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5;
+1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4
+1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7;
+1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6
+1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9;
+1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8
+1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB;
+1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA
+1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD;
+1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC
+1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF;
+1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE
+1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1;
+1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0
+1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3;
+1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2
+1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5;
+1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4
+1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7;
+1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6
+1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9;
+1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8
+1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB;
+1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA
+1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD;
+1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC
+1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF;
+1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE
+1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1;
+1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0
+1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3;
+1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2
+1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5;
+1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4
+1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7;
+1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6
+1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9;
+1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8
+1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB;
+1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA
+1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD;
+1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC
+1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF;
+1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE
+1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1;
+1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0
+1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3;
+1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2
+1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5;
+1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4
+1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7;
+1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6
+1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9;
+1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8
+1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB;
+1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA
+1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD;
+1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC
+1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF;
+1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE
+1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1;
+1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0
+1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3;
+1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2
+1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5;
+1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4
+1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7;
+1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6
+1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9;
+1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8
+1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB;
+1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA
+1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED;
+1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC
+1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF;
+1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE
+1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1;
+1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0
+1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3;
+1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2
+1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5;
+1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4
+1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7;
+1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6
+1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9;
+1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8
+1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB;
+1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA
+1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD;
+1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC
+1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF;
+1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE
+1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08
+1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09
+1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A
+1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B
+1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C
+1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D
+1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E
+1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F
+1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00;
+1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01;
+1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02;
+1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03;
+1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04;
+1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05;
+1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06;
+1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07;
+1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18
+1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19
+1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A
+1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B
+1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C
+1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D
+1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10;
+1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11;
+1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12;
+1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13;
+1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14;
+1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15;
+1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28
+1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29
+1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A
+1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B
+1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C
+1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D
+1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E
+1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F
+1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20;
+1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21;
+1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22;
+1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23;
+1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24;
+1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25;
+1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26;
+1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27;
+1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38
+1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39
+1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A
+1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B
+1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C
+1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D
+1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E
+1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F
+1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30;
+1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31;
+1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32;
+1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33;
+1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34;
+1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35;
+1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36;
+1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37;
+1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48
+1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49
+1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A
+1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B
+1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C
+1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D
+1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40;
+1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41;
+1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42;
+1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43;
+1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44;
+1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45;
+1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;;
+1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59
+1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;;
+1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B
+1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;;
+1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D
+1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;;
+1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F
+1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51;
+1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53;
+1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55;
+1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57;
+1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68
+1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69
+1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A
+1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B
+1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C
+1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D
+1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E
+1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F
+1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60;
+1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61;
+1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62;
+1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63;
+1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64;
+1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65;
+1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66;
+1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67;
+1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA
+1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB
+1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8
+1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9
+1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA
+1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB
+1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA
+1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB
+1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8
+1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9
+1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA
+1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB
+1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA
+1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB
+1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88
+1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89
+1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A
+1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B
+1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C
+1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D
+1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E
+1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F
+1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80;
+1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81;
+1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82;
+1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83;
+1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84;
+1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85;
+1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86;
+1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87;
+1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98
+1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99
+1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A
+1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B
+1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C
+1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D
+1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E
+1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F
+1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90;
+1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91;
+1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92;
+1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93;
+1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94;
+1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95;
+1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96;
+1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97;
+1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8
+1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9
+1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA
+1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB
+1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC
+1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD
+1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE
+1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF
+1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0;
+1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1;
+1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2;
+1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3;
+1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4;
+1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5;
+1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6;
+1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7;
+1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8
+1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9
+1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;;
+1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC
+1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;;
+1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;;
+1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;;
+1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0;
+1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1;
+1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70;
+1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71;
+1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3;
+1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399
+1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;;
+1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;;
+1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;;
+1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC
+1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;;
+1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;;
+1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;;
+1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72;
+1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73;
+1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74;
+1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75;
+1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3;
+1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;;
+1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;;
+1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;;
+1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8
+1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9
+1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;;
+1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;;
+1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;;
+1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;;
+1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0;
+1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1;
+1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76;
+1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77;
+1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;;
+1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;;
+1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;;
+1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8
+1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9
+1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;;
+1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;;
+1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;;
+1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC
+1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;;
+1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;;
+1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0;
+1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1;
+1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A;
+1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B;
+1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5;
+1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;;
+1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;;
+1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;;
+1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;;
+1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC
+1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;;
+1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;;
+1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;;
+1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78;
+1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79;
+1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C;
+1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D;
+1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3;
+1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;;
+1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;;
+2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;
+2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;
+2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;;
+200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;;
+200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;;
+200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;;
+200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;;
+2010;HYPHEN;Pd;0;ON;;;;;N;;;;;
+2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;;
+2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;;
+2013;EN DASH;Pd;0;ON;;;;;N;;;;;
+2014;EM DASH;Pd;0;ON;;;;;N;;;;;
+2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;;
+2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;;
+2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;;
+2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;;
+2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;;
+201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;;
+201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;;
+201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;;
+201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;;
+201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;;
+201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;;
+2020;DAGGER;Po;0;ON;;;;;N;;;;;
+2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;;
+2022;BULLET;Po;0;ON;;;;;N;;;;;
+2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;;
+2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;;
+2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;;
+2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;;
+2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;;
+2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;;
+2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;;
+202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;;
+202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;;
+202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;;
+202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;;
+202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;;
+202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;;
+2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+2032;PRIME;Po;0;ET;;;;;N;;;;;
+2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;;
+2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;;
+2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;;
+2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;;
+2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;;
+2038;CARET;Po;0;ON;;;;;N;;;;;
+2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;;
+203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;;
+203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;;
+203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;;
+203D;INTERROBANG;Po;0;ON;;;;;N;;;;;
+203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;;
+203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;;
+2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;;
+2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;;
+2042;ASTERISM;Po;0;ON;;;;;N;;;;;
+2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;;
+2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;;
+2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
+2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
+2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;;
+2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;;
+2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;;
+204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;;
+204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;;
+204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;;
+204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;;
+2050;CLOSE UP;Po;0;ON;;;;;N;;;;;
+2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;;
+2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2053;SWUNG DASH;Po;0;ON;;;;;N;;;;;
+2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;;
+2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;;
+2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;;
+2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;;
+205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;;
+205D;TRICOLON;Po;0;ON;;;;;N;;;;;
+205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;;
+205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2060;WORD JOINER;Cf;0;BN;;;;;N;;;;;
+2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;;
+2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;;
+2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;;
+2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;;
+206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
+2071;SUPERSCRIPT LATIN SMALL LETTER I;Ll;0;L;<super> 0069;;;;N;;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
+207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
+207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
+207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
+207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L;<super> 006E;;;;N;;;;;
+2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
+208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
+208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;;
+208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;;
+2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;;
+2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;;
+2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;;
+2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;;
+2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;;
+20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;;
+20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;;
+20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;;
+20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;;
+20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;;
+20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;;
+20A9;WON SIGN;Sc;0;ET;;;;;N;;;;;
+20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;;
+20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;;
+20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;;
+20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;;
+20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;;
+20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;;
+20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;;
+20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;;
+20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;;
+20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;;
+20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;;
+20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;;
+20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
+20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
+20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
+20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;;
+20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;;
+20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;;
+20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;;
+20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;;
+20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;;
+20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;;
+20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;;
+20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;;
+20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;;
+20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;;
+20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;;
+20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;;
+20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;;
+20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;;
+20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;;
+20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;;
+20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;;
+20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;;
+20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;;
+20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;;
+2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;;
+2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;;
+2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;;
+2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;;
+2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;;
+2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;;
+2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;;
+2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;;
+2108;SCRUPLE;So;0;ON;;;;;N;;;;;
+2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;;
+210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;;
+210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;;
+210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;;
+210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;;
+210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;;
+2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;;
+2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;;
+2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;;
+2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;;
+2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;;
+2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;;
+2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;;
+2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;;
+2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;;
+211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;;
+211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;;
+211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;;
+211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;;
+211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;;
+211F;RESPONSE;So;0;ON;;;;;N;;;;;
+2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;;
+2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;;
+2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;;
+2123;VERSICLE;So;0;ON;;;;;N;;;;;
+2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;;
+2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;;
+2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9;
+2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;;
+2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;;
+2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;;
+212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
+212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5;
+212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;;
+212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;;
+212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;;
+212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;;
+2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;;
+2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E;
+2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;;
+2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;;
+2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;;
+2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;;
+2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;;
+2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
+213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
+213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;;
+213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;;
+2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;;
+2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;;
+2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+214A;PROPERTY LINE;So;0;ON;;;;;N;;;;;
+214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;;
+214C;PER SIGN;So;0;ON;;;;;N;;;;;
+214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;;
+214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132
+214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;;
+2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;;
+2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;;
+2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;;
+2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;;
+2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;;
+2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;;
+2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;;
+215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;;
+215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;;
+215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;;
+215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;;
+215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;;
+215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;;
+2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
+2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171;
+2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172;
+2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173;
+2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174;
+2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175;
+2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176;
+2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177;
+2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178;
+2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179;
+216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A;
+216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B;
+216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C;
+216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D;
+216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E;
+216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F;
+2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160
+2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161
+2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162
+2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163
+2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164
+2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165
+2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166
+2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167
+2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168
+2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169
+217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A
+217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B
+217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C
+217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D
+217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E
+217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F
+2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;;
+2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;;
+2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;;
+2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184;
+2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183
+2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;;
+2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;;
+2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;;
+2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;;
+2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;;
+2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;;
+2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;
+2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;;
+2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;;
+2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;;
+2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;;
+2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;;
+2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;;
+219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;;
+219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;;
+219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;;
+219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;;
+219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;;
+219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;;
+21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;;
+21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;;
+21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;;
+21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;;
+21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;;
+21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;;
+21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;;
+21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;;
+21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;;
+21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;;
+21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;;
+21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;;
+21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;;
+21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;;
+21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;;
+21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;;
+21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;;
+21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;;
+21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;;
+21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;;
+21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;;
+21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;;
+21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;;
+21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;;
+21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;;
+21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;;
+21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;;
+21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;;
+21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;;
+21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;;
+21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;;
+21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;;
+21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;;
+21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;;
+21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;;
+21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;;
+21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;;
+21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;;
+21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;;
+21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;;
+21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;;
+21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;;
+21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;;
+21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;;
+21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;;
+21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;;
+21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;;
+21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;;
+21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;;
+21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;;
+21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;;
+21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;;
+21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;;
+21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;;
+21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;;
+21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;;
+21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;;
+21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;;
+21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;;
+21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;;
+21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;;
+21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;;
+21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;;
+21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;;
+21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;;
+21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;;
+21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;;
+21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;;
+21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;;
+21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
+21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;;
+21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;;
+21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+2200;FOR ALL;Sm;0;ON;;;;;N;;;;;
+2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;;
+2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;;
+2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;;
+2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;;
+2205;EMPTY SET;Sm;0;ON;;;;;N;;;;;
+2206;INCREMENT;Sm;0;ON;;;;;N;;;;;
+2207;NABLA;Sm;0;ON;;;;;N;;;;;
+2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;;
+220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;;
+220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220E;END OF PROOF;Sm;0;ON;;;;;N;;;;;
+220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;;
+2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;;
+2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;;
+2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+2214;DOT PLUS;Sm;0;ON;;;;;N;;;;;
+2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2216;SET MINUS;Sm;0;ON;;;;;Y;;;;;
+2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;;
+221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;;
+221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;;
+221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;;
+221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;;
+221E;INFINITY;Sm;0;ON;;;;;N;;;;;
+221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;;
+2220;ANGLE;Sm;0;ON;;;;;Y;;;;;
+2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;;
+2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+2223;DIVIDES;Sm;0;ON;;;;;N;;;;;
+2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;;
+2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;;
+2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2229;INTERSECTION;Sm;0;ON;;;;;N;;;;;
+222A;UNION;Sm;0;ON;;;;;N;;;;;
+222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;;
+222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;;
+222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;;
+2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;;
+2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2234;THEREFORE;Sm;0;ON;;;;;N;;;;;
+2235;BECAUSE;Sm;0;ON;;;;;N;;;;;
+2236;RATIO;Sm;0;ON;;;;;N;;;;;
+2237;PROPORTION;Sm;0;ON;;;;;N;;;;;
+2238;DOT MINUS;Sm;0;ON;;;;;N;;;;;
+2239;EXCESS;Sm;0;ON;;;;;Y;;;;;
+223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;;
+223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;;
+223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;;
+223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;;
+223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;;
+2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;;
+2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;;
+2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;;
+2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;;
+2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;;
+224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;;
+224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;;
+2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;;
+2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;;
+2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;;
+2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;;
+2259;ESTIMATES;Sm;0;ON;;;;;N;;;;;
+225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;;
+225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;;
+225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;;
+225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;;
+225E;MEASURED BY;Sm;0;ON;;;;;N;;;;;
+225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;;
+2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;;
+2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;;
+2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;;
+2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;;
+2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;;
+2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;;
+2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;;
+2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;;
+226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;;
+226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;;
+226C;BETWEEN;Sm;0;ON;;;;;N;;;;;
+226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;;
+226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;;
+226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;;
+2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;;
+2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;;
+2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;;
+2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;;
+2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;;
+2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;;
+2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;;
+2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;;
+2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;;
+2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;;
+227A;PRECEDES;Sm;0;ON;;;;;Y;;;;;
+227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;;
+2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;;
+2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;;
+2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;;
+2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;;
+2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;;
+2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;;
+2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;;
+228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;;
+228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;;
+228C;MULTISET;Sm;0;ON;;;;;Y;;;;;
+228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;;
+228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;;
+228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;;
+2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;;
+2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;;
+2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;;
+2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;;
+229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;;
+229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;;
+229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;;
+22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;;
+22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;;
+22A5;UP TACK;Sm;0;ON;;;;;N;;;;;
+22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;;
+22A7;MODELS;Sm;0;ON;;;;;Y;;;;;
+22A8;TRUE;Sm;0;ON;;;;;Y;;;;;
+22A9;FORCES;Sm;0;ON;;;;;Y;;;;;
+22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;;
+22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;;
+22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;;
+22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;;
+22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;;
+22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;;
+22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;;
+22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;;
+22BB;XOR;Sm;0;ON;;;;;N;;;;;
+22BC;NAND;Sm;0;ON;;;;;N;;;;;
+22BD;NOR;Sm;0;ON;;;;;N;;;;;
+22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;;
+22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;;
+22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;;
+22C8;BOWTIE;Sm;0;ON;;;;;N;;;;;
+22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;;
+22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;;
+22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;;
+22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;;
+22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;;
+22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;;
+22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;;
+22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;;
+22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;;
+22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;;
+22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;;
+22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;;
+22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;;
+22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;;
+22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;;
+22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;;
+22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;;
+22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;;
+22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;;
+22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;;
+22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;;
+22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;;
+22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;;
+22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;;
+22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;;
+2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;;
+2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;;
+2302;HOUSE;So;0;ON;;;;;N;;;;;
+2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;;
+2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;;
+2305;PROJECTIVE;So;0;ON;;;;;N;;;;;
+2306;PERSPECTIVE;So;0;ON;;;;;N;;;;;
+2307;WAVY LINE;So;0;ON;;;;;N;;;;;
+2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;;
+2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;;
+230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;;
+230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;;
+230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;;
+230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;;
+2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;;
+2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;;
+2312;ARC;So;0;ON;;;;;N;;;;;
+2313;SEGMENT;So;0;ON;;;;;N;;;;;
+2314;SECTOR;So;0;ON;;;;;N;;;;;
+2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;;
+2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;;
+2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;;
+2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;;
+2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;;
+231A;WATCH;So;0;ON;;;;;N;;;;;
+231B;HOURGLASS;So;0;ON;;;;;N;;;;;
+231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;;
+231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;;
+231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;;
+231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;;
+2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2322;FROWN;So;0;ON;;;;;N;;;;;
+2323;SMILE;So;0;ON;;;;;N;;;;;
+2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;;
+2325;OPTION KEY;So;0;ON;;;;;N;;;;;
+2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;;
+2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;;
+2328;KEYBOARD;So;0;ON;;;;;N;;;;;
+2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;;
+232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;;
+232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;;
+232C;BENZENE RING;So;0;ON;;;;;N;;;;;
+232D;CYLINDRICITY;So;0;ON;;;;;N;;;;;
+232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;;
+232F;SYMMETRY;So;0;ON;;;;;N;;;;;
+2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;;
+2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;;
+2332;CONICAL TAPER;So;0;ON;;;;;N;;;;;
+2333;SLOPE;So;0;ON;;;;;N;;;;;
+2334;COUNTERBORE;So;0;ON;;;;;N;;;;;
+2335;COUNTERSINK;So;0;ON;;;;;N;;;;;
+2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;;
+2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;;
+2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;;
+2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;;
+233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;;
+233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;;
+233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;;
+233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;;
+233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;;
+233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;;
+2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;;
+2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;;
+2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;;
+2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;;
+2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;;
+2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;;
+2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;;
+2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;;
+2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;;
+2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;;
+234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;;
+234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;;
+234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;;
+234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;;
+234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;;
+234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;;
+2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;;
+2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;;
+2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;;
+2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;;
+2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;;
+2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;;
+2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;;
+2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;;
+2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;;
+2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;;
+235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;;
+235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;;
+235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;;
+235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;;
+235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;;
+235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;;
+2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;;
+2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;;
+2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;;
+2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;;
+2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;;
+2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;;
+2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;;
+2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;;
+2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;;
+2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;;
+236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;;
+236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;;
+236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;;
+236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;;
+236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;;
+236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;;
+2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;;
+2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;;
+2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;;
+2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;;
+2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;;
+2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;;
+2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;;
+2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;;
+2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;;
+2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;;
+237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;;
+237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;;
+237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;;
+237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;;
+237E;BELL SYMBOL;So;0;ON;;;;;N;;;;;
+237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;;
+2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;;
+2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;;
+2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;;
+2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;;
+2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;;
+2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2388;HELM SYMBOL;So;0;ON;;;;;N;;;;;
+2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;;
+238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;;
+238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;;
+238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;;
+238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;;
+238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;;
+238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;;
+2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;;
+2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;;
+2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;;
+2398;NEXT PAGE;So;0;ON;;;;;N;;;;;
+2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;;
+23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;;
+23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;;
+23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;;
+23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;;
+23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;;
+23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;;
+23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;;
+23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;;
+23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;;
+23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;;
+23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;;
+23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;;
+23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;;
+23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;;
+23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;;
+23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;;
+23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;;
+23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;;
+23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;;
+23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;;
+23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;;
+23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;;
+23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;;
+23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;;
+23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;;
+23DA;EARTH GROUND;So;0;ON;;;;;N;;;;;
+23DB;FUSE;So;0;ON;;;;;N;;;;;
+23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;;
+23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;;
+23E5;FLATNESS;So;0;ON;;;;;N;;;;;
+23E6;AC CURRENT;So;0;ON;;;;;N;;;;;
+23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;;
+2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
+2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
+2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
+2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;;
+2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;;
+2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;;
+2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;;
+2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;;
+2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;;
+2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;;
+240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;;
+240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;;
+240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;;
+240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;;
+240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;;
+240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;;
+2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;;
+2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;;
+2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;;
+2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;;
+2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;;
+2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;;
+2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;;
+2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;;
+2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;;
+2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;;
+241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;;
+241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;;
+241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;;
+241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;;
+241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;;
+241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;;
+2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;;
+2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;;
+2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;;
+2423;OPEN BOX;So;0;ON;;;;;N;;;;;
+2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;;
+2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;;
+2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;;
+2440;OCR HOOK;So;0;ON;;;;;N;;;;;
+2441;OCR CHAIR;So;0;ON;;;;;N;;;;;
+2442;OCR FORK;So;0;ON;;;;;N;;;;;
+2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;;
+2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;;
+2445;OCR BOW TIE;So;0;ON;;;;;N;;;;;
+2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;;
+2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;;
+2448;OCR DASH;So;0;ON;;;;;N;;;;;
+2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;;
+244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;;
+2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;;
+2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;;
+2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;;
+248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;;
+248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;;
+248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;;
+248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;;
+248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;;
+248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;;
+2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;;
+2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;;
+2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;;
+2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;;
+2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;;
+2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;;
+2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;;
+2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;;
+2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;;
+2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;;
+249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;;
+249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;;
+249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;;
+249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;;
+249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;;
+249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;;
+24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;;
+24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;;
+24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;;
+24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;;
+24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;;
+24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;;
+24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;;
+24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;;
+24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;;
+24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;;
+24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;;
+24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;;
+24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;;
+24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;;
+24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;;
+24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;;
+24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;;
+24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;;
+24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;;
+24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;;
+24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;;
+24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;;
+24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0;
+24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1;
+24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2;
+24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3;
+24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4;
+24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5;
+24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6;
+24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7;
+24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8;
+24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9;
+24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA;
+24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB;
+24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC;
+24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD;
+24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE;
+24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF;
+24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0;
+24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1;
+24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2;
+24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3;
+24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4;
+24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5;
+24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6;
+24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7;
+24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8;
+24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9;
+24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6
+24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7
+24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8
+24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9
+24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA
+24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB
+24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC
+24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD
+24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE
+24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF
+24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0
+24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1
+24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2
+24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3
+24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4
+24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5
+24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6
+24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7
+24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8
+24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9
+24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA
+24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB
+24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC
+24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD
+24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE
+24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF
+24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;;
+24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;;
+24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;;
+24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;;
+24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;;
+24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;;
+24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;;
+24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;;
+24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;;
+24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;;
+24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;;
+24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;;
+24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;;
+24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;;
+24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;;
+24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;;
+24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;;
+24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;;
+24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;;
+24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;;
+24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;;
+24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;;
+2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;;
+2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;;
+2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;;
+2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;;
+2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;;
+2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;;
+2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;;
+2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;;
+2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;;
+2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;;
+250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;;
+250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;;
+250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;;
+250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;;
+250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;;
+250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;;
+2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;;
+2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;;
+2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;;
+2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;;
+2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;;
+2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;;
+2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;;
+2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;;
+2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;;
+2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;;
+251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;;
+251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;;
+251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;;
+251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;;
+251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;;
+251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;;
+2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;;
+2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;;
+2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;;
+2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;;
+2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;;
+2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;;
+2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;;
+2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;;
+2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;;
+252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;;
+252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;;
+252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;;
+252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;;
+252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;;
+252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;;
+2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;;
+2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;;
+2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;;
+2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;;
+2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;;
+2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;;
+2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;;
+2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;;
+2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;;
+2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;;
+253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;;
+253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;;
+253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;;
+253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;;
+253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;;
+253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;;
+2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;;
+2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;;
+2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;;
+2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;;
+2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;;
+2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;;
+2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;;
+2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;;
+2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;;
+254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;;
+254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;;
+254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;;
+254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;;
+254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;;
+254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;;
+2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;;
+2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;;
+2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;;
+2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;;
+2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;;
+2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;;
+2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;;
+2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;;
+2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;;
+2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;;
+255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;;
+255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;;
+255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;;
+255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;;
+255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;;
+255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;;
+2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;;
+2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;;
+2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;;
+2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;;
+2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;;
+2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;;
+2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;;
+2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;;
+2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;;
+2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;;
+256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;;
+256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;;
+256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;;
+256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;;
+256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;;
+256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;;
+2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;;
+2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;;
+2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;;
+2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;;
+2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;;
+2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;;
+2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;;
+2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;;
+2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;;
+2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;;
+257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;;
+257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;;
+257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;;
+257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;;
+257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;;
+257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;;
+2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;;
+2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2588;FULL BLOCK;So;0;ON;;;;;N;;;;;
+2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;;
+258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;;
+258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;;
+2591;LIGHT SHADE;So;0;ON;;;;;N;;;;;
+2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+2593;DARK SHADE;So;0;ON;;;;;N;;;;;
+2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;;
+2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;;
+2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;;
+2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;;
+259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;;
+25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;;
+25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;;
+25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;;
+25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;;
+25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;;
+25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;;
+25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;;
+25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;;
+25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;;
+25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;;
+25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;;
+25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;;
+25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;;
+25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;;
+25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;;
+25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;;
+25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;;
+25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;;
+25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;;
+25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;;
+25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;;
+25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;;
+25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;;
+25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;;
+25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;;
+25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;;
+25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;;
+25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;;
+25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+25C9;FISHEYE;So;0;ON;;;;;N;;;;;
+25CA;LOZENGE;So;0;ON;;;;;N;;;;;
+25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;;
+25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25CE;BULLSEYE;So;0;ON;;;;;N;;;;;
+25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;;
+25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E6;WHITE BULLET;So;0;ON;;;;;N;;;;;
+25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;;
+25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;;
+25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;;
+25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;;
+25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+2601;CLOUD;So;0;ON;;;;;N;;;;;
+2602;UMBRELLA;So;0;ON;;;;;N;;;;;
+2603;SNOWMAN;So;0;ON;;;;;N;;;;;
+2604;COMET;So;0;ON;;;;;N;;;;;
+2605;BLACK STAR;So;0;ON;;;;;N;;;;;
+2606;WHITE STAR;So;0;ON;;;;;N;;;;;
+2607;LIGHTNING;So;0;ON;;;;;N;;;;;
+2608;THUNDERSTORM;So;0;ON;;;;;N;;;;;
+2609;SUN;So;0;ON;;;;;N;;;;;
+260A;ASCENDING NODE;So;0;ON;;;;;N;;;;;
+260B;DESCENDING NODE;So;0;ON;;;;;N;;;;;
+260C;CONJUNCTION;So;0;ON;;;;;N;;;;;
+260D;OPPOSITION;So;0;ON;;;;;N;;;;;
+260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;;
+260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;;
+2610;BALLOT BOX;So;0;ON;;;;;N;;;;;
+2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;;
+2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;;
+2613;SALTIRE;So;0;ON;;;;;N;;;;;
+2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;;
+2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;;
+2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2618;SHAMROCK;So;0;ON;;;;;N;;;;;
+2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;;
+2621;CAUTION SIGN;So;0;ON;;;;;N;;;;;
+2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;;
+2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;;
+2624;CADUCEUS;So;0;ON;;;;;N;;;;;
+2625;ANKH;So;0;ON;;;;;N;;;;;
+2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;;
+2627;CHI RHO;So;0;ON;;;;;N;;;;;
+2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;;
+2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;;
+262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;;
+262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;;
+262C;ADI SHAKTI;So;0;ON;;;;;N;;;;;
+262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;;
+262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;;
+262F;YIN YANG;So;0;ON;;;;;N;;;;;
+2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;;
+2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;;
+2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;;
+2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;;
+2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;;
+2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;;
+2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;;
+2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;;
+2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;;
+263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;;
+263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;;
+263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263F;MERCURY;So;0;ON;;;;;N;;;;;
+2640;FEMALE SIGN;So;0;ON;;;;;N;;;;;
+2641;EARTH;So;0;ON;;;;;N;;;;;
+2642;MALE SIGN;So;0;ON;;;;;N;;;;;
+2643;JUPITER;So;0;ON;;;;;N;;;;;
+2644;SATURN;So;0;ON;;;;;N;;;;;
+2645;URANUS;So;0;ON;;;;;N;;;;;
+2646;NEPTUNE;So;0;ON;;;;;N;;;;;
+2647;PLUTO;So;0;ON;;;;;N;;;;;
+2648;ARIES;So;0;ON;;;;;N;;;;;
+2649;TAURUS;So;0;ON;;;;;N;;;;;
+264A;GEMINI;So;0;ON;;;;;N;;;;;
+264B;CANCER;So;0;ON;;;;;N;;;;;
+264C;LEO;So;0;ON;;;;;N;;;;;
+264D;VIRGO;So;0;ON;;;;;N;;;;;
+264E;LIBRA;So;0;ON;;;;;N;;;;;
+264F;SCORPIUS;So;0;ON;;;;;N;;;;;
+2650;SAGITTARIUS;So;0;ON;;;;;N;;;;;
+2651;CAPRICORN;So;0;ON;;;;;N;;;;;
+2652;AQUARIUS;So;0;ON;;;;;N;;;;;
+2653;PISCES;So;0;ON;;;;;N;;;;;
+2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;;
+2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;;
+2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;;
+2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;;
+2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;;
+265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;;
+265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;;
+265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;;
+265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;;
+265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;;
+2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;;
+2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;;
+2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;;
+2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;;
+2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;;
+2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;;
+2668;HOT SPRINGS;So;0;ON;;;;;N;;;;;
+2669;QUARTER NOTE;So;0;ON;;;;;N;;;;;
+266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;;
+266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;;
+266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;;
+266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;;
+266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;;
+266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;;
+2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;pete;;;
+2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;hdpe;;;
+2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;pvc;;;
+2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;ldpe;;;
+2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;pp;;;
+2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;ps;;;
+2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;other;;;
+267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;;
+267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;;
+267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;;
+2680;DIE FACE-1;So;0;ON;;;;;N;;;;;
+2681;DIE FACE-2;So;0;ON;;;;;N;;;;;
+2682;DIE FACE-3;So;0;ON;;;;;N;;;;;
+2683;DIE FACE-4;So;0;ON;;;;;N;;;;;
+2684;DIE FACE-5;So;0;ON;;;;;N;;;;;
+2685;DIE FACE-6;So;0;ON;;;;;N;;;;;
+2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;;
+2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
+2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;;
+2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;;
+268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;;
+268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;;
+268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;;
+268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;;
+268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;;
+268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;;
+2690;WHITE FLAG;So;0;ON;;;;;N;;;;;
+2691;BLACK FLAG;So;0;ON;;;;;N;;;;;
+2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;;
+2693;ANCHOR;So;0;ON;;;;;N;;;;;
+2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;;
+2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;;
+2696;SCALES;So;0;ON;;;;;N;;;;;
+2697;ALEMBIC;So;0;ON;;;;;N;;;;;
+2698;FLOWER;So;0;ON;;;;;N;;;;;
+2699;GEAR;So;0;ON;;;;;N;;;;;
+269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;;
+269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;;
+269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;;
+269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+26A0;WARNING SIGN;So;0;ON;;;;;N;;;;;
+26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;;
+26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;;
+26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;;
+26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;;
+26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;;
+26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;;
+26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;;
+26B0;COFFIN;So;0;ON;;;;;N;;;;;
+26B1;FUNERAL URN;So;0;ON;;;;;N;;;;;
+26B2;NEUTER;So;0;ON;;;;;N;;;;;
+26B3;CERES;So;0;ON;;;;;N;;;;;
+26B4;PALLAS;So;0;ON;;;;;N;;;;;
+26B5;JUNO;So;0;ON;;;;;N;;;;;
+26B6;VESTA;So;0;ON;;;;;N;;;;;
+26B7;CHIRON;So;0;ON;;;;;N;;;;;
+26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;;
+26B9;SEXTILE;So;0;ON;;;;;N;;;;;
+26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;;
+26BB;QUINCUNX;So;0;ON;;;;;N;;;;;
+26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;;
+26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
+2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;;
+2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;;
+2707;TAPE DRIVE;So;0;ON;;;;;N;;;;;
+2708;AIRPLANE;So;0;ON;;;;;N;;;;;
+2709;ENVELOPE;So;0;ON;;;;;N;;;;;
+270C;VICTORY HAND;So;0;ON;;;;;N;;;;;
+270D;WRITING HAND;So;0;ON;;;;;N;;;;;
+270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+270F;PENCIL;So;0;ON;;;;;N;;;;;
+2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+2711;WHITE NIB;So;0;ON;;;;;N;;;;;
+2712;BLACK NIB;So;0;ON;;;;;N;;;;;
+2713;CHECK MARK;So;0;ON;;;;;N;;;;;
+2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;;
+2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2717;BALLOT X;So;0;ON;;;;;N;;;;;
+2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;;
+2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;;
+271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;;
+271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;;
+271D;LATIN CROSS;So;0;ON;;;;;N;;;;;
+271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;;
+271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;;
+2720;MALTESE CROSS;So;0;ON;;;;;N;;;;;
+2721;STAR OF DAVID;So;0;ON;;;;;N;;;;;
+2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;;
+272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;;
+272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;;
+272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;;
+2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;;
+2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;;
+2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;;
+273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;;
+273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;;
+2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;;
+2744;SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2747;SPARKLE;So;0;ON;;;;;N;;;;;
+2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;;
+2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;;
+2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;;
+2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;;
+2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;;
+2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;;
+2766;FLORAL HEART;So;0;ON;;;;;N;;;;;
+2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;;
+2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;;
+2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;;
+2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;;
+277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;;
+277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;;
+277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;;
+277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;;
+277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;;
+277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;;
+2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;;
+2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;;
+2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;;
+2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;;
+2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;;
+2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;;
+2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;;
+2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;;
+278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;;
+278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;;
+278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;;
+278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;;
+278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;;
+278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;;
+2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;;
+2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;;
+2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;;
+2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;;
+2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;;
+279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;;
+279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;;
+279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;;
+279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;;
+279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;;
+279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;;
+27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;;
+27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;;
+27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;;
+27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;;
+27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;;
+27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;;
+27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;;
+27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;;
+27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;;
+27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;;
+27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;;
+27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;;
+27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;;
+27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;;
+27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;;
+27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;;
+27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;;
+27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;;
+27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;;
+27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;;
+27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;;
+27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;;
+27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;;
+27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;;
+27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;;
+27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;;
+27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;;
+27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;;
+27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;;
+27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;;
+27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;;
+27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;;
+27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;;
+27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;;
+2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;;
+2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;;
+2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;;
+2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;;
+2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;;
+293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;;
+293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;;
+2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;;
+297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;;
+2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;;
+2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;;
+2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;;
+2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;;
+2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;;
+2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;;
+2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;;
+2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;;
+298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;;
+298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;;
+298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;;
+298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;;
+298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;;
+298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;;
+2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;;
+2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;;
+2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;;
+2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;;
+299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;;
+299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;;
+299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;;
+299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;;
+299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;;
+29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;;
+29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;;
+29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;;
+29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;;
+29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;;
+29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;;
+29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;;
+29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;;
+29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;;
+29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;;
+29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;;
+29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;;
+29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;;
+29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;;
+29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;;
+29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;;
+29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;;
+29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;;
+29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;;
+29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;;
+29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;;
+29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;;
+29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;;
+29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;;
+29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;;
+29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+29FE;TINY;Sm;0;ON;;;;;N;;;;;
+29FF;MINY;Sm;0;ON;;;;;N;;;;;
+2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;;
+2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;;
+2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;;
+2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;;
+2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;;
+2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;;
+2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;;
+2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;;
+2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;;
+2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;;
+2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;;
+2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;;
+2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1D;JOIN;Sm;0;ON;;;;;N;;;;;
+2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;;
+2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;;
+2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;;
+2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;;
+2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;;
+2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;;
+2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;;
+2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;;
+2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;;
+2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;;
+2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;;
+2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;;
+2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;;
+2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;;
+2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;;
+2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;;
+2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;;
+2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;;
+2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;;
+2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;;
+2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;;
+2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;;
+2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;;
+2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;;
+2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;not independent;;;
+2ADD;NONFORKING;Sm;0;ON;;;;;N;;independent;;;
+2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;;
+2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;;
+2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;;
+2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;;
+2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;;
+2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;;
+2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;;
+2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;;
+2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;;
+2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;;
+2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;;
+2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;;
+2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;;
+2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;;
+2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;;
+2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;;
+2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;;
+2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
+2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
+2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
+2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33;
+2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34;
+2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35;
+2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36;
+2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37;
+2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38;
+2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39;
+2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A;
+2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B;
+2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C;
+2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D;
+2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E;
+2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F;
+2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40;
+2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41;
+2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42;
+2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43;
+2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44;
+2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45;
+2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46;
+2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47;
+2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48;
+2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49;
+2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A;
+2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B;
+2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C;
+2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D;
+2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E;
+2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F;
+2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50;
+2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51;
+2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52;
+2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53;
+2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54;
+2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55;
+2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56;
+2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57;
+2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58;
+2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59;
+2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A;
+2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B;
+2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C;
+2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D;
+2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E;
+2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00
+2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01
+2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02
+2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03
+2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04
+2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05
+2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06
+2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07
+2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08
+2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09
+2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A
+2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B
+2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C
+2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D
+2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E
+2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F
+2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10
+2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11
+2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12
+2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13
+2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14
+2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15
+2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16
+2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17
+2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18
+2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19
+2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A
+2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B
+2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C
+2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D
+2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E
+2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F
+2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20
+2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21
+2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22
+2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23
+2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24
+2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25
+2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26
+2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27
+2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28
+2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29
+2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A
+2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B
+2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C
+2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D
+2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E
+2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61;
+2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60
+2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B;
+2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D;
+2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D;
+2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A
+2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E
+2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68;
+2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67
+2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A;
+2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69
+2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C;
+2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B
+2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251;
+2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271;
+2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250;
+2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;;
+2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73;
+2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72
+2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;;
+2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76;
+2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75
+2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;;
+2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;;
+2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;;
+2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;;
+2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;;
+2C7C;LATIN SUBSCRIPT SMALL LETTER J;Ll;0;L;<sub> 006A;;;;N;;;;;
+2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;;
+2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81;
+2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80
+2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83;
+2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82
+2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85;
+2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84
+2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87;
+2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86
+2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89;
+2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88
+2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B;
+2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A
+2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D;
+2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C
+2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F;
+2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E
+2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91;
+2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90
+2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93;
+2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92
+2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95;
+2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94
+2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97;
+2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96
+2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99;
+2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98
+2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B;
+2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A
+2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D;
+2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C
+2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F;
+2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E
+2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1;
+2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0
+2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3;
+2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2
+2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5;
+2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4
+2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7;
+2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6
+2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9;
+2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8
+2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB;
+2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA
+2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD;
+2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC
+2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF;
+2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE
+2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1;
+2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0
+2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3;
+2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2
+2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5;
+2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4
+2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7;
+2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6
+2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9;
+2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8
+2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB;
+2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA
+2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD;
+2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC
+2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF;
+2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE
+2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1;
+2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0
+2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3;
+2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2
+2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5;
+2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4
+2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7;
+2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6
+2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9;
+2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8
+2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB;
+2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA
+2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD;
+2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC
+2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF;
+2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE
+2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1;
+2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0
+2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3;
+2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2
+2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5;
+2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4
+2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7;
+2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6
+2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9;
+2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8
+2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB;
+2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA
+2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD;
+2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC
+2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF;
+2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE
+2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1;
+2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0
+2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3;
+2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2
+2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;;
+2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;;
+2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;;
+2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;;
+2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;;
+2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;;
+2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;;
+2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
+2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;;
+2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;;
+2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0
+2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1
+2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2
+2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3
+2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4
+2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5
+2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6
+2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7
+2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8
+2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9
+2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA
+2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB
+2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC
+2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD
+2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE
+2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF
+2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0
+2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1
+2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2
+2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3
+2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4
+2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5
+2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6
+2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7
+2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8
+2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9
+2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA
+2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB
+2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC
+2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD
+2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE
+2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF
+2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0
+2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1
+2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2
+2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3
+2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4
+2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5
+2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;;
+2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;;
+2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;;
+2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;;
+2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;;
+2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;;
+2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;;
+2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;;
+2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;;
+2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;;
+2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;;
+2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;;
+2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;;
+2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;;
+2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;;
+2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;;
+2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;;
+2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;;
+2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;;
+2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;;
+2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;;
+2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;;
+2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;;
+2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;;
+2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;;
+2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;;
+2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;;
+2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;;
+2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;;
+2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;;
+2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;;
+2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;;
+2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;;
+2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;;
+2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;;
+2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;;
+2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;;
+2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;;
+2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;;
+2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;;
+2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;;
+2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;;
+2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;;
+2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;;
+2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;;
+2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;;
+2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;;
+2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;;
+2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;;
+2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;;
+2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;;
+2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;;
+2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;;
+2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;;
+2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;;
+2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;;
+2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;;
+2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;;
+2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;;
+2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;;
+2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;;
+2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;;
+2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;;
+2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;;
+2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;;
+2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;;
+2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;;
+2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;;
+2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;;
+2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;;
+2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;;
+2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;;
+2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;;
+2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;;
+2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;;
+2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;;
+2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;;
+2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;;
+2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;;
+2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;;
+2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;;
+2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;;
+2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;;
+2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;;
+2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;;
+2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;;
+2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;;
+2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;;
+2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;;
+2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;;
+2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;;
+2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;;
+2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;;
+2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;;
+2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;;
+2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;;
+2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;;
+2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;;
+2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;;
+2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;;
+2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;;
+2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;;
+2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;;
+2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;;
+2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;;
+2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;;
+2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;;
+2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;;
+2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;;
+2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;;
+2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;;
+2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;;
+2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;;
+2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;;
+2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;;
+2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;;
+2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;;
+2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;;
+2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;;
+2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;;
+2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;;
+2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;;
+2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;;
+2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;;
+2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;;
+2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;;
+2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;;
+2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;;
+2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;;
+2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;;
+2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;;
+2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;;
+2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;;
+2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;;
+2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;;
+2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;;
+2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;;
+2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;;
+2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;;
+2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;;
+2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;;
+2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;;
+2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;;
+2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;;
+2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;;
+2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;;
+2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;;
+2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;;
+2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;;
+2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;;
+2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;;
+2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;;
+2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;;
+2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;;
+2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;;
+2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;;
+2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;;
+2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;;
+2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;;
+2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;;
+2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;;
+2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;;
+2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;;
+2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;;
+2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;;
+2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;;
+2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;;
+2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;;
+2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;;
+2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;;
+2E30;RING POINT;Po;0;ON;;;;;N;;;;;
+2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
+2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
+2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
+2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;;
+2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;;
+2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;;
+2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;;
+2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;;
+2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;;
+2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;;
+2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;;
+2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;;
+2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;;
+2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;;
+2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;;
+2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;;
+2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;;
+2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;;
+2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;;
+2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;;
+2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;;
+2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;;
+2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;;
+2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;;
+2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;;
+2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;;
+2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;;
+2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;;
+2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;;
+2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;;
+2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;;
+2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;;
+2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;;
+2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;;
+2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;;
+2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;;
+2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;;
+2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;;
+2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;;
+2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;;
+2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;;
+2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;;
+2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;;
+2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;;
+2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;;
+2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;;
+2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;;
+2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;;
+2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;;
+2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;;
+2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;;
+2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;;
+2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;;
+2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;;
+2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;;
+2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;;
+2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;;
+2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;;
+2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;;
+2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;;
+2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;;
+2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;;
+2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;;
+2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;;
+2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;;
+2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;;
+2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;;
+2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;;
+2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;;
+2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;;
+2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;;
+2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;;
+2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;;
+2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;;
+2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;;
+2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;;
+2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;;
+2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;;
+2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;;
+2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;;
+2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;;
+2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;;
+2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;;
+2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;;
+2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;;
+2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;;
+2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;;
+2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;;
+2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;;
+2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;;
+2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;;
+2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;;
+2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;;
+2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;;
+2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;;
+2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;;
+2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;;
+2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;;
+2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;;
+2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;;
+2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;;
+2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;;
+2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;;
+2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;;
+2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;;
+2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;;
+2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;;
+2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;;
+2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;;
+2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;;
+2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;;
+2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;;
+2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;;
+2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;;
+2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;;
+2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;;
+2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;;
+2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;;
+2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;;
+2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;;
+2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;;
+2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;;
+2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;;
+2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;;
+2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;;
+2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;;
+2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;;
+2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;;
+2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;;
+2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;;
+2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;;
+2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;;
+2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;;
+2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;;
+2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;;
+2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;;
+2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;;
+2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;;
+2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;;
+2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;;
+2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;;
+2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;;
+2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;;
+2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;;
+2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;;
+2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;;
+2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;;
+2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;;
+2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;;
+2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;;
+2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;
+2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;;
+2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;;
+2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;;
+2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;;
+2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;;
+2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;;
+2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;;
+2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;;
+2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;;
+2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;;
+2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;;
+2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;;
+2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;;
+2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;;
+2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;;
+2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;;
+2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;;
+2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;;
+2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;;
+2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;;
+2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;;
+2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;;
+2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;;
+2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;;
+2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;;
+2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;;
+2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;;
+2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;;
+2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;;
+2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;;
+2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;;
+2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;;
+2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;;
+2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;;
+2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;;
+2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;;
+2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;;
+2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;;
+2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;;
+2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;;
+2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;;
+2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;;
+2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;;
+2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;;
+2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;;
+2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;;
+2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;;
+2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;;
+2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;;
+2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;;
+2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;;
+2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;;
+2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;;
+2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;;
+2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;;
+2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;;
+2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;;
+2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;;
+2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;;
+2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;;
+2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;;
+2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;;
+2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;;
+2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;;
+2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;;
+2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;;
+2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;;
+2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;;
+2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;;
+2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;;
+2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;;
+2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;;
+2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;;
+2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;;
+2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;;
+2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;;
+2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;;
+2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;;
+2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;;
+2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;;
+2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;;
+2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;;
+2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;;
+2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;;
+2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;;
+2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;;
+2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;;
+2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;;
+2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;;
+2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;;
+2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;;
+2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;;
+2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;;
+2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;;
+2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;;
+2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;;
+2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;;
+2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;;
+2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;;
+2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;;
+2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;;
+2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;;
+2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;;
+2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;;
+2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;;
+2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;;
+2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;;
+2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;;
+2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;;
+2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;;
+2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;;
+2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;;
+2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;;
+2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;;
+2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;;
+2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;;
+2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;;
+2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;;
+2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;;
+2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;;
+2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;;
+2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;;
+2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;;
+2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;;
+2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;;
+2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;;
+2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;;
+2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;;
+2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;;
+2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;;
+2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;;
+2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;;
+2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;;
+2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;;
+2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;;
+2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;;
+2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;;
+2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;;
+2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;;
+2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;;
+2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;;
+2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;
+2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;;
+2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;;
+2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;;
+2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;;
+2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;;
+2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;;
+2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;;
+2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;;
+2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;;
+2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;;
+2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;;
+2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;;
+2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;;
+2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;;
+2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;;
+2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;;
+2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;;
+2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;;
+2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;;
+2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;;
+2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;;
+2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;;
+2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;;
+2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;;
+2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;;
+2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;;
+2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;;
+2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;;
+2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;;
+2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;;
+2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;;
+2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;;
+2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;;
+2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;;
+2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;;
+2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;;
+2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;;
+2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;;
+2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;;
+2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;;
+2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;;
+2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;;
+3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;
+3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;;
+3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;;
+3003;DITTO MARK;Po;0;ON;;;;;N;;;;;
+3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;;
+3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;;
+3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;;
+3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;;
+3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;;
+300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;;
+300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;;
+300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;;
+300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;;
+300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;;
+300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;;
+3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;;
+3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;;
+3012;POSTAL MARK;So;0;ON;;;;;N;;;;;
+3013;GETA MARK;So;0;ON;;;;;N;;;;;
+3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;;
+3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;;
+3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;;
+3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;;
+3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;;
+3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;;
+301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;;
+301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;;
+301C;WAVE DASH;Pd;0;ON;;;;;N;;;;;
+301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
+301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;;
+3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;;
+3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;;
+3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;
+3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;;
+3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;;
+3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;;
+3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;;
+3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;;
+3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;;
+302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;;
+302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;;
+302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;;
+302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;;
+302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+3030;WAVY DASH;Pd;0;ON;;;;;N;;;;;
+3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;;
+3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;;
+3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;;
+3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;;
+3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;;
+3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;;
+3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;;
+303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;;
+303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+303C;MASU MARK;Lo;0;L;;;;;N;;;;;
+303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;;
+303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;;
+303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;;
+3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;;
+3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;;
+3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;;
+3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;;
+3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;;
+304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;;
+304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;;
+304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;;
+304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;;
+304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;;
+3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;;
+3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;;
+3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;;
+3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;;
+3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;;
+3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;;
+3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;;
+3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;;
+3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;;
+3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;;
+305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;;
+305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;;
+305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;;
+305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;;
+305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;;
+305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;;
+3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;;
+3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;;
+3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;;
+3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;;
+3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;;
+3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;;
+3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;;
+3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;;
+3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;;
+306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;;
+306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;;
+306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;;
+306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;;
+306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;;
+306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;;
+3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;;
+3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;;
+3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;;
+3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;;
+3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;;
+3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;;
+3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;;
+3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;;
+3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;;
+3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;;
+307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;;
+307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;;
+307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;;
+307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;;
+307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;;
+307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;;
+3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;;
+3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;;
+3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;;
+3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;;
+3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;;
+3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;;
+3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;;
+308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;;
+308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;;
+308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;;
+308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;;
+308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;;
+3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;;
+3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;;
+3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;;
+3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;;
+3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;;
+3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;;
+309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;;
+309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;;
+309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;;
+309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;;
+309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;;
+30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;;
+30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;;
+30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;;
+30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;;
+30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;;
+30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;;
+30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;;
+30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;;
+30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;;
+30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;;
+30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;;
+30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;;
+30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;;
+30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;;
+30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;;
+30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;;
+30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;;
+30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;;
+30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;;
+30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;;
+30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;;
+30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;;
+30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;;
+30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;;
+30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;;
+30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;;
+30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;;
+30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;;
+30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;;
+30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;;
+30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;;
+30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;;
+30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;;
+30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;;
+30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;;
+30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;;
+30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;;
+30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;;
+30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;;
+30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;;
+30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;;
+30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;;
+30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;;
+30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;;
+30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;;
+30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;;
+30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;;
+30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;;
+30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;;
+30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;;
+30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;;
+30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;;
+30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;;
+30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;;
+30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;;
+30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;;
+30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;;
+30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;;
+30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;;
+30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;;
+30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;;
+30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;;
+30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;;
+30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;;
+30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;;
+30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;;
+30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;;
+30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;;
+30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;;
+30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;;
+30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;;
+30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;;
+30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;;
+30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;;
+30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;;
+30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;;
+30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;;
+30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;;
+30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;;
+30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;;
+30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;;
+30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;;
+3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;;
+3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;;
+3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;;
+3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;;
+3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;;
+310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;;
+310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;;
+310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;;
+310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;;
+310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;;
+310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;;
+3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;;
+3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;;
+3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;;
+3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;;
+3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;;
+3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;;
+3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;;
+3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;;
+3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;;
+3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;;
+311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;;
+311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;;
+311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;;
+311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;;
+311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;;
+311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;;
+3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;;
+3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;;
+3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;;
+3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;;
+3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;;
+3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;;
+3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;;
+3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;;
+3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;;
+3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;;
+312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;;
+312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
+312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
+312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;;
+3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
+3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
+3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
+3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;;
+3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;;
+3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;;
+3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;;
+3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;;
+3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;;
+313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;;
+313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;;
+313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;;
+313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;;
+313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;;
+313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;;
+3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;;
+3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;;
+3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;;
+3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;;
+3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;;
+3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;;
+3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;;
+3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;;
+3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;;
+3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;;
+314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;;
+314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;;
+314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;;
+314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;;
+314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;;
+314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;;
+3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;;
+3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;;
+3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;;
+3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;;
+3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;;
+3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;;
+3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;;
+3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;;
+3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;;
+3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;;
+315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;;
+315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;;
+315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;;
+315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;;
+315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;;
+315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;;
+3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;;
+3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;;
+3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;;
+3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;;
+3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;;
+3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;;
+3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;;
+3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;;
+3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;;
+3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;;
+316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;;
+316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;;
+316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;;
+316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;;
+316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;;
+316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;;
+3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;;
+3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;;
+3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;;
+3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;;
+3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;;
+3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;;
+3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;;
+3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;;
+3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;;
+3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;;
+317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;;
+317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;;
+317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;;
+317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;;
+317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;;
+317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;;
+3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;;
+3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;;
+3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;;
+3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;;
+3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;;
+3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;;
+3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;;
+3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;;
+3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;;
+3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;;
+318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;;
+318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;;
+318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;;
+318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;;
+318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
+3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;;
+3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;;
+3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;Kaeriten;;;
+3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;;
+3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;;
+3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;Kaeriten;;;
+3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;Kaeriten;;;
+319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;Kaeriten;;;
+319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;Kaeriten;;;
+319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;Kaeriten;;;
+319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;Kaeriten;;;
+319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;Kaeriten;;;
+319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;;
+31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;;
+31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;;
+31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;;
+31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;;
+31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;;
+31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;;
+31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;;
+31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;;
+31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;;
+31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;;
+31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;;
+31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;;
+31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;;
+31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;;
+31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;;
+31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;;
+31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;;
+31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;;
+31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;;
+31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;;
+31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;;
+31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;;
+31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;;
+31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;;
+31C0;CJK STROKE T;So;0;ON;;;;;N;;;;;
+31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;;
+31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;;
+31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;;
+31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;;
+31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;;
+31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;;
+31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;;
+31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;;
+31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;;
+31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;;
+31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;;
+31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;;
+31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;;
+31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;;
+31CF;CJK STROKE N;So;0;ON;;;;;N;;;;;
+31D0;CJK STROKE H;So;0;ON;;;;;N;;;;;
+31D1;CJK STROKE S;So;0;ON;;;;;N;;;;;
+31D2;CJK STROKE P;So;0;ON;;;;;N;;;;;
+31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;;
+31D4;CJK STROKE D;So;0;ON;;;;;N;;;;;
+31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;;
+31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;;
+31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;;
+31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;;
+31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;;
+31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;;
+31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;;
+31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;;
+31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;;
+31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;;
+31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;;
+31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;;
+31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;;
+31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;;
+31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;;
+31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;;
+31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;;
+31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;;
+31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;;
+31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;;
+31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;;
+31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;;
+31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;;
+31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;;
+31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;;
+31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;;
+31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;;
+31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;;
+31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;;
+31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;;
+31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;;
+3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;;
+3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;;
+3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;;
+3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;;
+3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;;
+3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;;
+3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;;
+3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;;
+3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;;
+3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;;
+320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;;
+320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;;
+320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;;
+320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;;
+320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;;
+320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;;
+3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;;
+3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;;
+3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;;
+3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;;
+3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;;
+3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;;
+3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;;
+3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;;
+3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;;
+3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;;
+321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
+321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
+321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
+321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;;
+321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;;
+3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;;
+322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;;
+322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;;
+322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;;
+322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;;
+322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;;
+322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;;
+3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;;
+3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;;
+3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;;
+3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;;
+3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;;
+3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;;
+3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;;
+3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;;
+3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;;
+3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;;
+323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;;
+323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;;
+323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;;
+323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;;
+323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;;
+323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;;
+3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;;
+3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;;
+3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;;
+3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;;
+3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;;
+3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;;
+3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;;
+3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;;
+3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;;
+3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;;
+3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;;
+3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;;
+3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;;
+3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;;
+325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;;
+325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;;
+325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;;
+325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;;
+325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;;
+325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;;
+3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;;
+3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;;
+3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;;
+3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;;
+3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;;
+3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;;
+3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;;
+3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;;
+3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;;
+3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;;
+326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;;
+326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;;
+326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;;
+326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;;
+326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;;
+326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;;
+3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;;
+3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;;
+3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;;
+3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;;
+3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;;
+3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;;
+3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;;
+3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;;
+3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;;
+3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;;
+327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;;
+327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
+327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;;
+327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;;
+327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;;
+327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
+3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
+3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
+3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;;
+3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;;
+3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;;
+3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;;
+3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;;
+3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;;
+3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;;
+3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;;
+328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;;
+328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;;
+328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;;
+328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;;
+328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;;
+328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;;
+3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;;
+3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;;
+3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;;
+3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;;
+3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;;
+3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;;
+3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;;
+3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;;
+3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;;
+3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;;
+329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;;
+329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;;
+329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;;
+329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;;
+329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;;
+329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;;
+32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;;
+32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;;
+32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;;
+32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;;
+32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;;
+32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;;
+32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;;
+32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;;
+32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;;
+32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;;
+32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;;
+32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;;
+32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;;
+32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;;
+32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;;
+32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;;
+32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;;
+32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;;
+32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;;
+32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;;
+32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;;
+32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;;
+32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;;
+32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;;
+32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;;
+32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;;
+32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;;
+32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;;
+32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;;
+32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;;
+32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;;
+32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;;
+32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;;
+32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;;
+32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;;
+32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;;
+32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;;
+32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;;
+32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;;
+32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;;
+32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;;
+32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;;
+32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;;
+32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;;
+32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;;
+32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;;
+32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;;
+32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;;
+32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;;
+32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;;
+32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;;
+32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;;
+32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;;
+32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;;
+32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;;
+32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;;
+32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;;
+32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;;
+32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;;
+32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;;
+32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;;
+32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;;
+32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;;
+32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;;
+32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;;
+32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;;
+32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;;
+32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;;
+32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;;
+32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;;
+32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;;
+32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;;
+32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;;
+32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;;
+32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;;
+32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;;
+32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;;
+32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;;
+32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;;
+32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;;
+32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;;
+32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;;
+32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;;
+32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;;
+32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;;
+32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;;
+32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;;
+32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;;
+32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;;
+32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;;
+32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;;
+32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;;
+32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;;
+32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;;
+32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;;
+3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;;
+3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;;
+3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;;
+3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;;
+3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;;
+3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;;
+3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;;
+3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;;
+3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;;
+3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;;
+330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;;
+330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;;
+330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;;
+330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;;
+330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;;
+330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;;
+3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;;
+3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;;
+3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;;
+3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;;
+3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;;
+3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;;
+3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;;
+3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;;
+3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;;
+3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;;
+331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;;
+331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;;
+331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;;
+331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;;
+331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;;
+331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;;
+3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;;
+3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;;
+3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;;
+3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;;
+3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;;
+3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;;
+3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;;
+3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;;
+3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;;
+3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;;
+332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;;
+332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;;
+332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;;
+332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;;
+332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;;
+332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;;
+3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;;
+3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;;
+3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;;
+3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;;
+3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;;
+3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;;
+3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;;
+3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;;
+3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;;
+3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;;
+333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;;
+333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;;
+333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;;
+333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;;
+333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;;
+333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;;
+3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;;
+3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;;
+3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;;
+3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;;
+3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;;
+3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;;
+3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;;
+3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;;
+3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;;
+3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;;
+334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;;
+334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;;
+334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;;
+334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;;
+334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;;
+334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;;
+3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;;
+3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;;
+3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;;
+3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;;
+3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;;
+3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;;
+3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;;
+3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;;
+3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;;
+3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;;
+335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;;
+335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;;
+335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;;
+335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;;
+335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;;
+335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;;
+3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;;
+3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;;
+3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;;
+3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;;
+3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;;
+3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;;
+3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;;
+3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;;
+3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;;
+3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;;
+336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;;
+336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;;
+336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;;
+336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;;
+336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;;
+336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;;
+3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;;
+3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;;
+3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;;
+3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;;
+3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;;
+3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;;
+3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;;
+3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;;
+3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;;
+3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;;
+337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;;
+337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;;
+337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;;
+337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;;
+337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;;
+337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;;
+3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;;
+3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;;
+3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;;
+3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;;
+3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;;
+3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;;
+3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;;
+3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;;
+3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;;
+3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;;
+338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;;
+338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;;
+338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;;
+338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;;
+338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;;
+338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;;
+3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;;
+3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;;
+3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;;
+3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;;
+3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;;
+3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;;
+3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;;
+3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;;
+3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;;
+3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;;
+339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;;
+339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;;
+339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;;
+339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;;
+339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;;
+339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;;
+33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;;
+33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;;
+33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;;
+33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;;
+33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;;
+33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;;
+33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;;
+33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;;
+33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;;
+33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;;
+33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;;
+33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;;
+33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;;
+33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;;
+33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;;
+33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;;
+33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;;
+33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;;
+33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;;
+33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;;
+33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;;
+33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;;
+33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;;
+33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;;
+33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;;
+33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;;
+33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;;
+33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;;
+33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;;
+33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;;
+33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;;
+33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;;
+33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;;
+33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;;
+33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;;
+33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;;
+33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;;
+33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;;
+33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;;
+33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;;
+33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;;
+33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;;
+33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;;
+33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;;
+33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;;
+33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;;
+33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;;
+33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;;
+33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;;
+33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;;
+33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;;
+33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;;
+33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;;
+33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;;
+33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;;
+33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;;
+33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;;
+33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;;
+33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;;
+33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;;
+33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;;
+33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;;
+33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;;
+33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;;
+33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;;
+33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;;
+33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;;
+33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;;
+33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;;
+33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;;
+33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;;
+33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;;
+33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;;
+33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;;
+33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;;
+33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;;
+33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;;
+33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;;
+33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;;
+33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;;
+33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;;
+33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;;
+33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;;
+33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;;
+33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;;
+33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;;
+33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;;
+33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;;
+33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;;
+33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;;
+33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;;
+33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;;
+33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;;
+33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;;
+33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;;
+33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;;
+3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
+4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
+4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;;
+4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;;
+4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;;
+4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;;
+4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;;
+4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;;
+4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;;
+4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;;
+4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;;
+4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;;
+4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;;
+4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;;
+4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;;
+4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;;
+4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;;
+4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;;
+4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;;
+4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;;
+4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;;
+4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;;
+4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;;
+4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;;
+4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;;
+4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;;
+4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;;
+4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;;
+4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;;
+4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;;
+4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;;
+4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;;
+4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;;
+4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;;
+4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;;
+4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;;
+4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;;
+4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;;
+4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;;
+4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;;
+4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;;
+4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;;
+4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;;
+4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;;
+4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;;
+4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;;
+4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;;
+4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;;
+4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;;
+4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;;
+4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;;
+4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;;
+4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;;
+4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;;
+4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;;
+4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;;
+4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;;
+4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;;
+4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
+4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
+4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
+9FC3;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
+A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
+A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;;
+A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;;
+A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;;
+A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;;
+A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;;
+A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;;
+A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;;
+A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;;
+A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;;
+A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;;
+A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;;
+A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;;
+A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;;
+A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;;
+A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;;
+A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;;
+A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
+A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;;
+A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;;
+A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;;
+A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;;
+A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;;
+A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;;
+A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;;
+A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;;
+A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;;
+A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;;
+A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;;
+A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;;
+A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;;
+A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;;
+A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;;
+A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;;
+A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;;
+A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;;
+A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;;
+A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;;
+A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;;
+A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;;
+A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;;
+A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;;
+A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;;
+A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;;
+A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;;
+A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;;
+A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;;
+A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;;
+A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;;
+A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;;
+A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;;
+A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;;
+A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;;
+A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;;
+A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;;
+A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;;
+A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;;
+A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;;
+A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;;
+A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;;
+A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;;
+A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;;
+A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;;
+A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;;
+A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;;
+A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;;
+A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;;
+A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;;
+A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;;
+A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;;
+A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;;
+A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;;
+A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;;
+A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;;
+A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;;
+A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;;
+A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;;
+A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;;
+A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;;
+A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;;
+A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;;
+A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;;
+A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;;
+A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;;
+A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;;
+A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;;
+A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;;
+A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;;
+A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;;
+A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;;
+A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;;
+A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;;
+A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;;
+A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;;
+A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;;
+A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;;
+A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;;
+A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;;
+A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;;
+A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;;
+A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;;
+A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;;
+A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;;
+A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;;
+A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;;
+A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;;
+A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;;
+A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;;
+A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;;
+A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;;
+A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;;
+A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;;
+A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;;
+A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;;
+A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;;
+A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;;
+A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;;
+A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;;
+A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;;
+A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;;
+A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;;
+A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;;
+A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;;
+A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;;
+A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;;
+A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;;
+A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;;
+A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;;
+A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;;
+A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;;
+A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;;
+A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;;
+A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;;
+A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;;
+A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;;
+A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;;
+A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;;
+A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;;
+A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;;
+A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;;
+A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;;
+A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;;
+A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;;
+A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;;
+A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;;
+A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;;
+A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;;
+A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;;
+A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;;
+A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;;
+A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;;
+A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;;
+A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;;
+A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;;
+A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;;
+A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;;
+A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;;
+A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;;
+A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;;
+A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;;
+A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;;
+A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;;
+A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;;
+A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;;
+A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;;
+A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;;
+A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;;
+A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;;
+A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;;
+A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;;
+A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;;
+A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;;
+A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;;
+A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;;
+A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;;
+A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;;
+A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;;
+A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;;
+A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;;
+A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;;
+A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;;
+A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;;
+A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;;
+A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;;
+A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;;
+A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;;
+A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;;
+A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;;
+A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;;
+A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;;
+A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;;
+A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;;
+A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;;
+A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;;
+A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;;
+A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;;
+A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;;
+A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;;
+A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;;
+A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;;
+A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;;
+A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;;
+A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;;
+A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;;
+A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;;
+A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;;
+A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;;
+A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;;
+A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;;
+A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;;
+A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;;
+A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;;
+A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;;
+A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;;
+A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;;
+A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;;
+A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;;
+A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;;
+A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;;
+A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;;
+A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;;
+A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;;
+A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;;
+A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;;
+A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;;
+A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;;
+A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;;
+A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;;
+A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;;
+A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;;
+A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;;
+A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;;
+A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;;
+A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;;
+A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;;
+A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;;
+A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;;
+A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;;
+A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;;
+A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;;
+A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;;
+A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;;
+A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;;
+A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;;
+A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;;
+A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;;
+A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;;
+A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;;
+A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;;
+A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;;
+A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;;
+A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;;
+A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;;
+A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;;
+A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;;
+A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;;
+A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;;
+A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;;
+A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;;
+A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;;
+A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;;
+A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;;
+A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;;
+A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;;
+A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;;
+A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;;
+A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;;
+A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;;
+A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;;
+A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;;
+A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;;
+A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;;
+A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;;
+A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;;
+A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;;
+A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;;
+A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;;
+A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;;
+A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;;
+A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;;
+A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;;
+A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;;
+A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;;
+A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;;
+A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;;
+A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;;
+A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;;
+A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;;
+A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;;
+A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;;
+A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;;
+A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;;
+A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;;
+A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;;
+A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;;
+A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;;
+A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;;
+A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;;
+A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;;
+A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;;
+A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;;
+A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;;
+A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;;
+A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;;
+A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;;
+A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;;
+A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;;
+A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;;
+A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;;
+A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;;
+A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;;
+A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;;
+A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;;
+A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;;
+A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;;
+A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;;
+A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;;
+A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;;
+A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;;
+A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;;
+A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;;
+A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;;
+A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;;
+A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;;
+A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;;
+A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;;
+A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;;
+A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;;
+A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;;
+A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;;
+A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;;
+A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;;
+A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;;
+A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;;
+A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;;
+A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;;
+A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;;
+A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;;
+A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;;
+A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;;
+A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;;
+A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;;
+A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;;
+A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;;
+A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;;
+A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;;
+A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;;
+A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;;
+A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;;
+A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;;
+A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;;
+A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;;
+A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;;
+A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;;
+A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;;
+A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;;
+A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;;
+A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;;
+A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;;
+A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;;
+A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;;
+A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;;
+A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;;
+A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;;
+A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;;
+A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;;
+A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;;
+A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;;
+A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;;
+A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;;
+A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;;
+A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;;
+A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;;
+A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;;
+A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;;
+A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;;
+A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;;
+A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;;
+A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;;
+A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;;
+A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;;
+A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;;
+A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;;
+A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;;
+A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;;
+A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;;
+A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;;
+A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;;
+A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;;
+A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;;
+A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;;
+A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;;
+A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;;
+A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;;
+A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;;
+A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;;
+A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;;
+A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;;
+A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;;
+A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;;
+A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;;
+A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;;
+A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;;
+A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;;
+A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;;
+A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;;
+A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;;
+A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;;
+A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;;
+A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;;
+A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;;
+A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;;
+A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;;
+A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;;
+A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;;
+A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;;
+A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;;
+A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;;
+A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;;
+A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;;
+A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;;
+A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;;
+A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;;
+A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;;
+A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;;
+A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;;
+A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;;
+A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;;
+A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;;
+A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;;
+A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;;
+A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;;
+A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;;
+A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;;
+A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;;
+A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;;
+A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;;
+A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;;
+A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;;
+A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;;
+A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;;
+A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;;
+A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;;
+A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;;
+A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;;
+A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;;
+A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;;
+A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;;
+A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;;
+A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;;
+A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;;
+A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;;
+A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;;
+A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;;
+A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;;
+A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;;
+A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;;
+A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;;
+A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;;
+A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;;
+A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;;
+A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;;
+A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;;
+A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;;
+A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;;
+A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;;
+A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;;
+A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;;
+A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;;
+A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;;
+A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;;
+A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;;
+A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;;
+A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;;
+A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;;
+A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;;
+A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;;
+A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;;
+A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;;
+A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;;
+A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;;
+A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;;
+A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;;
+A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;;
+A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;;
+A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;;
+A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;;
+A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;;
+A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;;
+A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;;
+A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;;
+A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;;
+A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;;
+A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;;
+A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;;
+A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;;
+A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;;
+A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;;
+A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;;
+A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;;
+A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;;
+A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;;
+A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;;
+A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;;
+A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;;
+A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;;
+A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;;
+A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;;
+A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;;
+A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;;
+A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;;
+A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;;
+A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;;
+A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;;
+A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;;
+A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;;
+A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;;
+A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;;
+A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;;
+A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;;
+A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;;
+A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;;
+A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;;
+A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;;
+A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;;
+A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;;
+A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;;
+A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;;
+A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;;
+A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;;
+A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;;
+A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;;
+A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;;
+A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;;
+A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;;
+A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;;
+A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;;
+A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;;
+A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;;
+A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;;
+A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;;
+A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;;
+A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;;
+A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;;
+A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;;
+A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;;
+A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;;
+A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;;
+A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;;
+A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;;
+A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;;
+A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;;
+A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;;
+A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;;
+A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;;
+A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;;
+A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;;
+A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;;
+A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;;
+A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;;
+A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;;
+A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;;
+A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;;
+A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;;
+A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;;
+A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;;
+A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;;
+A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;;
+A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;;
+A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;;
+A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;;
+A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;;
+A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;;
+A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;;
+A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;;
+A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;;
+A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;;
+A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;;
+A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;;
+A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;;
+A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;;
+A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;;
+A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;;
+A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;;
+A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;;
+A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;;
+A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;;
+A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;;
+A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;;
+A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;;
+A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;;
+A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;;
+A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;;
+A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;;
+A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;;
+A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;;
+A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;;
+A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;;
+A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;;
+A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;;
+A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;;
+A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;;
+A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;;
+A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;;
+A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;;
+A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;;
+A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;;
+A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;;
+A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;;
+A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;;
+A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;;
+A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;;
+A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;;
+A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;;
+A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;;
+A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;;
+A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;;
+A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;;
+A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;;
+A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;;
+A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;;
+A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;;
+A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;;
+A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;;
+A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;;
+A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;;
+A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;;
+A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;;
+A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;;
+A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;;
+A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;;
+A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;;
+A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;;
+A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;;
+A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;;
+A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;;
+A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;;
+A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;;
+A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;;
+A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;;
+A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;;
+A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;;
+A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;;
+A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;;
+A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;;
+A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;;
+A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;;
+A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;;
+A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;;
+A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;;
+A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;;
+A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;;
+A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;;
+A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;;
+A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;;
+A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;;
+A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;;
+A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;;
+A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;;
+A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;;
+A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;;
+A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;;
+A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;;
+A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;;
+A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;;
+A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;;
+A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;;
+A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;;
+A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;;
+A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;;
+A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;;
+A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;;
+A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;;
+A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;;
+A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;;
+A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;;
+A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;;
+A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;;
+A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;;
+A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;;
+A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;;
+A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;;
+A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;;
+A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;;
+A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;;
+A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;;
+A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;;
+A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;;
+A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;;
+A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;;
+A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;;
+A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;;
+A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;;
+A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;;
+A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;;
+A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;;
+A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;;
+A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;;
+A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;;
+A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;;
+A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;;
+A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;;
+A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;;
+A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;;
+A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;;
+A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;;
+A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;;
+A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;;
+A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;;
+A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;;
+A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;;
+A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;;
+A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;;
+A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;;
+A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;;
+A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;;
+A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;;
+A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;;
+A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;;
+A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;;
+A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;;
+A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;;
+A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;;
+A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;;
+A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;;
+A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;;
+A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;;
+A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;;
+A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;;
+A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;;
+A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;;
+A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;;
+A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;;
+A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;;
+A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;;
+A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;;
+A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;;
+A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;;
+A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;;
+A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;;
+A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;;
+A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;;
+A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;;
+A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;;
+A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;;
+A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;;
+A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;;
+A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;;
+A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;;
+A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;;
+A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;;
+A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;;
+A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;;
+A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;;
+A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;;
+A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;;
+A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;;
+A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;;
+A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;;
+A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;;
+A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;;
+A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;;
+A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;;
+A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;;
+A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;;
+A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;;
+A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;;
+A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;;
+A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;;
+A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;;
+A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;;
+A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;;
+A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;;
+A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;;
+A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;;
+A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;;
+A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;;
+A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;;
+A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;;
+A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;;
+A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;;
+A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;;
+A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;;
+A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;;
+A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;;
+A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;;
+A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;;
+A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;;
+A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;;
+A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;;
+A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;;
+A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;;
+A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;;
+A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;;
+A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;;
+A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;;
+A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;;
+A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;;
+A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;;
+A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;;
+A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;;
+A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;;
+A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;;
+A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;;
+A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;;
+A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;;
+A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;;
+A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;;
+A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;;
+A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;;
+A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;;
+A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;;
+A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;;
+A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;;
+A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;;
+A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;;
+A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;;
+A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;;
+A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;;
+A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;;
+A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;;
+A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;;
+A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;;
+A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;;
+A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;;
+A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;;
+A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;;
+A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;;
+A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;;
+A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;;
+A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;;
+A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;;
+A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;;
+A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;;
+A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;;
+A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;;
+A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;;
+A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;;
+A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;;
+A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;;
+A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;;
+A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;;
+A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;;
+A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;;
+A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;;
+A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;;
+A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;;
+A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;;
+A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;;
+A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;;
+A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;;
+A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;;
+A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;;
+A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;;
+A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;;
+A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;;
+A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;;
+A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;;
+A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;;
+A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;;
+A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;;
+A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;;
+A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;;
+A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;;
+A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;;
+A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;;
+A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;;
+A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;;
+A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;;
+A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;;
+A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;;
+A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;;
+A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;;
+A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;;
+A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;;
+A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;;
+A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;;
+A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;;
+A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;;
+A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;;
+A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;;
+A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;;
+A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;;
+A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;;
+A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;;
+A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;;
+A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;;
+A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;;
+A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;;
+A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;;
+A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;;
+A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;;
+A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;;
+A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;;
+A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;;
+A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;;
+A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;;
+A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;;
+A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;;
+A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;;
+A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;;
+A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;;
+A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;;
+A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;;
+A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;;
+A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;;
+A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;;
+A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;;
+A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;;
+A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;;
+A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;;
+A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;;
+A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;;
+A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;;
+A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;;
+A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;;
+A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;;
+A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;;
+A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;;
+A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;;
+A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;;
+A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;;
+A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;;
+A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;;
+A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;;
+A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;;
+A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;;
+A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;;
+A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;;
+A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;;
+A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;;
+A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;;
+A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;;
+A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;;
+A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;;
+A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;;
+A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;;
+A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;;
+A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;;
+A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;;
+A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;;
+A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;;
+A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;;
+A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;;
+A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;;
+A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;;
+A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;;
+A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;;
+A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;;
+A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;;
+A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;;
+A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;;
+A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;;
+A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;;
+A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;;
+A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;;
+A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;;
+A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;;
+A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;;
+A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;;
+A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;;
+A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;;
+A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;;
+A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;;
+A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;;
+A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;;
+A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;;
+A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;;
+A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;;
+A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;;
+A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;;
+A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;;
+A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;;
+A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;;
+A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;;
+A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;;
+A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;;
+A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;;
+A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;;
+A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;;
+A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;;
+A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;;
+A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;;
+A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;;
+A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;;
+A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;;
+A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;;
+A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;;
+A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;;
+A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;;
+A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;;
+A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;;
+A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;;
+A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;;
+A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;;
+A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;;
+A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;;
+A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;;
+A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;;
+A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;;
+A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;;
+A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;;
+A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;;
+A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;;
+A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;;
+A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;;
+A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;;
+A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;;
+A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;;
+A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;;
+A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;;
+A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;;
+A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;;
+A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;;
+A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;;
+A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;;
+A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;;
+A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;;
+A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;;
+A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;;
+A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;;
+A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;;
+A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;;
+A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;;
+A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;;
+A491;YI RADICAL LI;So;0;ON;;;;;N;;;;;
+A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;;
+A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;;
+A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;;
+A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;;
+A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;;
+A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;;
+A498;YI RADICAL MI;So;0;ON;;;;;N;;;;;
+A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;;
+A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;;
+A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;;
+A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;;
+A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;;
+A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;;
+A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;;
+A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;;
+A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;;
+A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;;
+A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;;
+A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;;
+A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;;
+A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;;
+A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;;
+A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;;
+A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;;
+A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;;
+A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;;
+A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;;
+A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;;
+A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;;
+A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;;
+A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;;
+A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;;
+A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;;
+A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;;
+A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;;
+A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;;
+A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;;
+A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;;
+A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;;
+A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;;
+A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;;
+A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;;
+A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;;
+A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;;
+A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;;
+A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;;
+A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;;
+A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;;
+A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;;
+A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;;
+A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;;
+A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;;
+A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;;
+A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;;
+A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;;
+A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;;
+A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;;
+A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;;
+A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;;
+A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;;
+A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;;
+A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;;
+A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;;
+A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;;
+A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;;
+A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;;
+A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;;
+A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;;
+A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;;
+A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;;
+A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;;
+A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;;
+A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;;
+A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;;
+A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;;
+A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;;
+A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;;
+A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;;
+A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;;
+A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;;
+A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;;
+A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;;
+A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;;
+A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;;
+A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;;
+A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;;
+A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;;
+A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;;
+A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;;
+A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;;
+A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;;
+A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;;
+A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;;
+A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;;
+A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;;
+A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;;
+A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;;
+A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;;
+A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;;
+A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;;
+A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;;
+A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;;
+A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;;
+A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;;
+A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;;
+A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;;
+A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;;
+A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;;
+A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;;
+A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;;
+A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;;
+A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;;
+A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;;
+A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;;
+A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;;
+A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;;
+A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;;
+A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;;
+A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;;
+A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;;
+A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;;
+A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;;
+A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;;
+A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;;
+A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;;
+A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;;
+A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;;
+A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;;
+A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;;
+A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;;
+A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;;
+A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;;
+A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;;
+A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;;
+A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;;
+A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;;
+A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;;
+A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;;
+A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;;
+A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;;
+A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;;
+A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;;
+A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;;
+A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;;
+A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;;
+A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;;
+A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;;
+A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;;
+A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;;
+A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;;
+A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;;
+A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;;
+A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;;
+A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;;
+A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;;
+A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;;
+A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;;
+A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;;
+A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;;
+A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;;
+A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;;
+A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;;
+A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;;
+A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;;
+A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;;
+A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;;
+A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;;
+A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;;
+A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;;
+A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;;
+A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;;
+A60D;VAI COMMA;Po;0;ON;;;;;N;;;;;
+A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;;
+A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;;
+A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;;
+A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;;
+A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;;
+A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;;
+A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;;
+A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;;
+A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;;
+A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;;
+A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;;
+A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;;
+A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;;
+A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;;
+A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;;
+A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;;
+A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;;
+A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;;
+A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;;
+A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;;
+A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
+A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
+A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643;
+A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642
+A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645;
+A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644
+A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647;
+A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646
+A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649;
+A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648
+A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B;
+A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A
+A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D;
+A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C
+A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
+A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E
+A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651;
+A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650
+A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653;
+A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652
+A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655;
+A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654
+A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657;
+A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656
+A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659;
+A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658
+A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B;
+A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A
+A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D;
+A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C
+A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F;
+A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
+A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663;
+A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662
+A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665;
+A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664
+A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667;
+A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666
+A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669;
+A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668
+A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B;
+A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A
+A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D;
+A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C
+A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;;
+A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;;
+A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;;
+A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;;
+A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;;
+A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;;
+A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;;
+A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681;
+A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680
+A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683;
+A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682
+A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685;
+A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684
+A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687;
+A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686
+A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689;
+A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688
+A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B;
+A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A
+A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D;
+A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C
+A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F;
+A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E
+A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691;
+A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690
+A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693;
+A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692
+A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695;
+A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694
+A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697;
+A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696
+A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;;
+A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;;
+A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;;
+A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;;
+A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;;
+A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;;
+A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;;
+A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;;
+A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;;
+A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;;
+A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;;
+A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;;
+A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;;
+A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;;
+A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;;
+A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;;
+A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723;
+A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722
+A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725;
+A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724
+A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727;
+A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726
+A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729;
+A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728
+A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B;
+A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A
+A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D;
+A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C
+A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F;
+A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E
+A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;;
+A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;;
+A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733;
+A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732
+A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735;
+A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734
+A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737;
+A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736
+A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739;
+A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738
+A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B;
+A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A
+A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D;
+A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C
+A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F;
+A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E
+A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741;
+A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740
+A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743;
+A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742
+A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745;
+A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744
+A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747;
+A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746
+A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749;
+A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748
+A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B;
+A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A
+A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D;
+A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C
+A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F;
+A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E
+A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751;
+A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750
+A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753;
+A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752
+A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755;
+A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754
+A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757;
+A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756
+A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759;
+A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758
+A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B;
+A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A
+A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D;
+A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C
+A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F;
+A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E
+A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761;
+A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760
+A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763;
+A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762
+A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765;
+A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764
+A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767;
+A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766
+A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769;
+A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768
+A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B;
+A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A
+A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D;
+A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C
+A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F;
+A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E
+A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;;
+A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;;
+A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;;
+A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;;
+A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;;
+A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;;
+A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;;
+A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;;
+A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;;
+A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A;
+A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779
+A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C;
+A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B
+A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79;
+A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F;
+A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E
+A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781;
+A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780
+A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783;
+A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782
+A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785;
+A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784
+A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787;
+A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786
+A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;;
+A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;;
+A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;;
+A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C;
+A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B
+A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;;
+A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;;
+A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;;
+A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;;
+A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;;
+A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;;
+A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;;
+A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;;
+A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;;
+A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;;
+A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;;
+A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;;
+A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;;
+A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;;
+A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;;
+A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;;
+A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;;
+A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;;
+A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;;
+A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;;
+A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;;
+A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;;
+A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;;
+A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;;
+A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;;
+A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;;
+A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;;
+A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;;
+A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;;
+A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;;
+A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;;
+A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;;
+A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;;
+A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;;
+A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;;
+A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;;
+A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;;
+A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;;
+A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;;
+A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;;
+A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;;
+A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;;
+A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;;
+A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;;
+A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;;
+A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;;
+A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;;
+A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;;
+A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;;
+A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;;
+A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;;
+A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;;
+A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;;
+A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;;
+A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;;
+A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;;
+A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;;
+A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;;
+A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;;
+A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;;
+A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;;
+A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;;
+A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;;
+A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;;
+A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;;
+A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;;
+A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;;
+A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;;
+A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;;
+A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;;
+A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;;
+A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;;
+A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;;
+A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;;
+A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;;
+A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;;
+A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;;
+A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;;
+A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;;
+A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;;
+A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;;
+A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;;
+A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;;
+A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;;
+A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;;
+A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;;
+A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;;
+A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;;
+A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;;
+A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;;
+A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;;
+A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;;
+A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;;
+A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;;
+A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;;
+A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;;
+A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;;
+A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;;
+A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;;
+A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;;
+A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;;
+A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;;
+A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;;
+A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;;
+A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;;
+A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;;
+A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;;
+A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;;
+A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;;
+A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;;
+A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;;
+A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;;
+A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;;
+A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;;
+A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;;
+A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;;
+A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;;
+A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;;
+A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;;
+A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;;
+A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;;
+A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;;
+A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;;
+A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;;
+A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;;
+A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;;
+A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;;
+A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;;
+A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;;
+A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;;
+A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;;
+A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;;
+A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;;
+A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;;
+A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;;
+A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;;
+A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;;
+A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;;
+A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;;
+A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;;
+A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;;
+A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;;
+A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;;
+A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;;
+A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;;
+A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;;
+A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;;
+A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;;
+A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;;
+A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;;
+A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;;
+A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;;
+A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;;
+A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;;
+A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;;
+A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;;
+A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;;
+A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;;
+A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;;
+A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;;
+A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;;
+A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;;
+A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;;
+A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;;
+A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;;
+A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;;
+A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;;
+A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;;
+A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;;
+A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;;
+A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;;
+A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;;
+A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;;
+A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;;
+A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;;
+A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;;
+A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;;
+A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;;
+A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;;
+A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;;
+A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;;
+A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;;
+A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;;
+A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;;
+A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;;
+A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;;
+A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;;
+A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;;
+A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;;
+AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;;
+AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;;
+AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;;
+AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;;
+AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;;
+AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;;
+AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;;
+AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;;
+AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;;
+AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;;
+AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;;
+AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;;
+AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;;
+AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;;
+AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;;
+AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;;
+AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;;
+AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;;
+AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;;
+AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;;
+AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;;
+AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;;
+AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;;
+AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;;
+AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;;
+AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;;
+AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;;
+AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;;
+AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;;
+AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;;
+AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;;
+AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;;
+AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;;
+AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;;
+AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;;
+AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;;
+AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;;
+AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;;
+AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;;
+AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;;
+AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;;
+AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;;
+AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;;
+AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;;
+AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;;
+AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;;
+AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;;
+AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;;
+AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;;
+AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;;
+AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+E000;<Private Use, First>;Co;0;L;;;;;N;;;;;
+F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;;
+F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;;
+F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;;
+F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;;
+F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;;
+F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;;
+F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;;
+F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;;
+F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;;
+F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;;
+F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;;
+F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;;
+F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;;
+F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;;
+F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;;
+F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;;
+F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;;
+F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;;
+F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;;
+F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;;
+F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;;
+F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;;
+F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;;
+F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;;
+F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;;
+F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;;
+F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;;
+F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;;
+F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;;
+F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;;
+F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;;
+F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;;
+F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;;
+F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;;
+F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;;
+F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;;
+F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;;
+F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;;
+F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;;
+F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;;
+F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;;
+F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;;
+F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;;
+F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;;
+F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;;
+F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;;
+F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;;
+F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;;
+F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;;
+F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;;
+F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;;
+F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;;
+F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;;
+F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;;
+F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;;
+F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;;
+F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;;
+F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;;
+F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;;
+F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;;
+F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;;
+F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;;
+F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;;
+F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;;
+F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;;
+F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;;
+F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;;
+F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;;
+F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;;
+F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;;
+F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;;
+F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;;
+F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;;
+F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;;
+F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;;
+F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;;
+F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;;
+F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;;
+F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;;
+F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;;
+F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;;
+F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;;
+F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;;
+F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;;
+F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;;
+F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;;
+F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;;
+F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;;
+F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;;
+F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;;
+F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;;
+F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;;
+F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;;
+F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;;
+F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;;
+F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;;
+F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;;
+F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;;
+F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;;
+F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;;
+F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;;
+F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;;
+F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;;
+F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;;
+F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;;
+F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;;
+F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;;
+F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;;
+F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;;
+F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;;
+F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;;
+F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;;
+F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;;
+F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;;
+F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;;
+F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;;
+F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;;
+F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;;
+F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;;
+F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;;
+F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;;
+F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;;
+F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;;
+F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;;
+F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;;
+F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;;
+F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;;
+F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;;
+F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;;
+F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;;
+F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;;
+F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;;
+F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;;
+F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;;
+F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;;
+F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;;
+F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;;
+F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;;
+F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;;
+F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;;
+F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;;
+F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;;
+F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;;
+F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;;
+F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;;
+F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;;
+F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;;
+F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;;
+F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;;
+F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;;
+F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;;
+F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;;
+F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;;
+F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;;
+F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;;
+F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;;
+F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;;
+F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;;
+F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;;
+F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;;
+F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;;
+F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;;
+F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;;
+F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;;
+F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;;
+F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;;
+F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;;
+F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;;
+F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;;
+F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;;
+F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;;
+F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;;
+F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;;
+F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;;
+F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;;
+F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;;
+F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;;
+F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;;
+F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;;
+F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;;
+F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;;
+F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;;
+F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;;
+F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;;
+F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;;
+F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;;
+F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;;
+F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;;
+F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;;
+F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;;
+F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;;
+F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;;
+F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;;
+F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;;
+F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;;
+F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;;
+F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;;
+F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;;
+F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;;
+F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;;
+F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;;
+F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;;
+F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;;
+F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;;
+F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;;
+F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;;
+F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;;
+F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;;
+F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;;
+F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;;
+F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;;
+F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;;
+F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;;
+F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;;
+F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;;
+F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;;
+F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;;
+F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;;
+F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;;
+F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;;
+F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;;
+F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;;
+F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;;
+F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;;
+F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;;
+F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;;
+F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;;
+F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;;
+F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;;
+F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;;
+F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;;
+F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;;
+F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;;
+F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;;
+F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;;
+F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;;
+F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;;
+F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;;
+F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;;
+F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;;
+F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;;
+F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;;
+F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;;
+F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;;
+F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;;
+F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;;
+F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;;
+F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;;
+F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;;
+F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;;
+F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;;
+F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;;
+F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;;
+F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;;
+F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;;
+F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;;
+F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;;
+FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;;
+FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;;
+FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;;
+FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;;
+FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;;
+FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;;
+FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;;
+FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;;
+FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;;
+FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;;
+FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;;
+FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;;
+FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;;
+FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;;
+FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;;
+FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;;
+FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;;
+FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;;
+FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;;
+FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;;
+FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;;
+FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;;
+FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;;
+FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;;
+FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;;
+FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;;
+FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;;
+FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;;
+FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;;
+FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;;
+FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;;
+FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;;
+FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;;
+FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;;
+FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;;
+FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;;
+FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;;
+FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;;
+FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;;
+FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;;
+FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;;
+FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;;
+FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;;
+FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;;
+FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;;
+FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;;
+FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;;
+FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;;
+FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;;
+FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;;
+FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;;
+FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;;
+FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;;
+FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;;
+FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;;
+FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;;
+FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;;
+FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;;
+FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;;
+FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;;
+FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;;
+FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;;
+FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;;
+FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;;
+FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;;
+FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;;
+FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;;
+FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;;
+FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;;
+FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;;
+FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;;
+FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;;
+FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;;
+FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;;
+FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;;
+FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;;
+FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;;
+FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;;
+FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;;
+FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;;
+FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;;
+FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;;
+FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;;
+FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;;
+FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;;
+FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;;
+FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;;
+FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;;
+FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;;
+FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;;
+FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;;
+FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;;
+FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;;
+FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;;
+FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;;
+FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;;
+FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;;
+FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;;
+FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;;
+FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;;
+FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;;
+FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;;
+FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;;
+FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;;
+FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;;
+FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;;
+FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;;
+FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;;
+FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;;
+FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;;
+FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;;
+FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;;
+FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;;
+FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;;
+FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;;
+FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;;
+FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;;
+FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;;
+FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;;
+FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;;
+FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;;
+FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;;
+FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;;
+FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;;
+FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;;
+FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;;
+FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;;
+FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;;
+FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;;
+FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;;
+FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;;
+FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;;
+FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;;
+FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;;
+FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;;
+FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;;
+FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;;
+FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;;
+FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;;
+FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;;
+FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;;
+FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;;
+FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;;
+FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;;
+FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;;
+FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;;
+FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;;
+FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;;
+FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;;
+FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;;
+FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;;
+FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;;
+FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;;
+FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;;
+FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;;
+FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;;
+FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;;
+FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;;
+FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;;
+FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;;
+FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;;
+FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;;
+FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;;
+FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;;
+FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;;
+FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;;
+FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;;
+FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;;
+FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;;
+FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;;
+FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;;
+FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;;
+FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;;
+FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;;
+FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;;
+FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;;
+FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;;
+FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;;
+FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;;
+FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;;
+FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;;
+FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;;
+FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;;
+FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;;
+FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;;
+FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;;
+FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;;
+FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;;
+FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;;
+FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;;
+FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;;
+FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;;
+FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;;
+FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;;
+FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;;
+FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;;
+FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;;
+FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;;
+FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;;
+FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;;
+FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;;
+FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;;
+FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;;
+FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;;
+FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;;
+FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;;
+FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;;
+FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;;
+FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;;
+FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;;
+FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;;
+FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;;
+FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;;
+FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;;
+FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;;
+FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;;
+FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;;
+FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;;
+FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;;
+FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;;
+FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;;
+FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;;
+FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;;
+FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;;
+FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;;
+FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;;
+FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;;
+FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;;
+FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;;
+FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;;
+FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;;
+FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;;
+FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;;
+FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;;
+FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;;
+FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;;
+FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;;
+FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;;
+FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;;
+FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;;
+FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;;
+FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;;
+FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;;
+FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;;
+FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;;
+FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;;
+FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;;
+FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;;
+FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;;
+FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;;
+FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;;
+FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;;
+FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;;
+FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;;
+FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;;
+FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;;
+FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;;
+FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;;
+FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;;
+FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;;
+FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;;
+FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;;
+FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;;
+FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;;
+FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;;
+FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;;
+FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;;
+FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;;
+FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;;
+FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;;
+FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;;
+FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;;
+FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;;
+FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;;
+FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;;
+FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;;
+FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;;
+FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;;
+FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;;
+FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;;
+FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;;
+FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;;
+FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;;
+FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;;
+FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;;
+FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;;
+FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;;
+FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;;
+FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;;
+FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;;
+FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;;
+FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;;
+FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;;
+FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;;
+FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;;
+FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;;
+FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;;
+FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;;
+FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;;
+FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;;
+FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;;
+FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;;
+FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;;
+FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;;
+FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;;
+FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;;
+FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;;
+FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;;
+FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;;
+FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;;
+FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;;
+FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;;
+FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;;
+FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;;
+FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;;
+FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;;
+FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;;
+FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;;
+FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;;
+FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;;
+FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;;
+FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;;
+FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;;
+FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;;
+FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;;
+FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;;
+FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;;
+FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;;
+FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;;
+FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;;
+FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;;
+FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;;
+FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;;
+FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;;
+FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;;
+FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;;
+FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;;
+FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;;
+FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;;
+FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;;
+FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;;
+FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;;
+FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;;
+FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;;
+FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;;
+FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;;
+FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;;
+FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;;
+FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;;
+FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;;
+FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;;
+FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;;
+FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;;
+FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;;
+FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;;
+FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;;
+FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;;
+FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;;
+FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;;
+FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;;
+FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;;
+FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;;
+FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;;
+FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;;
+FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;;
+FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;;
+FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;;
+FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;;
+FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;;
+FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;;
+FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;;
+FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;;
+FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;;
+FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;;
+FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;;
+FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;;
+FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;;
+FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;;
+FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;;
+FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;;
+FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;;
+FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;;
+FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;;
+FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;;
+FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;;
+FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;;
+FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;;
+FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;;
+FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;;
+FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;;
+FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;;
+FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;;
+FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;;
+FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;;
+FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;;
+FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;;
+FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;;
+FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;;
+FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;;
+FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;;
+FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;;
+FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;;
+FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;;
+FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;;
+FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;;
+FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;;
+FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;;
+FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;;
+FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;;
+FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;;
+FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;;
+FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;;
+FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;;
+FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;;
+FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;;
+FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;;
+FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;;
+FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;;
+FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;;
+FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;;
+FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;;
+FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;;
+FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;;
+FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;;
+FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;;
+FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;;
+FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;;
+FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;;
+FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;;
+FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;;
+FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;;
+FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;;
+FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;;
+FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;;
+FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;;
+FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;;
+FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;;
+FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;;
+FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;;
+FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;;
+FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;;
+FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;;
+FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;;
+FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;;
+FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;;
+FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;;
+FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;;
+FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;;
+FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;;
+FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;;
+FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;;
+FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;;
+FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;;
+FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;;
+FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;;
+FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;;
+FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;;
+FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;;
+FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;;
+FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;;
+FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;;
+FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;;
+FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;;
+FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;;
+FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;;
+FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;;
+FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;;
+FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;;
+FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;;
+FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;;
+FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;;
+FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;;
+FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;;
+FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;;
+FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;;
+FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;;
+FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;;
+FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;;
+FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;;
+FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;;
+FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;;
+FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;;
+FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;;
+FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;;
+FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;;
+FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;;
+FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;;
+FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;;
+FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;;
+FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;;
+FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;;
+FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;;
+FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;;
+FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;;
+FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;;
+FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;;
+FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;;
+FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;;
+FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;;
+FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;;
+FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;;
+FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;;
+FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;;
+FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;;
+FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;;
+FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;;
+FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;;
+FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;;
+FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;;
+FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;;
+FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;;
+FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;;
+FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;;
+FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;;
+FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;;
+FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;;
+FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;;
+FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;;
+FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;;
+FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;;
+FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;;
+FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;;
+FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;;
+FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;;
+FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;;
+FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;;
+FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;;
+FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;;
+FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;;
+FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;;
+FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;;
+FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;;
+FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;;
+FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;;
+FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;;
+FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;;
+FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;;
+FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;;
+FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;;
+FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;;
+FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;;
+FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;;
+FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;;
+FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;;
+FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;;
+FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;;
+FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;;
+FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;;
+FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;;
+FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;;
+FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;;
+FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;;
+FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;;
+FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;;
+FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;;
+FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;;
+FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;;
+FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;;
+FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;;
+FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;;
+FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;;
+FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;;
+FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;;
+FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;;
+FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;;
+FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;;
+FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;;
+FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;;
+FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;;
+FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;;
+FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;;
+FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;;
+FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;;
+FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;;
+FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;;
+FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;;
+FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;;
+FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;;
+FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;;
+FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;;
+FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;;
+FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;;
+FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;;
+FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;;
+FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;;
+FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;;
+FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;;
+FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;;
+FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;;
+FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;;
+FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;;
+FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;;
+FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;;
+FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;;
+FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;;
+FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;;
+FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;;
+FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;;
+FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;;
+FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;;
+FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;;
+FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;;
+FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;;
+FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;;
+FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;;
+FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;;
+FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;;
+FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;;
+FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;;
+FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;;
+FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;;
+FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;;
+FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;;
+FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;;
+FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;;
+FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;;
+FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;;
+FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;;
+FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;;
+FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;;
+FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;;
+FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;;
+FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;;
+FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;;
+FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;;
+FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;;
+FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;;
+FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;;
+FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;;
+FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;;
+FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;;
+FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;;
+FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;;
+FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;;
+FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;;
+FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;;
+FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;;
+FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;;
+FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;;
+FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;;
+FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;;
+FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;;
+FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;;
+FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;;
+FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;;
+FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;;
+FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;;
+FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;;
+FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;;
+FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;;
+FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;;
+FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;;
+FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;;
+FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;;
+FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;;
+FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;;
+FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;;
+FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;;
+FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;;
+FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;;
+FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;;
+FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;;
+FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;;
+FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;;
+FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;;
+FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;;
+FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;;
+FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;;
+FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;;
+FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;;
+FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;;
+FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;;
+FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;;
+FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;;
+FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;;
+FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;;
+FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;;
+FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;;
+FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;;
+FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;;
+FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;;
+FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;;
+FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;;
+FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;;
+FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;;
+FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;;
+FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;;
+FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;;
+FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;;
+FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;;
+FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;;
+FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;;
+FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;;
+FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;;
+FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;;
+FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;;
+FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;;
+FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;;
+FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;;
+FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;;
+FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;;
+FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;;
+FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;;
+FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;;
+FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;;
+FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;;
+FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;;
+FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;;
+FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;;
+FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;;
+FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;;
+FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;;
+FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;;
+FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;;
+FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;;
+FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;;
+FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;;
+FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;;
+FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;;
+FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;;
+FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;;
+FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;;
+FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;;
+FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;;
+FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;;
+FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;;
+FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;;
+FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;;
+FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;;
+FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;;
+FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;;
+FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;;
+FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;;
+FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;;
+FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;;
+FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;;
+FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;;
+FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;;
+FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;;
+FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;;
+FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;;
+FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;;
+FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;;
+FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;;
+FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;;
+FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;;
+FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;;
+FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;;
+FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;;
+FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;;
+FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;;
+FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;;
+FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;;
+FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;;
+FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;;
+FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;;
+FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;;
+FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;;
+FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;;
+FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;;
+FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;;
+FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;;
+FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;;
+FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;;
+FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;;
+FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;;
+FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;;
+FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;;
+FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;;
+FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;;
+FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;;
+FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;;
+FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;;
+FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;;
+FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;;
+FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;;
+FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;;
+FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;;
+FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;;
+FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;;
+FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;;
+FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;;
+FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;;
+FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;;
+FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;;
+FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;;
+FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;;
+FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;;
+FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;;
+FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;;
+FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;;
+FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;;
+FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;;
+FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;;
+FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;;
+FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;;
+FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;;
+FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;;
+FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;;
+FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;;
+FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;;
+FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;;
+FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;;
+FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;;
+FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;;
+FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;;
+FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;;
+FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;;
+FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;;
+FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;;
+FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;;
+FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;;
+FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;;
+FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;;
+FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;;
+FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;;
+FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;;
+FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;;
+FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;;
+FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;;
+FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;;
+FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;;
+FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;;
+FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;;
+FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;;
+FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;;
+FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;;
+FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;;
+FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;;
+FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;;
+FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;;
+FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;;
+FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;;
+FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;;
+FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;;
+FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;;
+FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;;
+FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;;
+FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;;
+FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;;
+FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;;
+FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;;
+FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;;
+FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;;
+FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;;
+FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;;
+FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;;
+FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;;
+FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;;
+FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;;
+FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;;
+FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;;
+FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;;
+FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;;
+FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;;
+FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;;
+FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;;
+FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
+FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;;
+FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;;
+FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;;
+FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;;
+FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;;
+FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;;
+FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;;
+FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;;
+FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;;
+FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;;
+FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;;
+FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;;
+FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;;
+FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;;
+FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;;
+FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;;
+FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;;
+FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;;
+FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;;
+FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;;
+FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;;
+FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;;
+FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;;
+FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;;
+FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;;
+FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;;
+FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;;
+FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;;
+FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;;
+FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;;
+FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;;
+FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;;
+FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;;
+FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;;
+FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;;
+FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;;
+FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;;
+FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;;
+FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;;
+FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;;
+FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;;
+FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;;
+FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;;
+FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;;
+FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;;
+FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;;
+FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;;
+FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;;
+FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;;
+FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;;
+FE45;SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;;
+FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;;
+FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;;
+FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;;
+FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;;
+FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;;
+FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;;
+FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;;
+FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;;
+FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;;
+FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;;
+FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;;
+FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;;
+FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;;
+FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;;
+FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;;
+FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;;
+FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
+FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;;
+FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;;
+FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;;
+FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;;
+FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;;
+FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;;
+FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;;
+FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;;
+FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;;
+FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;;
+FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;;
+FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;;
+FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;;
+FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;;
+FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;;
+FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;;
+FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;;
+FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;;
+FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;;
+FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;;
+FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;;
+FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;;
+FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;;
+FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;;
+FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;;
+FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;;
+FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;;
+FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;;
+FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;;
+FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;;
+FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;;
+FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;;
+FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;;
+FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;;
+FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;;
+FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;;
+FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;;
+FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;;
+FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;;
+FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;;
+FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;;
+FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;;
+FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;;
+FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;;
+FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;;
+FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;;
+FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;;
+FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;;
+FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;;
+FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;;
+FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;;
+FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;;
+FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;;
+FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;;
+FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;;
+FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;;
+FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;;
+FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;;
+FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;;
+FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;;
+FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;;
+FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;;
+FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;;
+FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;;
+FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;;
+FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;;
+FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;;
+FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;;
+FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;;
+FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;;
+FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;;
+FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;;
+FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;;
+FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;;
+FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;;
+FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;;
+FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;;
+FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;;
+FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;;
+FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;;
+FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;;
+FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;;
+FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;;
+FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;;
+FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;;
+FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;;
+FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;;
+FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;;
+FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;;
+FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;;
+FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;;
+FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;;
+FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;;
+FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;;
+FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;;
+FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;;
+FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;;
+FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;;
+FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;;
+FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;;
+FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;;
+FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;;
+FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;;
+FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;;
+FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;;
+FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;;
+FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;;
+FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;;
+FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;;
+FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;;
+FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;;
+FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;;
+FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;;
+FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;;
+FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;;
+FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;;
+FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;;
+FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;;
+FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;;
+FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;;
+FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;;
+FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;;
+FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;;
+FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;;
+FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;;
+FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;;
+FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;;
+FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;;
+FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;;
+FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;;
+FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;;
+FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;;
+FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;;
+FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;;
+FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;;
+FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;;
+FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;;
+FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;;
+FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;;
+FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;;
+FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;;
+FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;;
+FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;;
+FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
+FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;;
+FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;;
+FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;;
+FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;;
+FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;;
+FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;;
+FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;;
+FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;;
+FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;;
+FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;;
+FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;;
+FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
+FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;;
+FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;;
+FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;;
+FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;;
+FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;;
+FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;;
+FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;;
+FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;;
+FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;;
+FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;;
+FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;;
+FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;;
+FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;;
+FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;;
+FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;;
+FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;;
+FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;;
+FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41;
+FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42;
+FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43;
+FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44;
+FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45;
+FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46;
+FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47;
+FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48;
+FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49;
+FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A;
+FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B;
+FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C;
+FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D;
+FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E;
+FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F;
+FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50;
+FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51;
+FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52;
+FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53;
+FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54;
+FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55;
+FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56;
+FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57;
+FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58;
+FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59;
+FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A;
+FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;;
+FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;;
+FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;;
+FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;;
+FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;;
+FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;;
+FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21
+FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22
+FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23
+FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24
+FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25
+FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26
+FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27
+FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28
+FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29
+FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A
+FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B
+FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C
+FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D
+FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E
+FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F
+FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30
+FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31
+FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32
+FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33
+FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34
+FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35
+FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36
+FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37
+FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38
+FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39
+FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A
+FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;;
+FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;;
+FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;;
+FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;;
+FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;*;;;
+FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;*;;;
+FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;;
+FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;;
+FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;;
+FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;;
+FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;;
+FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;;
+FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;;
+FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;;
+FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;;
+FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;;
+FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;;
+FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;;
+FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;;
+FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;;
+FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;;
+FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;;
+FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;;
+FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;;
+FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;;
+FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;;
+FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;;
+FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;;
+FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;;
+FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;;
+FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;;
+FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;;
+FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;;
+FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;;
+FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;;
+FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;;
+FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;;
+FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;;
+FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;;
+FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;;
+FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;;
+FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;;
+FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;;
+FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;;
+FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;;
+FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;;
+FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;;
+FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;;
+FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;;
+FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;;
+FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;;
+FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;;
+FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;;
+FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;;
+FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;;
+FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;;
+FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;;
+FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;;
+FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;;
+FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;;
+FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;;
+FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;;
+FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;;
+FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;;
+FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;;
+FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;;
+FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;;
+FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;;
+FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;;
+FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;;
+FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;;
+FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
+FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;;
+FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;;
+FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;;
+FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;;
+FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;;
+FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;;
+FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;;
+FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;;
+FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;;
+FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;;
+FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;;
+FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;;
+FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;;
+FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;;
+FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;;
+FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;;
+FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;;
+FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;;
+FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;;
+FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;;
+FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;;
+FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;;
+FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;;
+FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;;
+FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;;
+FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;;
+FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;;
+FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;;
+FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;;
+FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;;
+FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;;
+FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;;
+FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;;
+FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;;
+FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;;
+FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;;
+FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;;
+FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;;
+FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;;
+FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;;
+FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;;
+FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;;
+FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;;
+FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;;
+FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;;
+FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;;
+FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;;
+FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
+FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;;
+FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;;
+FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;;
+FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;;
+FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;;
+FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;;
+FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;;
+FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;;
+FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;;
+FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;;
+FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;;
+FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;;
+FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;;
+FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;;
+FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;;
+FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;;
+10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;;
+10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;;
+10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;;
+10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;;
+10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;;
+10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;;
+10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;;
+10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;;
+10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;;
+1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;;
+1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;;
+1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;;
+1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;;
+1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;;
+10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;;
+10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;;
+10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;;
+10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;;
+10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;;
+10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;;
+10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;;
+10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;;
+10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;;
+10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;;
+1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;;
+1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;;
+1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;;
+1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;;
+1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;;
+1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;;
+10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;;
+10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;;
+10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;;
+10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;;
+10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;;
+10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;;
+10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;;
+10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;;
+10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;;
+1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;;
+1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;;
+1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;;
+1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;;
+1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;;
+1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;;
+10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;;
+10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;;
+10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;;
+10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;;
+10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;;
+10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;;
+10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;;
+10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;;
+10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;;
+10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;;
+1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;;
+1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;;
+1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;;
+1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;;
+10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;;
+10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;;
+10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;;
+10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;;
+10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;;
+10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;;
+10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;;
+10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;;
+10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;;
+10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;;
+1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;;
+1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;;
+1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;;
+1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;;
+10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;;
+10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;;
+10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;;
+10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;;
+10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;;
+10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;;
+10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;;
+10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;;
+10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;;
+10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;;
+1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;;
+1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;;
+1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;;
+1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;;
+10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;;
+10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;;
+10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;;
+10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;;
+10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;;
+10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;;
+10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;;
+10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;;
+10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;;
+10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;;
+1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;;
+1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;;
+1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;;
+1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;;
+1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;;
+1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;;
+10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;;
+10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;;
+10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;;
+10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;;
+10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;;
+10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;;
+10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;;
+10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;;
+10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;;
+10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;;
+1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;;
+1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;;
+1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;;
+1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;;
+1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;;
+1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;;
+100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;;
+100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;;
+100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;;
+100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;;
+100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;;
+100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;;
+100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;;
+100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;;
+100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;;
+100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;;
+100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;;
+100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;;
+100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;;
+100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;;
+100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;;
+100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;;
+100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;;
+100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;;
+100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;;
+100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;;
+100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;;
+100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;;
+100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;;
+100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;;
+100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;;
+100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;;
+100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;;
+100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;;
+100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;;
+100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;;
+100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;;
+100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;;
+100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;;
+100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;;
+100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;;
+100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;;
+100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;;
+100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;;
+100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;;
+100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;;
+100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;;
+100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;pug;;;
+100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;;
+100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;gup;;;
+100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;;
+100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;;
+100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;;
+100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;;
+100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;;
+100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;;
+100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;;
+100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;;
+100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;;
+100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;;
+100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;;
+100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;;
+100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;;
+100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;;
+100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;;
+100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;;
+100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;;
+100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;;
+100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;;
+100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;;
+100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;;
+100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;;
+100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;;
+100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;;
+100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;;
+100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;;
+100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;;
+100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;;
+100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;;
+100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;;
+100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;;
+100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;;
+100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;;
+100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;;
+100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;;
+100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;;
+100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;;
+100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;;
+100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;;
+100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;;
+100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;;
+100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;;
+100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;;
+100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;;
+100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;;
+100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;;
+100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;;
+10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;;
+10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;;
+10102;AEGEAN CHECK MARK;So;0;L;;;;;N;;;;;
+10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;;
+10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;;
+10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;;
+1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;;
+1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;;
+1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;;
+1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;;
+1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;;
+1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;;
+10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;;
+10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;;
+10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;;
+10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;;
+1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;;
+1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;;
+1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;;
+1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;;
+1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;;
+10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;;
+10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;;
+10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;;
+10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;;
+10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;;
+10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;;
+10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;;
+10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;;
+10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;;
+1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;;
+1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;;
+1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;;
+1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;;
+1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;;
+10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;;
+10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;;
+10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;;
+10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;;
+10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;;
+10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;;
+1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;;
+10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;;
+10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;;
+10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;;
+10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;;
+10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;;
+10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;;
+10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;;
+1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;;
+1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;;
+1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;;
+1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;;
+1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;;
+1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;;
+10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;;
+10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;;
+10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;;
+10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;;
+10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;;
+10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;;
+10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;;
+10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;;
+10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;;
+10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;;
+10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;;
+10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;;
+10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;;
+10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;;
+1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;;
+1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;;
+10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;;
+10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;;
+10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;;
+10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;;
+10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;;
+10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;;
+10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;;
+1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;;
+1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;;
+1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;;
+1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;;
+10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;;
+10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;;
+10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;;
+10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;;
+10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;;
+10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;;
+10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;;
+10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;;
+1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;;
+10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;;
+10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;;
+10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;;
+10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;;
+10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;;
+10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;;
+10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;;
+10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;;
+1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;;
+1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;;
+101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;;
+101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;;
+101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;;
+101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;;
+101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;;
+101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;;
+101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;;
+101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;;
+101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;;
+101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;;
+101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;;
+101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;;
+101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;;
+101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;;
+101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;;
+101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;;
+101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;;
+101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;;
+101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;;
+101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;;
+101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;;
+101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;;
+101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;;
+101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;;
+101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;;
+101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;;
+101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;;
+101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;;
+101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;;
+101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;;
+101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;;
+101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;;
+101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;;
+101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;;
+101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;;
+101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;;
+101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;;
+101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;;
+101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;;
+101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;;
+101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;;
+101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;;
+101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;;
+101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;;
+101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;;
+101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;;
+10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;;
+10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;;
+10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;;
+10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;;
+10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;;
+10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;;
+10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;;
+10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;;
+10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;;
+10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;;
+1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;;
+1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;;
+1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;;
+1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;;
+1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;;
+10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;;
+10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;;
+10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;;
+10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;;
+10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;;
+10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;;
+10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;;
+10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;;
+1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;;
+1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;;
+1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;;
+102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;;
+102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;;
+102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;;
+102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;;
+102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;;
+102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;;
+102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;;
+102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;;
+102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;;
+102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;;
+102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;;
+102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;;
+102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;;
+102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;;
+102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;;
+102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;;
+102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;;
+102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;;
+102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;;
+102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;;
+102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;;
+102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;;
+102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;;
+102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;;
+102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;;
+102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;;
+102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;;
+102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;;
+102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;;
+102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;;
+102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;;
+102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;;
+102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;;
+102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;;
+102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;;
+102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;;
+102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;;
+102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;;
+102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;;
+102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;;
+102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;;
+102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;;
+102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;;
+102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;;
+10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;;
+10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;;
+10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;;
+10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;;
+10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;;
+10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;;
+10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;;
+10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;;
+10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;;
+10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;;
+1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;;
+1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;;
+1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;;
+1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;;
+1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;;
+1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;Faliscan;;;
+10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;;
+10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;;
+10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;;
+10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;;
+10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;;
+10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;;
+10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;;
+10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;Faliscan;;;
+10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;;
+10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;;
+1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;;
+1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;Umbrian;;;
+1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;Umbrian;;;
+1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;Oscan;;;
+1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;Oscan;;;
+10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;;
+10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;;
+10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;;
+10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;;
+10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;;
+10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;;
+10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;;
+10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;;
+10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;;
+10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;;
+10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;;
+10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;;
+10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;;
+1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;;
+1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;;
+1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;;
+1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;;
+1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;;
+1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;;
+10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;;
+10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;;
+10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;;
+10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;;
+10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;;
+10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;;
+10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;;
+10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;;
+10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;;
+10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;;
+1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;;
+10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;;
+10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;;
+10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;;
+10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;;
+10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;;
+10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;;
+10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;;
+10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;;
+10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;;
+10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;;
+1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;;
+1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;;
+1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;;
+1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;;
+1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;;
+1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;;
+10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;;
+10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;;
+10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;;
+10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;;
+10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;;
+10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;;
+10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;;
+10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;;
+10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;;
+10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;;
+1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;;
+1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;;
+1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;;
+1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;;
+1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;;
+103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;;
+103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;;
+103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;;
+103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;;
+103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;;
+103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;;
+103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;;
+103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;;
+103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;;
+103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;;
+103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;;
+103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;;
+103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;;
+103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;;
+103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;;
+103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;;
+103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;;
+103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;;
+103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;;
+103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;;
+103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;;
+103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;;
+103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;;
+103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;;
+103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;;
+103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;;
+103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;;
+103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;;
+103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;;
+103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;;
+103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;;
+103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;;
+103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;;
+103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;;
+103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;;
+103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;;
+103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;;
+103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;;
+103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;;
+103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;;
+103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;;
+103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;;
+103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;;
+103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;;
+103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;;
+103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;;
+103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;;
+103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;;
+10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
+10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429;
+10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A;
+10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B;
+10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C;
+10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D;
+10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E;
+10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F;
+10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430;
+10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431;
+1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432;
+1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433;
+1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434;
+1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435;
+1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436;
+1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437;
+10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438;
+10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439;
+10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A;
+10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B;
+10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C;
+10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D;
+10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E;
+10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F;
+10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440;
+10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441;
+1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442;
+1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443;
+1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444;
+1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445;
+1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446;
+1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447;
+10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448;
+10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449;
+10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A;
+10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B;
+10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C;
+10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D;
+10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E;
+10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
+10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
+10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401
+1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402
+1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403
+1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404
+1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405
+1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406
+1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407
+10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408
+10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409
+10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A
+10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B
+10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C
+10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D
+10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E
+10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F
+10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410
+10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411
+1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412
+1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413
+1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414
+1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415
+1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416
+1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417
+10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418
+10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419
+10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A
+10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B
+10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C
+10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D
+10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E
+10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F
+10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420
+10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421
+1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422
+1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423
+1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424
+1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425
+1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426
+1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
+10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
+10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;;
+10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;;
+10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;;
+10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;;
+10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;;
+10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;;
+10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;;
+10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;;
+10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;;
+1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;;
+1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;;
+1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;;
+1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;;
+1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;;
+1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;;
+10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;;
+10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;;
+10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;;
+10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;;
+10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;;
+10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;;
+10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;;
+10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;;
+10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;;
+10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;;
+1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;;
+1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;;
+1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;;
+1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;;
+1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;;
+1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;;
+10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;;
+10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;;
+10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;;
+10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;;
+10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;;
+10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;;
+10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;;
+10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;;
+10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;;
+10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;;
+1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;;
+1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;;
+1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;;
+1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;;
+1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;;
+1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;;
+10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;;
+10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;;
+10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;;
+10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;;
+10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;;
+10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;;
+10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;;
+10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;;
+10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;;
+1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;;
+1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;;
+1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;;
+1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;;
+1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;;
+10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;;
+10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;;
+10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;;
+10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;;
+10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;;
+10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;;
+10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;;
+10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;;
+10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;;
+10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;;
+1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;;
+1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;;
+1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;;
+1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;;
+104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;;
+10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;;
+10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;;
+10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;;
+10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;;
+10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;;
+10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;;
+1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;;
+1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;;
+1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;;
+1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;;
+1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;;
+1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;;
+10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;;
+10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;;
+10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;;
+10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;;
+10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;;
+10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;;
+10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;;
+10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;;
+10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;;
+10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;;
+1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;;
+1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;;
+1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;;
+1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;;
+1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;;
+1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;;
+10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;;
+10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;;
+10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;;
+10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;;
+10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;;
+10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;;
+10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;;
+10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;;
+10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;;
+10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;;
+1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;;
+1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;;
+1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;;
+1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;;
+1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;;
+1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;;
+10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;;
+10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;;
+10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;;
+10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;;
+10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;;
+10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;;
+10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;;
+10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;;
+1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;;
+1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;;
+10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;;
+10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;;
+10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;;
+10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;;
+10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;;
+10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;;
+10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;;
+10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;;
+10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;;
+1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;;
+1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;;
+1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;;
+1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;;
+10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;;
+10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;;
+10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;;
+10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;;
+10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;;
+10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;;
+10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;;
+10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;;
+10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;;
+10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;;
+10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;;
+10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;;
+10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;;
+10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;;
+10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;;
+1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;;
+1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;;
+1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;;
+1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;;
+1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;;
+1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;;
+10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;;
+10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;;
+10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;;
+10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;;
+10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;;
+10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;;
+10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;;
+10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;;
+10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;;
+10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;;
+1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;;
+10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;;
+10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;;
+10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;;
+10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;;
+10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;;
+10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;;
+10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;;
+10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;;
+10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;;
+10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;;
+10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;;
+10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;;
+10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;;
+10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;;
+10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;;
+10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;;
+10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;;
+10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;;
+10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;;
+10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;;
+10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;;
+10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;;
+10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;;
+10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;;
+10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;;
+10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;;
+10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;;
+10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;;
+10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;;
+10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;;
+10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;;
+10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;;
+10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;;
+10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
+10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
+10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
+10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
+10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;;
+10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;;
+10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;;
+10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;;
+10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
+10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
+10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
+10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;;
+10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;;
+10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;;
+10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;;
+10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;;
+10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;;
+12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
+12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
+12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
+12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;;
+12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;;
+12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;;
+12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;;
+12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;;
+1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;;
+1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;;
+1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;;
+12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;;
+12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;;
+12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;;
+12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;;
+12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;;
+1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;;
+1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;;
+1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;;
+12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;;
+12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;;
+12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;;
+12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;;
+12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;;
+12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;;
+12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;;
+12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;;
+12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;;
+1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;;
+1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;;
+1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;;
+1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;;
+1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;;
+12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;;
+12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;;
+12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;;
+12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;;
+12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;;
+12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;;
+12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;;
+12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;;
+12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;;
+1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;;
+1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;;
+1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;;
+12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;;
+12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;;
+12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;;
+12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;;
+12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;;
+12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;;
+12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;;
+12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;;
+12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;;
+12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;;
+1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;;
+1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;;
+1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;;
+1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;;
+1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;;
+12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;;
+12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;;
+12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;;
+12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;;
+12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;;
+12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;;
+12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;;
+12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;;
+12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;;
+12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;;
+1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;;
+1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;;
+1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;;
+1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;;
+12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;;
+12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;;
+12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;;
+12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;;
+12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;;
+12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;;
+12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;;
+12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;;
+12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;;
+1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;;
+1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;;
+1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;;
+1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;;
+1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;;
+12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;;
+12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;;
+12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;;
+12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;;
+12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;;
+12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;;
+12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;;
+12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;;
+12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;;
+1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;;
+1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;;
+1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;;
+1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;;
+1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;;
+1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;;
+12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;;
+12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;;
+12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;;
+12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;;
+12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;;
+12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;;
+12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;;
+1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;;
+1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;;
+1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;;
+1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;;
+1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;;
+12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;;
+12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;;
+12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;;
+12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;;
+12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;;
+12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;;
+12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;;
+1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;;
+1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;;
+1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;;
+1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;;
+1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;;
+120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;;
+120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;;
+120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;;
+120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;;
+120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;;
+120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;;
+120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;;
+120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;;
+120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;;
+120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;;
+120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;;
+120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;;
+120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;;
+120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;;
+120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;;
+120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;;
+120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;;
+120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;;
+120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;;
+120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;;
+120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;;
+120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;;
+120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;;
+120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;;
+120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;;
+120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;;
+120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;;
+120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;;
+120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;;
+120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;;
+120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;;
+120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;;
+120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;;
+120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;;
+120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;;
+120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;;
+120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;;
+120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;;
+120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;;
+120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;;
+120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;;
+120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;;
+120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;;
+120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;;
+120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;;
+120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;;
+120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;;
+120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;;
+120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;;
+120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;;
+120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;;
+120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;;
+120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;;
+120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;;
+120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;;
+120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;;
+120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;;
+120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;;
+120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;;
+120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;;
+120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;;
+120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;;
+120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;;
+120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;;
+12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;;
+12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;;
+12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;;
+12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;;
+12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;;
+12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;;
+12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;;
+12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;;
+12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;;
+12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;;
+1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;;
+1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;;
+1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;;
+12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;;
+12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;;
+12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;;
+12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;;
+12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;;
+12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;;
+12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;;
+12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;;
+1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;;
+1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;;
+1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;;
+12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;;
+12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;;
+12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;;
+12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;;
+12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;;
+12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;;
+12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;;
+12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;;
+1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;;
+1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;;
+1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;;
+1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;;
+1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;;
+1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;;
+12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;;
+12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;;
+12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;;
+12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;;
+12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;;
+12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;;
+12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;;
+1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;;
+1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;;
+1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;;
+12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;;
+12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;;
+12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;;
+12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;;
+12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;;
+12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;;
+12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;;
+12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;;
+12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;;
+12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;;
+1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;;
+1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;;
+1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;;
+1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;;
+1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;;
+12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;;
+12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;;
+12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;;
+12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;;
+12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;;
+12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;;
+12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;;
+12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;;
+12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;;
+1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;;
+1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;;
+1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;;
+1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;;
+12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;;
+12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;;
+12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;;
+12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;;
+12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;;
+12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;;
+12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;;
+1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;;
+1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;;
+1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;;
+1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;;
+1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;;
+12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;;
+12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;;
+12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;;
+12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;;
+12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;;
+12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;;
+12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;;
+12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;;
+12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;;
+12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;;
+1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;;
+1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;;
+1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;;
+1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;;
+1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;;
+1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;;
+12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;;
+12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;;
+12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;;
+12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;;
+12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;;
+12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;;
+12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;;
+12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;;
+12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;;
+12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;;
+1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;;
+1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;;
+1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;;
+1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;;
+1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;;
+12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;;
+12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;;
+12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;;
+12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;;
+12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;;
+12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;;
+12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;;
+12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;;
+12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;;
+1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;;
+1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;;
+1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;;
+1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;;
+121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;;
+121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;;
+121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;;
+121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;;
+121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;;
+121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;;
+121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;;
+121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;;
+121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;;
+121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;;
+121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;;
+121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;;
+121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;;
+121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;;
+121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;;
+121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;;
+121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;;
+121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;;
+121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;;
+121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;;
+121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;;
+121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;;
+121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;;
+121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;;
+121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;;
+121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;;
+121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;;
+121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;;
+121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;;
+121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;;
+121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;;
+121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;;
+121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;;
+121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;;
+121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;;
+121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;;
+121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;;
+121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;;
+121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;;
+121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;;
+121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;;
+121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;;
+121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;;
+121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;;
+121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;;
+121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;;
+121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;;
+121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;;
+121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;;
+121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;;
+121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;;
+121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;;
+121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;;
+121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;;
+121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;;
+121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;;
+121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;;
+121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;;
+121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;;
+121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;;
+121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;;
+121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;;
+121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;;
+121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;;
+121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;;
+121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;;
+121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;;
+121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;;
+121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;;
+121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;;
+121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;;
+121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;;
+121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;;
+121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;;
+121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;;
+121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;;
+121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;;
+121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;;
+12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;;
+12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;;
+12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;;
+12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;;
+1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;;
+1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;;
+12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;;
+12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;;
+12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;;
+12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;;
+12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;;
+12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;;
+12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;;
+12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;;
+12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;;
+12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;;
+1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;;
+1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;;
+1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;;
+1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;;
+1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;;
+1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;;
+12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;;
+12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;;
+12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;;
+12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;;
+12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;;
+12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;;
+12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;;
+12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;;
+1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;;
+1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;;
+1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;;
+1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;;
+1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;;
+1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;;
+12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;;
+12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;;
+12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;;
+12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;;
+12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;;
+12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;;
+12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;;
+12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;;
+1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;;
+1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;;
+1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;;
+1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;;
+1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;;
+1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;;
+12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;;
+12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;;
+12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;;
+12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;;
+12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;;
+12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;;
+12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;;
+12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;;
+12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;;
+12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;;
+1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;;
+1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;;
+1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;;
+1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;;
+1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;;
+1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;;
+12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;;
+12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;;
+1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;;
+12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;;
+12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;;
+12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;;
+12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;;
+12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;;
+12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;;
+12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;;
+12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;;
+1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;;
+1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;;
+1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;;
+1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;;
+12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;;
+12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;;
+12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;;
+12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;;
+1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;;
+1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;;
+1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;;
+1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;;
+1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;;
+1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;;
+12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;;
+12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;;
+12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;;
+12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;;
+12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;;
+12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;;
+12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;;
+12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;;
+12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;;
+12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;;
+1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;;
+1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;;
+1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;;
+1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;;
+1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;;
+1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;;
+12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;;
+12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;;
+12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;;
+12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;;
+12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;;
+12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;;
+12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;;
+12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;;
+12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;;
+12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;;
+1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;;
+1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;;
+1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;;
+1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;;
+1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;;
+122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;;
+122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;;
+122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;;
+122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;;
+122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;;
+122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;;
+122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;;
+122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;;
+122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;;
+122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;;
+122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;;
+122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;;
+122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;;
+122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;;
+122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;;
+122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;;
+122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;;
+122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;;
+122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;;
+122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;;
+122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;;
+122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;;
+122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;;
+122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;;
+122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;;
+122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;;
+122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;;
+122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;;
+122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;;
+122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;;
+122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;;
+122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;;
+122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;;
+122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;;
+122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;;
+122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;;
+122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;;
+122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;;
+122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;;
+122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;;
+122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;;
+122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;;
+122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;;
+122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;;
+122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;;
+122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;;
+122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;;
+122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;;
+122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;;
+122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;;
+122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;;
+122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;;
+122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;;
+122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;;
+122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;;
+122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;;
+122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;;
+122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;;
+122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;;
+122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;;
+122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;;
+122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;;
+122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;;
+122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;;
+122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;;
+122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;;
+122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;;
+122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;;
+122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;;
+122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;;
+122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;;
+122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;;
+122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;;
+122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;;
+122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;;
+122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;;
+122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;;
+122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;;
+122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;;
+122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;;
+122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;;
+122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;;
+122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;;
+122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;;
+122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;;
+122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;;
+122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;;
+122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;;
+122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;;
+122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;;
+122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;;
+12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;;
+12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;;
+12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;;
+12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;;
+12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;;
+12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;;
+12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;;
+12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;;
+1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;;
+1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;;
+1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;;
+1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;;
+1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;;
+12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;;
+12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;;
+12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;;
+12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;;
+12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;;
+12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;;
+12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;;
+12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;;
+12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;;
+1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;;
+1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;;
+1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;;
+1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;;
+1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;;
+12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;;
+12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;;
+12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;;
+12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;;
+12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;;
+12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;;
+12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;;
+12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;;
+1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;;
+1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;;
+1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;;
+1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;;
+12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;;
+12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;;
+12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;;
+12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;;
+12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;;
+12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;;
+12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;;
+1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;;
+1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;;
+1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;;
+1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;;
+12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;;
+12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;;
+12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;;
+12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;;
+12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;;
+12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;;
+12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;;
+12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;;
+12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;;
+12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;;
+1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;;
+1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;;
+1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;;
+1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;;
+1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;;
+12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;;
+12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;;
+12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;;
+12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;;
+12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;;
+12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;;
+12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;;
+12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;;
+1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;;
+1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;;
+1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;;
+1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;;
+1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;;
+12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;;
+12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;;
+12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;;
+12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;;
+12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;;
+12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;;
+12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;;
+12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;;
+12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;;
+12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;;
+1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;;
+1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;;
+1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;;
+1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;;
+1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;;
+12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;;
+12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;;
+12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;;
+12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;;
+12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;;
+12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;;
+12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;;
+12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;;
+12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;;
+12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;;
+1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;;
+1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;;
+1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;;
+1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;;
+1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;;
+1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;;
+12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;;
+12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;;
+12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;;
+12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;;
+12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;;
+12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;;
+12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;;
+12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;;
+12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;;
+12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;;
+1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;;
+1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;;
+1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;;
+1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;;
+1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;;
+1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;;
+12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;;
+12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;;
+12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;;
+12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;;
+12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;;
+12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;;
+12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;;
+12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;;
+12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;;
+1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;;
+1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;;
+1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;;
+1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;;
+1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;;
+1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;;
+12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;;
+12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;;
+12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;;
+12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;;
+12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;;
+12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;;
+12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;;
+12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;;
+1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;;
+1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;;
+1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;;
+1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;;
+1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;;
+1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;;
+12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;;
+12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;;
+12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;;
+12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;;
+12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;;
+12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;;
+12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;;
+12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;;
+12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;;
+12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;;
+1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;;
+1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;;
+1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;;
+1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;;
+1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;;
+1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;;
+12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;;
+12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;;
+12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;;
+12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;;
+12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;;
+12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;;
+12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;;
+12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;;
+12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;;
+12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;;
+1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;;
+1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;;
+1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;;
+1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;;
+1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;;
+1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;;
+12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;;
+12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;;
+12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;;
+12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;;
+12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;;
+12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;;
+1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
+1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
+1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
+1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;;
+1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;;
+1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;;
+1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;;
+1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;;
+1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;;
+1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;;
+1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;;
+1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;;
+1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;;
+1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;;
+1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;;
+1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;;
+1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;;
+1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;;
+1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;;
+1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;;
+1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;;
+1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;;
+1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;;
+1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;;
+1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;;
+1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;;
+1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;;
+1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;;
+1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;;
+1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;;
+1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;;
+1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;;
+1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;;
+1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;;
+1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;;
+1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;;
+1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;;
+1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;;
+1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;;
+1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;;
+1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;;
+1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;;
+1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;;
+1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;;
+1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;;
+1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;;
+1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;;
+1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;;
+1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;;
+1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;;
+1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;;
+1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;;
+1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;;
+1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;;
+1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;;
+1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;;
+1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;;
+1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;;
+1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;;
+1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;;
+1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;;
+1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;;
+1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;;
+1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;;
+1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;;
+1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;;
+1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;;
+1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;;
+1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;;
+1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;;
+1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;;
+1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;;
+1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;;
+1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;;
+1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;;
+1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;;
+1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;;
+1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;;
+1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;;
+1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;;
+1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;;
+1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;;
+1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;;
+1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;;
+1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;;
+1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;;
+1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;;
+1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;;
+1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;;
+1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;;
+1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;;
+1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;;
+1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;;
+1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;;
+1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;;
+1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;;
+1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;;
+1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;;
+1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;;
+1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;;
+1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;;
+1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;;
+1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;;
+1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;;
+1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;;
+1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;;
+1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;;
+1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;;
+1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;;
+1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;;
+1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;;
+1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;;
+1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;;
+1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;;
+1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;;
+1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;;
+1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;;
+1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;;
+1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;;
+1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;;
+1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;;
+1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;;
+1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;;
+1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;;
+1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;;
+1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;;
+1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;;
+1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;;
+1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;;
+1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;;
+1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;;
+1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;;
+1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;;
+1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;;
+1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;;
+1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;;
+1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;;
+1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;;
+1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;;
+1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;;
+1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;;
+1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;;
+1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;;
+1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;;
+1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;;
+1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;;
+1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;;
+1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;;
+1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;;
+1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;;
+1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;;
+1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;;
+1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;;
+1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;;
+1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;;
+1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;;
+1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;;
+1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;;
+1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;;
+1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;;
+1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;;
+1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;;
+1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;;
+1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;;
+1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;;
+1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;;
+1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;;
+1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;;
+1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;;
+1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;;
+1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;;
+1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;;
+1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;;
+1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;;
+1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;;
+1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;;
+1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;;
+1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;;
+1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;;
+1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;;
+1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;;
+1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;;
+1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;;
+1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;;
+1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;;
+1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;;
+1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;;
+1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;;
+1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;;
+1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;;
+1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;;
+1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;;
+1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;;
+1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;;
+1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;;
+1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;;
+1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;;
+1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;;
+1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;;
+1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;;
+1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;;
+1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;;
+1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;;
+1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;;
+1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;;
+1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;;
+1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;;
+1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;;
+1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;;
+1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;;
+1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;;
+1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;;
+1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;;
+1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;;
+1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;;
+1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;;
+1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;;
+1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;;
+1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;;
+1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;;
+1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;;
+1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;;
+1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;;
+1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;;
+1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;;
+1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;;
+1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;;
+1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;;
+1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;;
+1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;;
+1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;;
+1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;;
+1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;;
+1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;;
+1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;;
+1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;;
+1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;;
+1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;;
+1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;;
+1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;;
+1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;;
+1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;;
+1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;;
+1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;;
+1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;;
+1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;;
+1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;;
+1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;;
+1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;;
+1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;;
+1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;;
+1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;;
+1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;;
+1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;;
+1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;;
+1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;;
+1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;;
+1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;;
+1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;;
+1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;;
+1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;;
+1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;;
+1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;;
+1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;;
+1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;;
+1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;;
+1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;;
+1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;;
+1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;;
+1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;;
+1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;;
+1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;;
+1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;;
+1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;;
+1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;;
+1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;;
+1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;;
+1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;;
+1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;;
+1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;;
+1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;;
+1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;;
+1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;;
+1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;;
+1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;;
+1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;;
+1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;;
+1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;;
+1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;;
+1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;;
+1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;;
+1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;;
+1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;;
+1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;;
+1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;;
+1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;;
+1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;;
+1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;;
+1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;;
+1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;;
+1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;;
+1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;;
+1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;;
+1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;;
+1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;;
+1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;;
+1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;;
+1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;;
+1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;;
+1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;;
+1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;;
+1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;;
+1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;;
+1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;;
+1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;;
+1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;;
+1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;;
+1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;;
+1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;;
+1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;;
+1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;;
+1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;;
+1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;;
+1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;;
+1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;;
+1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;;
+1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;;
+1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;;
+1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;;
+1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;;
+1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;;
+1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;;
+1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;;
+1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;;
+1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;;
+1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;;
+1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;;
+1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;;
+1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;;
+1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;;
+1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;;
+1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;;
+1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;;
+1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;;
+1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;;
+1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;;
+1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;;
+1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;;
+1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;;
+1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;;
+1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;;
+1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;;
+1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;;
+1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;;
+1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;;
+1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;;
+1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;;
+1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;;
+1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;;
+1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;;
+1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;;
+1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;;
+1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;;
+1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;;
+1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;;
+1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;;
+1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;;
+1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;;
+1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;;
+1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;;
+1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;;
+1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;;
+1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;;
+1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;;
+1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;;
+1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
+1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
+1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;ren *;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;tian ren *;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;di ren *;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;ren tian *;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;ren di *;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;ren ren *;;;
+1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;;
+1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;;
+1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;;
+1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;;
+1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;;
+1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;;
+1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;;
+1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;;
+1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;;
+1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;;
+1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;;
+1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;;
+1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;;
+1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;;
+1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;;
+1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;;
+1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;;
+1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;;
+1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;;
+1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;;
+1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;;
+1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;;
+1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;;
+1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;;
+1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;;
+1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;;
+1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;;
+1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;;
+1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;;
+1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;;
+1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;;
+1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;;
+1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;;
+1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;;
+1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;;
+1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;;
+1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;;
+1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;;
+1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;;
+1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;;
+1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;;
+1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;;
+1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;;
+1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;;
+1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;;
+1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;;
+1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;;
+1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;;
+1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;;
+1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;;
+1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;;
+1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;;
+1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;;
+1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;;
+1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;;
+1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;;
+1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;;
+1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;;
+1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;;
+1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;;
+1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;;
+1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;;
+1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;;
+1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;;
+1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;;
+1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;;
+1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;;
+1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;;
+1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;;
+1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;;
+1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;;
+1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;;
+1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;;
+1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;;
+1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;;
+1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;;
+1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;;
+1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;;
+1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;;
+1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;;
+1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;;
+1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;;
+1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;;
+1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;;
+1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;;
+1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;;
+1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;;
+1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;;
+1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;;
+1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;;
+1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
+1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
+1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
+1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;;
+1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;;
+1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;;
+1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;;
+1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;;
+1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;;
+1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;;
+1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;;
+1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;;
+1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;;
+1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;;
+1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;;
+1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;;
+1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;;
+1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;;
+1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;;
+1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;;
+1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;;
+1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;;
+1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;;
+1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;;
+1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;;
+1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;;
+1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;;
+1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;;
+1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;;
+1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;;
+1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;;
+1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;;
+1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;;
+1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;;
+1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;;
+1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;;
+1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;;
+1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;;
+1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;;
+1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;;
+1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;;
+1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;;
+1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;;
+1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;;
+1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;;
+1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;;
+1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;;
+1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;;
+1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;;
+1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;;
+1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;;
+1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;;
+1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;;
+1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;;
+1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;;
+1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;;
+1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;;
+1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;;
+1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;;
+1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;;
+1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;;
+1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;;
+1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;;
+1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;;
+1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;;
+1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;;
+1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;;
+1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;;
+1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;;
+1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;;
+1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;;
+1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;;
+1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;;
+1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;;
+1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;;
+1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;;
+1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;;
+1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;;
+1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;;
+1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;;
+1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;;
+1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;;
+1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;;
+1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;;
+1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;;
+1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;;
+1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;;
+1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;;
+1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;;
+1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;;
+1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;;
+1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;;
+1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;;
+1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;;
+1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;;
+1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;;
+1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;;
+1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;;
+1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;;
+1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;;
+1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;;
+1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;;
+1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;;
+1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;;
+1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;;
+1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;;
+1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;;
+1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;;
+1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;;
+1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;;
+1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;;
+1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;;
+1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;;
+1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;;
+1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;;
+1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;;
+1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;;
+1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;;
+1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;;
+1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;;
+1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;;
+1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;;
+1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;;
+1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;;
+20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
+2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
+2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;;
+2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;;
+2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;;
+2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;;
+2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;;
+2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;;
+2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;;
+2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;;
+2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;;
+2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;;
+2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;;
+2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;;
+2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;;
+2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;;
+2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;;
+2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;;
+2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;;
+2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;;
+2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;;
+2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;;
+2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;;
+2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;;
+2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;;
+2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;;
+2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;;
+2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;;
+2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;;
+2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;;
+2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;;
+2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;;
+2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;;
+2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;;
+2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;;
+2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;;
+2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;;
+2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;;
+2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;;
+2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;;
+2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;;
+2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;;
+2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;;
+2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;;
+2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;;
+2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;;
+2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;;
+2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;;
+2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;;
+2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;;
+2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;;
+2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;;
+2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;;
+2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;;
+2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;;
+2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;;
+2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;;
+2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;;
+2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;;
+2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;;
+2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;;
+2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;;
+2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;;
+2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;;
+2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;;
+2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;;
+2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;;
+2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;;
+2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;;
+2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;;
+2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;;
+2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;;
+2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;;
+2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;;
+2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;;
+2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;;
+2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;;
+2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;;
+2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;;
+2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;;
+2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;;
+2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;;
+2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;;
+2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;;
+2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;;
+2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;;
+2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;;
+2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;;
+2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;;
+2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;;
+2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;;
+2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;;
+2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;;
+2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;;
+2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;;
+2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;;
+2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;;
+2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;;
+2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;;
+2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;;
+2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;;
+2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;;
+2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;;
+2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;;
+2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;;
+2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;;
+2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;;
+2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;;
+2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;;
+2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;;
+2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;;
+2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;;
+2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;;
+2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;;
+2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;;
+2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;;
+2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;;
+2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;;
+2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;;
+2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;;
+2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;;
+2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;;
+2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;;
+2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;;
+2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;;
+2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;;
+2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;;
+2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;;
+2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;;
+2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;;
+2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;;
+2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;;
+2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;;
+2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;;
+2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;;
+2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;;
+2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;;
+2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;;
+2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;;
+2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;;
+2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;;
+2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;;
+2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;;
+2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;;
+2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;;
+2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;;
+2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;;
+2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;;
+2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;;
+2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;;
+2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;;
+2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;;
+2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;;
+2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;;
+2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;;
+2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;;
+2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;;
+2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;;
+2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;;
+2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;;
+2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;;
+2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;;
+2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;;
+2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;;
+2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;;
+2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;;
+2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;;
+2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;;
+2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;;
+2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;;
+2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;;
+2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;;
+2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;;
+2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;;
+2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;;
+2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;;
+2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;;
+2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;;
+2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;;
+2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;;
+2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;;
+2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;;
+2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;;
+2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;;
+2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;;
+2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;;
+2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;;
+2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;;
+2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;;
+2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;;
+2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;;
+2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;;
+2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;;
+2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;;
+2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;;
+2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;;
+2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;;
+2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;;
+2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;;
+2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;;
+2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;;
+2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;;
+2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;;
+2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;;
+2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;;
+2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;;
+2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;;
+2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;;
+2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;;
+2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;;
+2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;;
+2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;;
+2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;;
+2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;;
+2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;;
+2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;;
+2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;;
+2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;;
+2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;;
+2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;;
+2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;;
+2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;;
+2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;;
+2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;;
+2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;;
+2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;;
+2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;;
+2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;;
+2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;;
+2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;;
+2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;;
+2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;;
+2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;;
+2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;;
+2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;;
+2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;;
+2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;;
+2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;;
+2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;;
+2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;;
+2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;;
+2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;;
+2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;;
+2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;;
+2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;;
+2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;;
+2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;;
+2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;;
+2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;;
+2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;;
+2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;;
+2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;;
+2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;;
+2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;;
+2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;;
+2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;;
+2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;;
+2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;;
+2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;;
+2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;;
+2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;;
+2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;;
+2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;;
+2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;;
+2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;;
+2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;;
+2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;;
+2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;;
+2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;;
+2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;;
+2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;;
+2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;;
+2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;;
+2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;;
+2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;;
+2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;;
+2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;;
+2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;;
+2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;;
+2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;;
+2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;;
+2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;;
+2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;;
+2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;;
+2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;;
+2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;;
+2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;;
+2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;;
+2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;;
+2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;;
+2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;;
+2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;;
+2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;;
+2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;;
+2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;;
+2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;;
+2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;;
+2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;;
+2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;;
+2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;;
+2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;;
+2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;;
+2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;;
+2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;;
+2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;;
+2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;;
+2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;;
+2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;;
+2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;;
+2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;;
+2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;;
+2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;;
+2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;;
+2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;;
+2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;;
+2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;;
+2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;;
+2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;;
+2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;;
+2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;;
+2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;;
+2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;;
+2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;;
+2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;;
+2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;;
+2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;;
+2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;;
+2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;;
+2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;;
+2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;;
+2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;;
+2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;;
+2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;;
+2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;;
+2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;;
+2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;;
+2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;;
+2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;;
+2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;;
+2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;;
+2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;;
+2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;;
+2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;;
+2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;;
+2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;;
+2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;;
+2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;;
+2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;;
+2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;;
+2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;;
+2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;;
+2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;;
+2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;;
+2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;;
+2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;;
+2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;;
+2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;;
+2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;;
+2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;;
+2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;;
+2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;;
+2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;;
+2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;;
+2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;;
+2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;;
+2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;;
+2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;;
+2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;;
+2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;;
+2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;;
+2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;;
+2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;;
+2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;;
+2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;;
+2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;;
+2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;;
+2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;;
+2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;;
+2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;;
+2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;;
+2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;;
+2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;;
+2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;;
+2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;;
+2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;;
+2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;;
+2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;;
+2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;;
+2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;;
+2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;;
+2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;;
+2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;;
+2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;;
+2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;;
+2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;;
+2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;;
+2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;;
+2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;;
+2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;;
+2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;;
+2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;;
+2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;;
+2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;;
+2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;;
+2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;;
+2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;;
+2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;;
+2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;;
+2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;;
+2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;;
+2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;;
+2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;;
+2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;;
+2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;;
+2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;;
+2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;;
+2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;;
+2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;;
+2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;;
+2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;;
+2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;;
+2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;;
+2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;;
+2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;;
+2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;;
+2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;;
+2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;;
+2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;;
+2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;;
+2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;;
+2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;;
+2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;;
+2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;;
+2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;;
+2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;;
+2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;;
+2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;;
+2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;;
+2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;;
+2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;;
+2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;;
+2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;;
+2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;;
+2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;;
+2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;;
+2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;;
+2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;;
+2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;;
+2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;;
+2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;;
+2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;;
+2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;;
+2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;;
+2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;;
+2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;;
+2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;;
+2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;;
+2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;;
+2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;;
+2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;;
+2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;;
+2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;;
+2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;;
+2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;;
+2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;;
+2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;;
+2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;;
+2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;;
+2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;;
+2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;;
+2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;;
+2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;;
+2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;;
+2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;;
+2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;;
+2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;;
+2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;;
+2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;;
+2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;;
+2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;;
+2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;;
+2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;;
+2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;;
+2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;;
+2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;;
+2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;;
+2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;;
+2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;;
+2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;;
+2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;;
+2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;;
+2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;;
+2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;;
+2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;;
+2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;;
+2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;;
+2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;;
+2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;;
+2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;;
+2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;;
+2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;;
+2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;;
+2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;;
+2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;;
+2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;;
+2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;;
+2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;;
+2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;;
+2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;;
+2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;;
+2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;;
+2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;;
+2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;;
+2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;;
+2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;;
+2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;;
+2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;;
+2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;;
+2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;;
+2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;;
+2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;;
+2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;;
+2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;;
+2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;;
+2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;;
+2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;;
+2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;;
+2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;;
+2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;;
+2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;;
+2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;;
+2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;;
+2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;;
+2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;;
+2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;;
+2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;;
+2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;;
+2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;;
+2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;;
+2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;;
+2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;;
+2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;;
+2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;;
+2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;;
+E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
+E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
+E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
+E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;;
+E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;;
+E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;;
+E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;;
+E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;;
+E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
+E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;;
+E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;;
+E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;;
+E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;;
+E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;;
+E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;;
+E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;;
+E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;;
+E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;;
+E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;;
+E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;;
+E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;;
+E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;;
+E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;;
+E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;;
+E003A;TAG COLON;Cf;0;BN;;;;;N;;;;;
+E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;;
+E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;;
+E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;;
+E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;;
+E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;;
+E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;;
+E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;;
+E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;;
+E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;;
+E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;;
+E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;;
+E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;;
+E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;;
+E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;;
+E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;;
+E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;;
+E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;;
+E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;;
+E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;;
+E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;;
+E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;;
+E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;;
+E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;;
+E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;;
+E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;;
+E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;;
+E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;;
+E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;;
+E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;;
+E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;;
+E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;;
+E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;;
+E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;;
+E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;;
+E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;;
+E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;;
+E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;;
+E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;;
+E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;;
+E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;;
+E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;;
+E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;;
+E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;;
+E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;;
+E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;;
+E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;;
+E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;;
+E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;;
+E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;;
+E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;;
+E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;;
+E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;;
+E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;;
+E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;;
+E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;;
+E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;;
+E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;;
+E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;;
+E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;;
+E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;;
+E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;;
+E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;;
+E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;;
+E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;;
+E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;;
+E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;;
+E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;;
+E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;;
+E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;;
+E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;;
+E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;;
+E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;;
+E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;;
+E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;;
+E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;;
+E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;;
+E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;;
+E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;;
+E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;;
+E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;;
+E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;;
+E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;;
+E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;;
+E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;;
+E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;;
+E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;;
+E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;;
+E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;;
+E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;;
+E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;;
+E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;;
+E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;;
+E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;;
+E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;;
+E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;;
+E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;;
+E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;;
+E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;;
+E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;;
+E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;;
+E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;;
+E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;;
+E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;;
+E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;;
+E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;;
+E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;;
+E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;;
+E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;;
+E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;;
+E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;;
+E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;;
+E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;;
+E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;;
+E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;;
+E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;;
+E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;;
+E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;;
+E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;;
+E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;;
+E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;;
+E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;;
+E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;;
+E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;;
+E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;;
+E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;;
+E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;;
+E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;;
+E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;;
+E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;;
+E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;;
+E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;;
+E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;;
+E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;;
+E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;;
+E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;;
+E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;;
+E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;;
+E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;;
+E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;;
+E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;;
+E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;;
+E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;;
+E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;;
+E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;;
+E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;;
+E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;;
+E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;;
+E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;;
+E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;;
+E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;;
+E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;;
+E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;;
+E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;;
+E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;;
+E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;;
+E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;;
+E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;;
+E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;;
+E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;;
+E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;;
+E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;;
+E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;;
+E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;;
+E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;;
+E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;;
+E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;;
+E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;;
+E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;;
+E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;;
+E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;;
+E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;;
+E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;;
+E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;;
+E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;;
+E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;;
+E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;;
+E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;;
+E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;;
+E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;;
+E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;;
+E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;;
+E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;;
+E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;;
+E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;;
+E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;;
+E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;;
+E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;;
+E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;;
+E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;;
+E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;;
+E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;;
+E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;;
+E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;;
+E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;;
+E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;;
+E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;;
+E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;;
+E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;;
+E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;;
+E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;;
+E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;;
+E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;;
+E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;;
+E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;;
+E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;;
+E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;;
+E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;;
+E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;;
+E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;;
+E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;;
+E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;;
+E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;;
+E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;;
+E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;;
+E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;;
+E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;;
+E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;;
+E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;;
+E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;;
+E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;;
+E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;;
+E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;;
+E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;;
+E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;;
+E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;;
+E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;;
+E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;;
+E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;;
+E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;;
+E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;;
+E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;;
+E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;;
+E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;;
+E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;;
+E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;;
+E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;;
+E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;;
+E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;;
+E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;;
+E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;;
+E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;;
+E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;;
+E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;;
+E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;;
+E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;;
+E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;;
+E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;;
+E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;;
+E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;;
+E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;;
+E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;;
+E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;;
+E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;;
+E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;;
+E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;;
+E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;;
+E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;;
+E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;;
+E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;;
+E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;;
+E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;;
+E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;;
+F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
+FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
+100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
+10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;;
diff --git a/boost/spirit/home/support/char_encoding/unicode/category_table.hpp b/boost/spirit/home/support/char_encoding/unicode/category_table.hpp
new file mode 100644
index 0000000000..1b262a1454
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/category_table.hpp
@@ -0,0 +1,2216 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+ AUTOGENERATED. DO NOT EDIT!!!
+==============================================================================*/
+#include <boost/cstdint.hpp>
+
+namespace boost { namespace spirit { namespace ucd { namespace detail
+{
+ static const ::boost::uint8_t category_stage1[] = {
+
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 34, 42, 43, 44, 45, 46,
+ 47, 48, 49, 40, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 50, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 51,
+ 52, 21, 21, 21, 53, 21, 54, 55, 56, 57, 58, 59, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 60, 61, 61, 61, 61, 61, 61, 61, 61,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 21, 63, 64, 21, 65, 66, 67,
+ 68, 69, 70, 71, 72, 73, 73, 73, 74, 75, 76, 77, 78, 73, 73, 73,
+ 79, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 21, 21, 21, 80, 81, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 82, 82, 82, 82, 83, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 84, 85, 86, 87, 88, 89, 90, 91, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 92, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 94, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 95, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 21, 21, 96, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 97, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 93,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 100,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 100
+ };
+
+ static const ::boost::uint16_t category_stage2[] = {
+
+ // block 0
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 544, 544, 544, 544, 544, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 536, 44, 44, 44, 49, 44, 44, 44, 41, 42, 44, 48, 44, 40, 44, 44,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 44, 44, 48, 48, 48, 44,
+ 44, 1216, 1216, 1216, 1216, 1216, 1216, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 41, 44, 42, 50, 43,
+ 50, 1345, 1345, 1345, 1345, 1345, 1345, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 41, 48, 42, 48, 32,
+ 32, 32, 32, 32, 32, 544, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 536, 44, 49, 49, 49, 49, 51, 51, 50, 51, 321, 45, 48, 4129, 51, 50,
+ 51, 48, 18, 18, 50, 321, 51, 44, 50, 18, 321, 46, 18, 18, 18, 44,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 48, 192, 192, 192, 192, 192, 192, 192, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 48, 321, 321, 321, 321, 321, 321, 321, 321,
+
+
+ // block 1
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 321, 192, 321, 192, 321, 192, 321, 192,
+ 321, 192, 321, 192, 321, 192, 321, 192, 321, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 192, 321, 192, 321, 192, 321, 321,
+ 321, 192, 192, 321, 192, 321, 192, 192, 321, 192, 192, 192, 321, 321, 192, 192,
+ 192, 192, 321, 192, 192, 321, 192, 192, 192, 321, 321, 321, 192, 192, 321, 192,
+ 192, 321, 192, 321, 192, 321, 192, 192, 321, 192, 321, 321, 192, 321, 192, 192,
+ 321, 192, 192, 192, 321, 192, 321, 192, 192, 321, 321, 68, 192, 321, 321, 321,
+ 68, 68, 68, 68, 192, 66, 321, 192, 66, 321, 192, 66, 321, 192, 321, 192,
+ 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 321, 192, 66, 321, 192, 321, 192, 192, 192, 321, 192, 321, 192, 321, 192, 321,
+
+
+ // block 2
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 321, 321, 321, 321, 321, 321, 192, 192, 321, 192, 192, 321,
+ 321, 192, 321, 192, 192, 192, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 68, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 67, 67, 67, 67, 67, 67, 67,
+ 323, 323, 50, 50, 50, 50, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 323, 323, 323, 323, 323, 50, 50, 50, 50, 50, 50, 50, 67, 50, 67, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+
+
+ // block 3
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 328, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4104,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 192, 321, 192, 321, 67, 50, 192, 321, 0, 0, 323, 321, 321, 321, 44, 0,
+ 0, 0, 0, 0, 50, 50, 192, 44, 192, 192, 192, 0, 192, 0, 192, 192,
+ 321, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 192,
+ 321, 321, 192, 192, 192, 321, 321, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 321, 321, 321, 321, 192, 321, 48, 192, 321, 192, 192, 321, 321, 192, 192, 192,
+
+
+ // block 4
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 51, 8, 8, 8, 8, 8, 9, 9, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+
+
+ // block 5
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 0, 0, 67, 44, 44, 44, 44, 44, 44,
+ 0, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 0, 44, 40, 0, 0, 0, 0, 0,
+ 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 40, 72,
+ 44, 72, 72, 44, 72, 72, 44, 72, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0,
+ 68, 68, 68, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 6
+ 33, 33, 33, 33, 0, 0, 48, 48, 48, 44, 44, 49, 44, 44, 51, 51,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 44, 0, 0, 44, 44,
+ 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 8, 72, 72, 72, 72, 72, 72, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 44, 44, 44, 44, 68, 68,
+ 72, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 44, 68, 72, 72, 72, 72, 72, 72, 72, 33, 9, 8,
+ 8, 72, 72, 72, 72, 67, 67, 72, 72, 51, 8, 8, 8, 72, 68, 68,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 68, 68, 68, 51, 51, 68,
+
+
+ // block 7
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 33,
+ 68, 72, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 67, 67, 51, 44, 44, 44, 67, 0, 0, 0, 0, 0,
+
+
+ // block 8
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 9
+ 64, 72, 72, 74, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 8, 68, 74, 74,
+ 74, 72, 72, 72, 72, 72, 72, 72, 72, 74, 74, 74, 74, 8, 64, 0,
+ 68, 8, 8, 8, 8, 64, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 72, 72, 44, 44, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 44, 67, 68, 0, 0, 0, 0, 0, 0, 64, 64, 68, 68, 68, 68, 68,
+ 0, 72, 74, 74, 0, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 68,
+ 68, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68,
+ 68, 0, 68, 0, 0, 0, 68, 68, 68, 68, 0, 0, 8, 68, 74, 74,
+ 74, 72, 72, 72, 72, 0, 0, 74, 74, 0, 0, 74, 74, 8, 68, 0,
+ 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 68, 68, 0, 68,
+ 68, 68, 72, 72, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 68, 68, 49, 49, 18, 18, 18, 18, 18, 18, 51, 0, 0, 0, 0, 0,
+
+
+ // block 10
+ 0, 72, 72, 74, 0, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 68,
+ 68, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68,
+ 68, 0, 68, 68, 0, 68, 68, 0, 68, 68, 0, 0, 8, 0, 74, 74,
+ 74, 72, 72, 0, 0, 0, 0, 72, 72, 0, 0, 72, 72, 8, 0, 0,
+ 0, 72, 0, 0, 0, 0, 0, 0, 0, 68, 68, 68, 68, 0, 68, 0,
+ 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 72, 72, 68, 68, 68, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 72, 72, 74, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68,
+ 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68,
+ 68, 0, 68, 68, 0, 68, 68, 68, 68, 68, 0, 0, 8, 68, 74, 74,
+ 74, 72, 72, 72, 72, 72, 0, 72, 72, 74, 0, 74, 74, 8, 0, 0,
+ 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 72, 72, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 11
+ 0, 72, 74, 74, 0, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 68,
+ 68, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68,
+ 68, 0, 68, 68, 0, 68, 68, 68, 68, 68, 0, 0, 8, 68, 74, 72,
+ 74, 72, 72, 72, 72, 0, 0, 74, 74, 0, 0, 74, 74, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 72, 74, 0, 0, 0, 0, 68, 68, 0, 68,
+ 68, 68, 72, 72, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 51, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 72, 68, 0, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 68,
+ 68, 0, 68, 68, 68, 68, 0, 0, 0, 68, 68, 0, 68, 0, 68, 68,
+ 0, 0, 0, 68, 68, 0, 0, 0, 68, 68, 68, 0, 0, 0, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 74, 74,
+ 72, 74, 74, 0, 0, 0, 74, 74, 74, 0, 74, 74, 74, 8, 0, 0,
+ 68, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 18, 18, 18, 51, 51, 51, 51, 51, 51, 49, 51, 0, 0, 0, 0, 0,
+
+
+ // block 12
+ 0, 74, 74, 74, 0, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68,
+ 68, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 0, 0, 0, 68, 72, 72,
+ 72, 74, 74, 74, 74, 0, 72, 72, 72, 0, 72, 72, 72, 8, 0, 0,
+ 0, 0, 0, 0, 0, 72, 72, 0, 68, 68, 0, 0, 0, 0, 0, 0,
+ 68, 68, 72, 72, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 51,
+ 0, 0, 74, 74, 0, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68,
+ 68, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 0, 0, 8, 68, 74, 72,
+ 74, 74, 74, 74, 74, 0, 72, 74, 74, 0, 74, 74, 72, 8, 0, 0,
+ 0, 0, 0, 0, 0, 74, 74, 0, 0, 0, 0, 0, 0, 0, 68, 0,
+ 68, 68, 72, 72, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 13
+ 0, 0, 74, 74, 0, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68,
+ 68, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 74, 74,
+ 74, 72, 72, 72, 72, 0, 74, 74, 74, 0, 74, 74, 74, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 72, 72, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 18, 18, 18, 18, 18, 18, 0, 0, 0, 51, 68, 68, 68, 68, 68, 68,
+ 0, 0, 74, 74, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 8, 0, 0, 0, 0, 74,
+ 74, 74, 72, 72, 72, 0, 72, 0, 74, 74, 74, 74, 74, 74, 74, 74,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 74, 74, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 14
+ 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 72, 68, 68, 72, 72, 72, 72, 72, 72, 72, 0, 0, 0, 0, 49,
+ 68, 68, 68, 68, 68, 68, 67, 8, 8, 8, 8, 8, 8, 72, 8, 44,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 44, 44, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 68, 68, 0, 68, 0, 0, 68, 68, 0, 68, 0, 0, 68, 0, 0,
+ 0, 0, 0, 0, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68,
+ 0, 68, 68, 68, 0, 68, 0, 68, 0, 0, 68, 68, 0, 68, 68, 68,
+ 68, 72, 68, 68, 72, 72, 72, 72, 72, 72, 0, 72, 72, 68, 0, 0,
+ 68, 68, 68, 68, 68, 0, 67, 0, 8, 8, 8, 8, 8, 72, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 68, 68, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 15
+ 68, 51, 51, 51, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 51, 51, 51, 51, 51, 8, 8, 51, 51, 51, 51, 51, 51,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 51, 8, 51, 8, 51, 8, 41, 42, 41, 42, 10, 10,
+ 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0,
+ 0, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 74,
+ 72, 72, 8, 8, 8, 44, 8, 8, 68, 68, 68, 68, 0, 0, 0, 0,
+ 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 51, 51,
+ 51, 51, 51, 51, 51, 51, 8, 51, 51, 51, 51, 51, 51, 0, 51, 51,
+ 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 16
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 74, 74, 72, 72, 72,
+ 72, 74, 72, 72, 72, 72, 72, 8, 74, 8, 8, 74, 74, 72, 72, 68,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 44, 44, 44, 44, 44, 44,
+ 68, 68, 68, 68, 68, 68, 74, 74, 72, 72, 68, 68, 68, 68, 72, 72,
+ 72, 68, 74, 10, 10, 68, 68, 74, 74, 10, 10, 10, 10, 10, 68, 68,
+ 68, 72, 72, 72, 72, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 72, 74, 74, 72, 72, 10, 10, 10, 10, 10, 10, 8, 68, 10,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 64, 64, 51, 51,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 44, 67, 0, 0, 0,
+
+
+ // block 17
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 64, 64, 64, 64, 64, 4164,
+ 4164, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 64, 64, 64, 64, 64, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 64, 64, 64, 64, 64, 64,
+
+
+ // block 18
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 0, 68, 0, 68, 68, 68, 68, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 0, 68, 68, 68, 68, 0, 0, 68, 68, 68, 68, 68, 68, 68, 0,
+ 68, 0, 68, 68, 68, 68, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+
+
+ // block 19
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 0, 68, 68, 68, 68, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 72,
+ 51, 44, 44, 44, 44, 44, 44, 44, 44, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 20
+ 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+
+
+ // block 21
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+
+
+ // block 22
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 44, 44, 68,
+ 68, 68, 68, 68, 68, 68, 68, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 536, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 41, 42, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 44, 44, 44, 81, 81,
+ 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 23
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68,
+ 68, 68, 72, 72, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 72, 72, 8, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68,
+ 68, 0, 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 4129, 4129, 74, 72, 72, 72, 72, 72, 72, 72, 74, 74,
+ 74, 74, 74, 74, 74, 74, 72, 74, 74, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 44, 44, 44, 67, 44, 44, 44, 49, 68, 8, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0,
+
+
+ // block 24
+ 44, 44, 44, 44, 44, 44, 40, 44, 44, 44, 44, 4104, 4104, 4104, 536, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 72, 68, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 25
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0,
+ 72, 72, 72, 74, 74, 74, 74, 72, 72, 74, 74, 74, 0, 0, 0, 0,
+ 74, 74, 72, 74, 74, 74, 74, 74, 74, 8, 8, 8, 0, 0, 0, 0,
+ 51, 0, 0, 0, 44, 44, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0,
+ 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 64, 64, 0, 0, 0, 0,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 68, 68, 68, 68, 68, 68, 68, 74, 74, 0, 0, 0, 0, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 44, 44,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+
+
+ // block 26
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 72, 72, 74, 74, 74, 0, 0, 44, 44,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0,
+ 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 27
+ 72, 72, 72, 72, 74, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 8, 74, 72, 72, 72, 72, 72, 74, 72, 74, 74, 74,
+ 74, 74, 72, 74, 10, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 44, 44, 44, 44, 44, 44,
+ 44, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0,
+ 72, 72, 74, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 74, 72, 72, 72, 72, 74, 74, 72, 72, 10, 0, 0, 0, 68, 68,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 28
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 74, 74, 74, 74, 74, 74, 74, 74, 72, 72, 72, 72,
+ 72, 72, 72, 72, 74, 74, 8, 8, 0, 0, 0, 44, 44, 44, 44, 44,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 68, 68, 68,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 67, 67, 67, 67, 67, 67, 44, 44,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 0, 64, 64,
+ 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 29
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 323, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8,
+
+
+ // block 30
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 321, 321, 321, 321, 321, 321, 321, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+
+
+ // block 31
+ 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192,
+ 321, 321, 321, 321, 321, 321, 0, 0, 192, 192, 192, 192, 192, 192, 0, 0,
+ 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192,
+ 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192,
+ 321, 321, 321, 321, 321, 321, 0, 0, 192, 192, 192, 192, 192, 192, 0, 0,
+ 321, 321, 321, 321, 321, 321, 321, 321, 0, 192, 0, 192, 0, 192, 0, 192,
+ 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 0, 0,
+ 321, 321, 321, 321, 321, 321, 321, 321, 66, 66, 66, 66, 66, 66, 66, 66,
+ 321, 321, 321, 321, 321, 321, 321, 321, 66, 66, 66, 66, 66, 66, 66, 66,
+ 321, 321, 321, 321, 321, 321, 321, 321, 66, 66, 66, 66, 66, 66, 66, 66,
+ 321, 321, 321, 321, 321, 0, 321, 321, 192, 192, 192, 192, 66, 50, 321, 50,
+ 50, 50, 321, 321, 321, 0, 321, 321, 192, 192, 192, 192, 66, 50, 50, 50,
+ 321, 321, 321, 321, 0, 0, 321, 321, 192, 192, 192, 192, 0, 50, 50, 50,
+ 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192, 192, 50, 50, 50,
+ 0, 0, 321, 321, 321, 0, 321, 321, 192, 192, 192, 192, 66, 50, 50, 0,
+
+
+ // block 32
+ 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 4129, 4129, 4129, 4129, 4129,
+ 40, 40, 40, 40, 40, 40, 44, 44, 45, 46, 41, 45, 45, 46, 41, 45,
+ 44, 44, 44, 44, 44, 44, 44, 44, 537, 538, 4129, 4129, 4129, 4129, 4129, 536,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 46, 44, 44, 44, 44, 43,
+ 43, 44, 44, 44, 48, 41, 42, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 48, 44, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 536,
+ 4129, 4129, 4129, 4129, 4129, 4096, 4096, 4096, 4096, 4096, 4129, 4129, 4129, 4129, 4129, 4129,
+ 18, 65, 0, 0, 18, 18, 18, 18, 18, 18, 48, 48, 48, 41, 42, 65,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 48, 48, 48, 41, 42, 0,
+ 323, 323, 323, 323, 323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9,
+ 9, 8, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 33
+ 51, 51, 192, 51, 51, 51, 51, 192, 51, 51, 321, 192, 192, 192, 321, 321,
+ 192, 192, 192, 321, 51, 192, 51, 51, 51, 192, 192, 192, 192, 192, 51, 51,
+ 51, 51, 51, 51, 192, 51, 192, 51, 192, 51, 192, 192, 192, 192, 51, 321,
+ 192, 192, 192, 192, 321, 68, 68, 68, 68, 321, 51, 51, 321, 321, 192, 192,
+ 48, 48, 48, 48, 48, 192, 321, 321, 321, 321, 51, 48, 51, 51, 321, 51,
+ 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+ 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337,
+ 81, 81, 81, 192, 321, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 51, 51, 51, 51, 51, 48, 48, 51, 51, 51, 51,
+ 48, 51, 51, 48, 51, 51, 48, 51, 51, 51, 51, 51, 51, 51, 48, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48,
+ 51, 51, 48, 51, 48, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+
+
+ // block 34
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+
+
+ // block 35
+ 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 48, 48, 51, 51, 51, 51, 51, 51, 51, 41, 42, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48,
+ 48, 48, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 36
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243,
+ 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+
+
+ // block 37
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 48, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 48, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 48, 48, 48, 48,
+
+
+ // block 38
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0,
+ 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 39
+ 0, 51, 51, 51, 51, 0, 51, 51, 51, 51, 0, 0, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 0, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 51, 0, 51,
+ 51, 51, 51, 0, 0, 0, 51, 0, 51, 51, 51, 51, 51, 51, 51, 0,
+ 0, 51, 51, 51, 51, 51, 51, 51, 41, 42, 41, 42, 41, 42, 41, 42,
+ 41, 42, 41, 42, 41, 42, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 51, 0, 0, 0, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0,
+ 48, 48, 48, 48, 48, 41, 42, 48, 48, 48, 48, 0, 48, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+
+
+ // block 40
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+
+
+ // block 41
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41,
+ 42, 41, 42, 41, 42, 41, 42, 41, 42, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 41, 42, 41, 42, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 41, 42, 48, 48,
+
+
+ // block 42
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 51, 51, 48, 48, 48, 48, 48, 48, 0, 0, 0,
+ 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 43
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 0,
+ 192, 321, 192, 192, 192, 321, 321, 192, 321, 192, 321, 192, 321, 192, 192, 192,
+ 192, 321, 192, 321, 321, 192, 321, 321, 321, 321, 321, 321, 321, 323, 192, 192,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 321, 51, 51, 51, 51, 51, 51, 192, 320, 192, 320, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 18, 44, 44,
+
+
+ // block 44
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 0,
+ 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 0,
+ 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 0,
+ 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 0,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+
+
+ // block 45
+ 44, 44, 45, 46, 45, 46, 44, 44, 44, 45, 46, 44, 45, 46, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 40, 44, 44, 40, 44, 45, 46, 44, 44,
+ 45, 46, 41, 42, 41, 42, 41, 42, 41, 42, 44, 44, 44, 44, 44, 67,
+ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 46
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0,
+
+
+ // block 47
+ 536, 44, 44, 44, 51, 67, 68, 81, 41, 42, 41, 42, 41, 42, 41, 42,
+ 41, 42, 51, 51, 41, 42, 41, 42, 41, 42, 41, 42, 40, 41, 42, 42,
+ 51, 81, 81, 81, 81, 81, 81, 81, 81, 81, 8, 8, 8, 8, 8, 8,
+ 40, 67, 67, 67, 67, 67, 51, 51, 81, 81, 81, 67, 68, 44, 51, 51,
+ 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 0, 0, 8, 8, 50, 50, 67, 67, 68,
+ 40, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 44, 67, 67, 67, 68,
+
+
+ // block 48
+ 0, 0, 0, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0,
+ 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 4164, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0,
+ 51, 51, 18, 18, 18, 18, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+
+
+ // block 49
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0,
+
+
+ // block 50
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+
+
+ // block 51
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 52
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+
+
+ // block 53
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0,
+
+
+ // block 54
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 67, 44, 44, 44,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 68, 68, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 0, 0, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 68, 8,
+ 9, 9, 9, 44, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 44, 67,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 55
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 50, 50, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 321, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321, 192, 321,
+ 323, 321, 321, 321, 321, 321, 321, 321, 321, 192, 321, 192, 321, 192, 192, 321,
+ 192, 321, 192, 321, 192, 321, 192, 321, 67, 50, 50, 192, 321, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 68, 68, 68, 68,
+
+
+ // block 56
+ 68, 68, 8, 68, 68, 68, 8, 68, 68, 68, 68, 8, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 74, 74, 72, 72, 74, 51, 51, 51, 51, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 74, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 64, 64, 64, 64, 64, 64, 0, 0, 0, 64, 0, 0, 0, 0,
+
+
+ // block 57
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 72, 72, 72, 72, 72, 8, 8, 8, 44, 44,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 74, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 58
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 72, 72, 72, 72, 72, 72, 74,
+ 74, 72, 72, 74, 74, 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 72, 68, 68, 68, 68, 68, 68, 68, 68, 72, 74, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 44, 44, 44, 44,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 64, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0,
+ 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 59
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 60
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0,
+
+
+ // block 61
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+
+
+ // block 62
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+
+
+ // block 63
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 64, 64, 64, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 64
+ 321, 321, 321, 321, 321, 321, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 321, 321, 321, 321, 321, 0, 0, 0, 0, 0, 68, 72, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 48, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 0, 68, 0,
+ 68, 68, 0, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+
+
+ // block 65
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 41, 42,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 0, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 49, 51, 0, 0,
+
+
+ // block 66
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 44, 44, 44, 44, 44, 44, 44, 41, 42, 44, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 40, 40, 43, 43, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41,
+ 42, 41, 42, 41, 42, 44, 44, 41, 42, 44, 44, 44, 44, 43, 43, 43,
+ 44, 44, 44, 0, 44, 44, 44, 44, 40, 41, 42, 41, 42, 41, 42, 44,
+ 44, 44, 48, 40, 48, 48, 48, 0, 44, 49, 44, 44, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 4129,
+
+
+ // block 67
+ 0, 44, 44, 44, 49, 44, 44, 44, 41, 42, 44, 48, 44, 40, 44, 44,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 44, 44, 48, 48, 48, 44,
+ 44, 1216, 1216, 1216, 1216, 1216, 1216, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 41, 44, 42, 50, 43,
+ 50, 1345, 1345, 1345, 1345, 1345, 1345, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 41, 48, 42, 48, 41,
+ 42, 44, 41, 42, 44, 44, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 67, 67,
+ 4164, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0,
+ 0, 0, 68, 68, 68, 68, 68, 68, 0, 0, 68, 68, 68, 68, 68, 68,
+ 0, 0, 68, 68, 68, 68, 68, 68, 0, 0, 68, 68, 68, 0, 0, 0,
+ 49, 49, 48, 50, 51, 49, 49, 0, 51, 48, 48, 48, 48, 51, 51, 0,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 33, 33, 33, 51, 51, 2048, 2048,
+
+
+ // block 68
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 68, 68, 0, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0,
+
+
+ // block 69
+ 44, 44, 51, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 0, 0, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 18, 18, 18, 18, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 18, 0, 0, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 8, 0, 0,
+
+
+ // block 70
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 71
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0,
+ 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 81, 68, 68, 68, 68, 68, 68, 68, 68, 81, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 44,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 0, 0, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68,
+ 44, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 72
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 73
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 74
+ 68, 68, 68, 68, 68, 68, 0, 0, 68, 0, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 0, 68, 68, 0, 0, 0, 68, 0, 0, 68,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 75
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 18, 18, 18, 18, 0, 0, 0, 0, 0, 44,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 44,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 76
+ 68, 72, 72, 72, 0, 72, 72, 0, 0, 0, 0, 0, 72, 72, 72, 72,
+ 68, 68, 68, 68, 0, 68, 68, 68, 0, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 0, 0, 0, 0, 8, 8, 8, 0, 0, 0, 0, 8,
+ 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 77
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 78
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 79
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 80
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 81
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 82
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+
+
+ // block 83
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 84
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 85
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 0, 0, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 10, 10, 8, 8, 8, 51, 51, 51, 10, 10, 10,
+ 10, 10, 10, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 8, 8, 8, 8, 8,
+ 8, 8, 8, 51, 51, 8, 8, 8, 8, 8, 8, 8, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 8, 8, 8, 8, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 86
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 8, 8, 8, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 87
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 88
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 321, 321,
+ 321, 321, 321, 321, 321, 0, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 192, 0, 192, 192,
+ 0, 0, 192, 0, 0, 192, 192, 0, 0, 192, 192, 192, 192, 0, 192, 192,
+ 192, 192, 192, 192, 192, 192, 321, 321, 321, 321, 0, 321, 0, 321, 321, 321,
+ 321, 321, 321, 321, 0, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+
+
+ // block 89
+ 321, 321, 321, 321, 192, 192, 0, 192, 192, 192, 192, 0, 0, 192, 192, 192,
+ 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 0, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 0, 192, 192, 192, 192, 0,
+ 192, 192, 192, 192, 192, 0, 192, 0, 0, 0, 192, 192, 192, 192, 192, 192,
+ 192, 0, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+
+
+ // block 90
+ 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 0, 0, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 48, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 48, 321, 321, 321, 321,
+ 321, 321, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 48, 321, 321, 321, 321,
+
+
+ // block 91
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 48, 321, 321, 321, 321, 321, 321, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 48, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 48,
+ 321, 321, 321, 321, 321, 321, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 48,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 48, 321, 321, 321, 321, 321, 321,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 48, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 48, 321, 321, 321, 321, 321, 321, 192, 321, 0, 0, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+
+
+ // block 92
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 93
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2048, 2048,
+
+
+ // block 94
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 95
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 96
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 97
+ 4096, 4129, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129,
+ 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129,
+ 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129,
+ 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129,
+ 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129,
+ 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+
+
+ // block 98
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+
+
+ // block 99
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+
+
+ // block 100
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2048, 2048
+ };
+
+ inline ::boost::uint16_t category_lookup(::boost::uint32_t ch)
+ {
+ ::boost::uint32_t block_offset = category_stage1[ch / 256] * 256;
+ return category_stage2[block_offset + ch % 256];
+ }
+
+}}}} // namespace boost::spirit::unicode::detail
diff --git a/boost/spirit/home/support/char_encoding/unicode/create_tables.cpp b/boost/spirit/home/support/char_encoding/unicode/create_tables.cpp
new file mode 100644
index 0000000000..aa36fb4d93
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/create_tables.cpp
@@ -0,0 +1,583 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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/warning_disable.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix.hpp>
+#include <boost/unordered_map.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/foreach.hpp>
+#include <boost/array.hpp>
+#include <boost/scoped_array.hpp>
+#include <boost/range/iterator_range.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <algorithm>
+#include <string>
+#include <map>
+
+// We place the data here. Each line comprises various fields
+typedef std::vector<std::string> ucd_line;
+typedef std::vector<ucd_line> ucd_vector;
+typedef std::vector<ucd_line>::iterator ucd_iterator;
+
+// spirit and phoenix using declarations
+using boost::spirit::qi::parse;
+using boost::spirit::qi::hex;
+using boost::spirit::qi::char_;
+using boost::spirit::qi::eol;
+using boost::spirit::qi::rule;
+using boost::spirit::qi::omit;
+using boost::spirit::qi::_1;
+using boost::spirit::qi::_val;
+using boost::phoenix::push_back;
+using boost::phoenix::ref;
+
+// basic unsigned types
+using boost::uint8_t;
+using boost::uint16_t;
+using boost::uint32_t;
+
+// a char range
+struct ucd_range
+{
+ ucd_range(uint32_t start, uint32_t finish)
+ : start(start), finish(finish) {}
+
+ // we need this so we can use ucd_range as a multimap key
+ friend bool operator<(ucd_range const& a, ucd_range const& b)
+ {
+ return a.start < b.start;
+ }
+
+ uint32_t start;
+ uint32_t finish;
+};
+
+class ucd_info
+{
+public:
+
+ ucd_info(char const* filename)
+ {
+ std::ifstream in(filename, std::ios_base::in);
+ if (!in)
+ {
+ std::cerr << "Error: Could not open input file: "
+ << filename << std::endl;
+ }
+ else
+ {
+ std::string data; // We will read the contents here.
+ in.unsetf(std::ios::skipws); // No white space skipping!
+ std::copy(
+ std::istream_iterator<char>(in),
+ std::istream_iterator<char>(),
+ std::back_inserter(data));
+
+ typedef std::string::const_iterator iterator_type;
+ iterator_type f = data.begin();
+ iterator_type l = data.end();
+
+ rule<iterator_type> endl = -('#' >> *(char_-eol)) >> eol;
+ rule<iterator_type, std::string()> field = *(char_-(';'|endl)) >> (';'|&endl);
+ rule<iterator_type, ucd_line()> line = +(field-endl) >> endl;
+ rule<iterator_type, std::vector<ucd_line>()> file = +(endl | line[push_back(_val, _1)]);
+
+ parse(f, l, file, info);
+ }
+ }
+
+ template <typename Array>
+ void collect(Array& data, int field, bool collect_properties = true) const
+ {
+ BOOST_ASSERT(!info.empty());
+ ucd_vector::const_iterator current = info.begin();
+ ucd_vector::const_iterator end = info.end();
+
+ while (current != end)
+ {
+ std::string range = (*current)[0];
+ boost::trim(range);
+
+ std::string::const_iterator f = range.begin();
+ std::string::const_iterator l = range.end();
+
+ // get the code-point range
+ uint32_t start;
+ uint32_t finish;
+ parse(f, l, hex[ref(start) = ref(finish) = _1] >> -(".." >> hex[ref(finish) = _1]));
+
+ // special case for UnicodeData.txt ranges:
+ if ((*current)[1].find("First>") != std::string::npos)
+ {
+ ++current;
+ BOOST_ASSERT(current != end);
+ BOOST_ASSERT((*current)[1].find("Last>") != std::string::npos);
+
+ std::string range = (*current)[0];
+ boost::trim(range);
+ f = range.begin();
+ l = range.end();
+
+ parse(f, l, hex[ref(finish) = _1]);
+ }
+
+ std::string code;
+ if (field < int(current->size()))
+ code = (*current)[field];
+ boost::trim(code);
+ // Only collect properties we are interested in
+ if (collect_properties) // code for properties
+ {
+ if (!ignore_property(code))
+ {
+ for (uint32_t i = start; i <= finish; ++i)
+ data[i] |= map_property(code);
+ }
+ }
+ else // code for actual numeric values
+ {
+ for (uint32_t i = start; i <= finish; ++i)
+ {
+ if (code.empty())
+ {
+ data[i] = 0; // signal that this code maps to itself
+ }
+ else
+ {
+ f = code.begin();
+ l = code.end();
+ parse(f, l, hex, data[i]);
+ }
+ }
+ }
+ ++current;
+ }
+ }
+
+private:
+
+ static bool ignore_property(std::string const& p)
+ {
+ // We don't handle all properties
+ std::map<std::string, int>& pm = get_property_map();
+ std::map<std::string, int>::iterator i = pm.find(p);
+ return i == pm.end();
+ }
+
+ static int
+ map_property(std::string const& p)
+ {
+ std::map<std::string, int>& pm = get_property_map();
+ std::map<std::string, int>::iterator i = pm.find(p);
+ BOOST_ASSERT(i != pm.end());
+ return i->second;
+ }
+
+ static std::map<std::string, int>&
+ get_property_map()
+ {
+ // The properties we are interested in:
+ static std::map<std::string, int> map;
+ if (map.empty())
+ {
+ // General_Category
+ map["Lu"] = 0;
+ map["Ll"] = 1;
+ map["Lt"] = 2;
+ map["Lm"] = 3;
+ map["Lo"] = 4;
+
+ map["Mn"] = 8;
+ map["Me"] = 9;
+ map["Mc"] = 10;
+
+ map["Nd"] = 16;
+ map["Nl"] = 17;
+ map["No"] = 18;
+
+ map["Zs"] = 24;
+ map["Zl"] = 25;
+ map["Zp"] = 26;
+
+ map["Cc"] = 32;
+ map["Cf"] = 33;
+ map["Co"] = 34;
+ map["Cs"] = 35;
+ map["Cn"] = 36;
+
+ map["Pd"] = 40;
+ map["Ps"] = 41;
+ map["Pe"] = 42;
+ map["Pc"] = 43;
+ map["Po"] = 44;
+ map["Pi"] = 45;
+ map["Pf"] = 46;
+
+ map["Sm"] = 48;
+ map["Sc"] = 49;
+ map["Sk"] = 50;
+ map["So"] = 51;
+
+ // Derived Properties.
+ map["Alphabetic"] = 64;
+ map["Uppercase"] = 128;
+ map["Lowercase"] = 256;
+ map["White_Space"] = 512;
+ map["Hex_Digit"] = 1024;
+ map["Noncharacter_Code_Point"] = 2048;
+ map["Default_Ignorable_Code_Point"] = 4096;
+
+ // Script
+ map["Arabic"] = 0;
+ map["Imperial_Aramaic"] = 1;
+ map["Armenian"] = 2;
+ map["Avestan"] = 3;
+ map["Balinese"] = 4;
+ map["Bamum"] = 5;
+ map["Bengali"] = 6;
+ map["Bopomofo"] = 7;
+ map["Braille"] = 8;
+ map["Buginese"] = 9;
+ map["Buhid"] = 10;
+ map["Canadian_Aboriginal"] = 11;
+ map["Carian"] = 12;
+ map["Cham"] = 13;
+ map["Cherokee"] = 14;
+ map["Coptic"] = 15;
+ map["Cypriot"] = 16;
+ map["Cyrillic"] = 17;
+ map["Devanagari"] = 18;
+ map["Deseret"] = 19;
+ map["Egyptian_Hieroglyphs"] = 20;
+ map["Ethiopic"] = 21;
+ map["Georgian"] = 22;
+ map["Glagolitic"] = 23;
+ map["Gothic"] = 24;
+ map["Greek"] = 25;
+ map["Gujarati"] = 26;
+ map["Gurmukhi"] = 27;
+ map["Hangul"] = 28;
+ map["Han"] = 29;
+ map["Hanunoo"] = 30;
+ map["Hebrew"] = 31;
+ map["Hiragana"] = 32;
+ map["Katakana_Or_Hiragana"] = 33;
+ map["Old_Italic"] = 34;
+ map["Javanese"] = 35;
+ map["Kayah_Li"] = 36;
+ map["Katakana"] = 37;
+ map["Kharoshthi"] = 38;
+ map["Khmer"] = 39;
+ map["Kannada"] = 40;
+ map["Kaithi"] = 41;
+ map["Tai_Tham"] = 42;
+ map["Lao"] = 43;
+ map["Latin"] = 44;
+ map["Lepcha"] = 45;
+ map["Limbu"] = 46;
+ map["Linear_B"] = 47;
+ map["Lisu"] = 48;
+ map["Lycian"] = 49;
+ map["Lydian"] = 50;
+ map["Malayalam"] = 51;
+ map["Mongolian"] = 52;
+ map["Meetei_Mayek"] = 53;
+ map["Myanmar"] = 54;
+ map["Nko"] = 55;
+ map["Ogham"] = 56;
+ map["Ol_Chiki"] = 57;
+ map["Old_Turkic"] = 58;
+ map["Oriya"] = 59;
+ map["Osmanya"] = 60;
+ map["Phags_Pa"] = 61;
+ map["Inscriptional_Pahlavi"] = 62;
+ map["Phoenician"] = 63;
+ map["Inscriptional_Parthian"] = 64;
+ map["Rejang"] = 65;
+ map["Runic"] = 66;
+ map["Samaritan"] = 67;
+ map["Old_South_Arabian"] = 68;
+ map["Saurashtra"] = 69;
+ map["Shavian"] = 70;
+ map["Sinhala"] = 71;
+ map["Sundanese"] = 72;
+ map["Syloti_Nagri"] = 73;
+ map["Syriac"] = 74;
+ map["Tagbanwa"] = 75;
+ map["Tai_Le"] = 76;
+ map["New_Tai_Lue"] = 77;
+ map["Tamil"] = 78;
+ map["Tai_Viet"] = 79;
+ map["Telugu"] = 80;
+ map["Tifinagh"] = 81;
+ map["Tagalog"] = 82;
+ map["Thaana"] = 83;
+ map["Thai"] = 84;
+ map["Tibetan"] = 85;
+ map["Ugaritic"] = 86;
+ map["Vai"] = 87;
+ map["Old_Persian"] = 88;
+ map["Cuneiform"] = 89;
+ map["Yi"] = 90;
+ map["Inherited"] = 91;
+ map["Common"] = 92;
+ map["Unknown"] = 93;
+ }
+ return map;
+ }
+
+ ucd_vector info;
+};
+
+template <typename T, uint32_t block_size_ = 256>
+class ucd_table_builder
+{
+public:
+
+ static uint32_t const block_size = block_size_;
+ static uint32_t const full_span = 0x110000;
+ typedef T value_type;
+
+ ucd_table_builder() : p(new T[full_span])
+ {
+ for (uint32_t i = 0; i < full_span; ++i)
+ p[i] = 0;
+ }
+
+ void collect(char const* filename, int field, bool collect_properties = true)
+ {
+ std::cout << "collecting " << filename << std::endl;
+ ucd_info info(filename);
+ info.collect(p, field, collect_properties);
+ }
+
+ void build(std::vector<uint8_t>& stage1, std::vector<T const*>& stage2)
+ {
+ std::cout << "building tables" << std::endl;
+ std::map<block_ptr, std::vector<T const*> > blocks;
+ for (T const* i = p.get(); i < (p.get() + full_span); i += block_size)
+ blocks[block_ptr(i)].push_back(i);
+
+ // Not enough bits to store the block indices.
+ BOOST_ASSERT(blocks.size() < (1 << (sizeof(uint8_t) * 8)));
+
+ typedef std::pair<block_ptr, std::vector<T const*> > blocks_value_type;
+ std::map<T const*, std::vector<T const*> > sorted_blocks;
+ BOOST_FOREACH(blocks_value_type const& val, blocks)
+ {
+ sorted_blocks[val.first.p] = val.second;
+ }
+
+ stage1.clear();
+ stage1.reserve(full_span / block_size);
+ stage1.resize(full_span / block_size);
+ stage2.clear();
+ stage2.reserve(blocks.size());
+
+ typedef std::pair<T const*, std::vector<T const*> > sorted_blocks_value_type;
+ BOOST_FOREACH(sorted_blocks_value_type const& val, sorted_blocks)
+ {
+ stage2.push_back(val.first);
+ BOOST_FOREACH(T const* val2, val.second)
+ {
+ stage1[(val2 - p.get()) / block_size] = stage2.size() - 1;
+ }
+ }
+ }
+
+private:
+
+ struct block_ptr
+ {
+ block_ptr(T const* p) : p(p) {}
+
+ friend bool operator<(block_ptr a, block_ptr b)
+ {
+ return std::lexicographical_compare(
+ a.p, a.p + block_size, b.p, b.p + block_size);
+ }
+
+ T const* p;
+ };
+
+ boost::scoped_array<T> p;
+};
+
+template <typename Out>
+void print_tab(Out& out, int tab)
+{
+ for (int i = 0; i < tab; ++i)
+ out << ' ';
+}
+
+template <typename Out, typename C>
+void print_table(Out& out, C const& c, bool trailing_comma, int width = 4, int group = 16)
+{
+ int const tab = 4;
+ C::size_type size = c.size();
+ BOOST_ASSERT(size > 1);
+ print_tab(out, tab);
+ out << std::setw(width) << int(c[0]);
+ for (C::size_type i = 1; i < size; ++i)
+ {
+ out << ", ";
+ if ((i % group) == 0)
+ {
+ out << std::endl;
+ print_tab(out, tab);
+ }
+ out << std::setw(width) << int(c[i]);
+ }
+
+ if (trailing_comma)
+ out << ", " << std::endl;
+}
+
+template <typename Out>
+void print_head(Out& out)
+{
+ out
+ << "/*=============================================================================\n"
+ << " Copyright (c) 2001-2011 Joel de Guzman\n"
+ << "\n"
+ << " Distributed under the Boost Software License, Version 1.0. (See accompanying\n"
+ << " file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n"
+ << "\n"
+ << " AUTOGENERATED. DO NOT EDIT!!!\n"
+ << "==============================================================================*/\n"
+ << "#include <boost/cstdint.hpp>\n"
+ << "\n"
+ << "namespace boost { namespace spirit { namespace ucd { namespace detail\n"
+ << "{"
+ ;
+}
+
+template <typename Out>
+void print_tail(Out& out)
+{
+ out
+ << "\n"
+ << "}}}} // namespace boost::spirit::unicode::detail\n"
+ ;
+}
+
+char const* get_int_type_name(int size)
+{
+ switch (size)
+ {
+ case 1: return "::boost::uint8_t";
+ case 2: return "::boost::uint16_t";
+ case 4: return "::boost::uint32_t";
+ case 5: return "::boost::uint64_t";
+ default: BOOST_ASSERT(false); return 0; // invalid size
+ };
+}
+
+template <typename Out, typename Builder>
+void print_file(Out& out, Builder& builder, int field_width, char const* name)
+{
+ std::cout << "Generating " << name << " tables" << std::endl;
+
+ uint32_t const block_size = Builder::block_size;
+ typedef typename Builder::value_type value_type;
+ print_head(out);
+
+ std::vector<uint8_t> stage1;
+ std::vector<value_type const*> stage2;
+ builder.build(stage1, stage2);
+ std::cout << "Block Size: " << block_size << std::endl;
+ std::cout << "Total Bytes: "
+ << stage1.size()+(stage2.size()*block_size*sizeof(value_type))
+ << std::endl;
+
+ out
+ << "\n"
+ << " static const ::boost::uint8_t " << name << "_stage1[] = {\n"
+ << "\n"
+ ;
+
+ print_table(out, stage1, false, 3);
+ char const* int_name = get_int_type_name(sizeof(value_type));
+
+ out
+ << "\n"
+ << " };"
+ << "\n"
+ << "\n"
+ << " static const " << int_name << ' ' << name << "_stage2[] = {"
+ ;
+
+ int block_n = 0;
+ for (int i = 0; i < int(stage2.size()); ++i)
+ {
+ value_type const* p = stage2[i];
+ bool last = (i+1 == stage2.size());
+ out << "\n\n // block " << block_n++ << std::endl;
+ print_table(out,
+ boost::iterator_range<value_type const*>(p, p+block_size), !last, field_width);
+ }
+
+ out
+ << "\n"
+ << " };"
+ << "\n"
+ ;
+
+ out
+ << "\n"
+ << " inline " << int_name << ' ' << name << "_lookup(::boost::uint32_t ch)\n"
+ << " {\n"
+ << " ::boost::uint32_t block_offset = " << name << "_stage1[ch / " << block_size << "] * " << block_size << ";\n"
+ << " return " << name << "_stage2[block_offset + ch % " << block_size << "];\n"
+ << " }\n"
+ ;
+
+ print_tail(out);
+}
+
+int main()
+{
+ // The category tables
+ {
+ std::ofstream out("category_table.hpp");
+ ucd_table_builder<uint16_t, 256> builder;
+ builder.collect("UnicodeData.txt", 2);
+ builder.collect("DerivedCoreProperties.txt", 1);
+ builder.collect("PropList.txt", 1);
+ print_file(out, builder, 4, "category");
+ }
+
+ // The script tables
+ {
+ std::ofstream out("script_table.hpp");
+ ucd_table_builder<uint8_t, 256> builder;
+ builder.collect("Scripts.txt", 1);
+ print_file(out, builder, 3, "script");
+ }
+
+ // The lowercase tables
+ {
+ std::ofstream out("lowercase_table.hpp");
+ ucd_table_builder<uint32_t, 256> builder;
+ builder.collect("UnicodeData.txt", 13, false);
+ print_file(out, builder, 6, "lowercase");
+ }
+
+ // The uppercase tables
+ {
+ std::ofstream out("uppercase_table.hpp");
+ ucd_table_builder<uint32_t, 256> builder;
+ builder.collect("UnicodeData.txt", 12, false);
+ print_file(out, builder, 6, "uppercase");
+ }
+
+ return 0;
+}
diff --git a/boost/spirit/home/support/char_encoding/unicode/lowercase_table.hpp b/boost/spirit/home/support/char_encoding/unicode/lowercase_table.hpp
new file mode 100644
index 0000000000..8ccf635ec9
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/lowercase_table.hpp
@@ -0,0 +1,620 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+ AUTOGENERATED. DO NOT EDIT!!!
+==============================================================================*/
+#include <boost/cstdint.hpp>
+
+namespace boost { namespace spirit { namespace ucd { namespace detail
+{
+ static const ::boost::uint8_t lowercase_stage1[] = {
+
+ 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9,
+ 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 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, 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, 13, 14, 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, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15,
+ 6, 6, 6, 6, 16, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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
+ };
+
+ static const ::boost::uint32_t lowercase_stage2[] = {
+
+ // block 0
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 0, 248, 249, 250, 251, 252, 253, 254, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 1
+ 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0,
+ 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 0,
+ 289, 0, 291, 0, 293, 0, 295, 0, 297, 0, 299, 0, 301, 0, 303, 0,
+ 105, 0, 307, 0, 309, 0, 311, 0, 0, 314, 0, 316, 0, 318, 0, 320,
+ 0, 322, 0, 324, 0, 326, 0, 328, 0, 0, 331, 0, 333, 0, 335, 0,
+ 337, 0, 339, 0, 341, 0, 343, 0, 345, 0, 347, 0, 349, 0, 351, 0,
+ 353, 0, 355, 0, 357, 0, 359, 0, 361, 0, 363, 0, 365, 0, 367, 0,
+ 369, 0, 371, 0, 373, 0, 375, 0, 255, 378, 0, 380, 0, 382, 0, 0,
+ 0, 595, 387, 0, 389, 0, 596, 392, 0, 598, 599, 396, 0, 0, 477, 601,
+ 603, 402, 0, 608, 611, 0, 617, 616, 409, 0, 0, 0, 623, 626, 0, 629,
+ 417, 0, 419, 0, 421, 0, 640, 424, 0, 643, 0, 0, 429, 0, 648, 432,
+ 0, 650, 651, 436, 0, 438, 0, 658, 441, 0, 0, 0, 445, 0, 0, 0,
+ 0, 0, 0, 0, 454, 454, 0, 457, 457, 0, 460, 460, 0, 462, 0, 464,
+ 0, 466, 0, 468, 0, 470, 0, 472, 0, 474, 0, 476, 0, 0, 479, 0,
+ 481, 0, 483, 0, 485, 0, 487, 0, 489, 0, 491, 0, 493, 0, 495, 0,
+ 0, 499, 499, 0, 501, 0, 405, 447, 505, 0, 507, 0, 509, 0, 511, 0,
+
+
+ // block 2
+ 513, 0, 515, 0, 517, 0, 519, 0, 521, 0, 523, 0, 525, 0, 527, 0,
+ 529, 0, 531, 0, 533, 0, 535, 0, 537, 0, 539, 0, 541, 0, 543, 0,
+ 414, 0, 547, 0, 549, 0, 551, 0, 553, 0, 555, 0, 557, 0, 559, 0,
+ 561, 0, 563, 0, 0, 0, 0, 0, 0, 0, 11365, 572, 0, 410, 11366, 0,
+ 0, 578, 0, 384, 649, 652, 583, 0, 585, 0, 587, 0, 589, 0, 591, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 3
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 881, 0, 883, 0, 0, 0, 887, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 940, 0, 941, 942, 943, 0, 972, 0, 973, 974,
+ 0, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959,
+ 960, 961, 0, 963, 964, 965, 966, 967, 968, 969, 970, 971, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983,
+ 0, 0, 0, 0, 0, 0, 0, 0, 985, 0, 987, 0, 989, 0, 991, 0,
+ 993, 0, 995, 0, 997, 0, 999, 0, 1001, 0, 1003, 0, 1005, 0, 1007, 0,
+ 0, 0, 0, 0, 952, 0, 0, 1016, 0, 1010, 1019, 0, 0, 891, 892, 893,
+
+
+ // block 4
+ 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119,
+ 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087,
+ 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1121, 0, 1123, 0, 1125, 0, 1127, 0, 1129, 0, 1131, 0, 1133, 0, 1135, 0,
+ 1137, 0, 1139, 0, 1141, 0, 1143, 0, 1145, 0, 1147, 0, 1149, 0, 1151, 0,
+ 1153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1163, 0, 1165, 0, 1167, 0,
+ 1169, 0, 1171, 0, 1173, 0, 1175, 0, 1177, 0, 1179, 0, 1181, 0, 1183, 0,
+ 1185, 0, 1187, 0, 1189, 0, 1191, 0, 1193, 0, 1195, 0, 1197, 0, 1199, 0,
+ 1201, 0, 1203, 0, 1205, 0, 1207, 0, 1209, 0, 1211, 0, 1213, 0, 1215, 0,
+ 1231, 1218, 0, 1220, 0, 1222, 0, 1224, 0, 1226, 0, 1228, 0, 1230, 0, 0,
+ 1233, 0, 1235, 0, 1237, 0, 1239, 0, 1241, 0, 1243, 0, 1245, 0, 1247, 0,
+ 1249, 0, 1251, 0, 1253, 0, 1255, 0, 1257, 0, 1259, 0, 1261, 0, 1263, 0,
+ 1265, 0, 1267, 0, 1269, 0, 1271, 0, 1273, 0, 1275, 0, 1277, 0, 1279, 0,
+
+
+ // block 5
+ 1281, 0, 1283, 0, 1285, 0, 1287, 0, 1289, 0, 1291, 0, 1293, 0, 1295, 0,
+ 1297, 0, 1299, 0, 1301, 0, 1303, 0, 1305, 0, 1307, 0, 1309, 0, 1311, 0,
+ 1313, 0, 1315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391,
+ 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407,
+ 1408, 1409, 1410, 1411, 1412, 1413, 1414, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 6
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 7
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 11520, 11521, 11522, 11523, 11524, 11525, 11526, 11527, 11528, 11529, 11530, 11531, 11532, 11533, 11534, 11535,
+ 11536, 11537, 11538, 11539, 11540, 11541, 11542, 11543, 11544, 11545, 11546, 11547, 11548, 11549, 11550, 11551,
+ 11552, 11553, 11554, 11555, 11556, 11557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 8
+ 7681, 0, 7683, 0, 7685, 0, 7687, 0, 7689, 0, 7691, 0, 7693, 0, 7695, 0,
+ 7697, 0, 7699, 0, 7701, 0, 7703, 0, 7705, 0, 7707, 0, 7709, 0, 7711, 0,
+ 7713, 0, 7715, 0, 7717, 0, 7719, 0, 7721, 0, 7723, 0, 7725, 0, 7727, 0,
+ 7729, 0, 7731, 0, 7733, 0, 7735, 0, 7737, 0, 7739, 0, 7741, 0, 7743, 0,
+ 7745, 0, 7747, 0, 7749, 0, 7751, 0, 7753, 0, 7755, 0, 7757, 0, 7759, 0,
+ 7761, 0, 7763, 0, 7765, 0, 7767, 0, 7769, 0, 7771, 0, 7773, 0, 7775, 0,
+ 7777, 0, 7779, 0, 7781, 0, 7783, 0, 7785, 0, 7787, 0, 7789, 0, 7791, 0,
+ 7793, 0, 7795, 0, 7797, 0, 7799, 0, 7801, 0, 7803, 0, 7805, 0, 7807, 0,
+ 7809, 0, 7811, 0, 7813, 0, 7815, 0, 7817, 0, 7819, 0, 7821, 0, 7823, 0,
+ 7825, 0, 7827, 0, 7829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 0,
+ 7841, 0, 7843, 0, 7845, 0, 7847, 0, 7849, 0, 7851, 0, 7853, 0, 7855, 0,
+ 7857, 0, 7859, 0, 7861, 0, 7863, 0, 7865, 0, 7867, 0, 7869, 0, 7871, 0,
+ 7873, 0, 7875, 0, 7877, 0, 7879, 0, 7881, 0, 7883, 0, 7885, 0, 7887, 0,
+ 7889, 0, 7891, 0, 7893, 0, 7895, 0, 7897, 0, 7899, 0, 7901, 0, 7903, 0,
+ 7905, 0, 7907, 0, 7909, 0, 7911, 0, 7913, 0, 7915, 0, 7917, 0, 7919, 0,
+ 7921, 0, 7923, 0, 7925, 0, 7927, 0, 7929, 0, 7931, 0, 7933, 0, 7935, 0,
+
+
+ // block 9
+ 0, 0, 0, 0, 0, 0, 0, 0, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943,
+ 0, 0, 0, 0, 0, 0, 0, 0, 7952, 7953, 7954, 7955, 7956, 7957, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975,
+ 0, 0, 0, 0, 0, 0, 0, 0, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8000, 8001, 8002, 8003, 8004, 8005, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 8017, 0, 8019, 0, 8021, 0, 8023,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8112, 8113, 8048, 8049, 8115, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8050, 8051, 8052, 8053, 8131, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8144, 8145, 8054, 8055, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8160, 8161, 8058, 8059, 8165, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8056, 8057, 8060, 8061, 8179, 0, 0, 0,
+
+
+ // block 10
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 969, 0, 0, 0, 107, 229, 0, 0, 0, 0,
+ 0, 0, 8526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8560, 8561, 8562, 8563, 8564, 8565, 8566, 8567, 8568, 8569, 8570, 8571, 8572, 8573, 8574, 8575,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 8580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 11
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433,
+ 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9446, 9447, 9448, 9449,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 12
+ 11312, 11313, 11314, 11315, 11316, 11317, 11318, 11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327,
+ 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, 11339, 11340, 11341, 11342, 11343,
+ 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, 11352, 11353, 11354, 11355, 11356, 11357, 11358, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 11361, 0, 619, 7549, 637, 0, 0, 11368, 0, 11370, 0, 11372, 0, 593, 625, 592,
+ 0, 0, 11379, 0, 0, 11382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 11393, 0, 11395, 0, 11397, 0, 11399, 0, 11401, 0, 11403, 0, 11405, 0, 11407, 0,
+ 11409, 0, 11411, 0, 11413, 0, 11415, 0, 11417, 0, 11419, 0, 11421, 0, 11423, 0,
+ 11425, 0, 11427, 0, 11429, 0, 11431, 0, 11433, 0, 11435, 0, 11437, 0, 11439, 0,
+ 11441, 0, 11443, 0, 11445, 0, 11447, 0, 11449, 0, 11451, 0, 11453, 0, 11455, 0,
+ 11457, 0, 11459, 0, 11461, 0, 11463, 0, 11465, 0, 11467, 0, 11469, 0, 11471, 0,
+ 11473, 0, 11475, 0, 11477, 0, 11479, 0, 11481, 0, 11483, 0, 11485, 0, 11487, 0,
+ 11489, 0, 11491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 13
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 42561, 0, 42563, 0, 42565, 0, 42567, 0, 42569, 0, 42571, 0, 42573, 0, 42575, 0,
+ 42577, 0, 42579, 0, 42581, 0, 42583, 0, 42585, 0, 42587, 0, 42589, 0, 42591, 0,
+ 0, 0, 42595, 0, 42597, 0, 42599, 0, 42601, 0, 42603, 0, 42605, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 42625, 0, 42627, 0, 42629, 0, 42631, 0, 42633, 0, 42635, 0, 42637, 0, 42639, 0,
+ 42641, 0, 42643, 0, 42645, 0, 42647, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 14
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 42787, 0, 42789, 0, 42791, 0, 42793, 0, 42795, 0, 42797, 0, 42799, 0,
+ 0, 0, 42803, 0, 42805, 0, 42807, 0, 42809, 0, 42811, 0, 42813, 0, 42815, 0,
+ 42817, 0, 42819, 0, 42821, 0, 42823, 0, 42825, 0, 42827, 0, 42829, 0, 42831, 0,
+ 42833, 0, 42835, 0, 42837, 0, 42839, 0, 42841, 0, 42843, 0, 42845, 0, 42847, 0,
+ 42849, 0, 42851, 0, 42853, 0, 42855, 0, 42857, 0, 42859, 0, 42861, 0, 42863, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 42874, 0, 42876, 0, 7545, 42879, 0,
+ 42881, 0, 42883, 0, 42885, 0, 42887, 0, 0, 0, 0, 42892, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 15
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, 65359,
+ 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 16
+ 66600, 66601, 66602, 66603, 66604, 66605, 66606, 66607, 66608, 66609, 66610, 66611, 66612, 66613, 66614, 66615,
+ 66616, 66617, 66618, 66619, 66620, 66621, 66622, 66623, 66624, 66625, 66626, 66627, 66628, 66629, 66630, 66631,
+ 66632, 66633, 66634, 66635, 66636, 66637, 66638, 66639, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+
+ inline ::boost::uint32_t lowercase_lookup(::boost::uint32_t ch)
+ {
+ ::boost::uint32_t block_offset = lowercase_stage1[ch / 256] * 256;
+ return lowercase_stage2[block_offset + ch % 256];
+ }
+
+}}}} // namespace boost::spirit::unicode::detail
diff --git a/boost/spirit/home/support/char_encoding/unicode/query.hpp b/boost/spirit/home/support/char_encoding/unicode/query.hpp
new file mode 100644
index 0000000000..3a0526cd75
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/query.hpp
@@ -0,0 +1,305 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+ Autogenerated by MultiStageTable.py (Unicode multi-stage
+ table builder) (c) Peter Kankowski, 2008
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_UNICODE_QUERY_FEBRUARY_2_2010)
+#define BOOST_SPIRIT_UNICODE_QUERY_FEBRUARY_2_2010
+
+#include <boost/cstdint.hpp>
+
+# include "category_table.hpp"
+# include "script_table.hpp"
+# include "lowercase_table.hpp"
+# include "uppercase_table.hpp"
+
+namespace boost { namespace spirit { namespace ucd
+{
+ // This header provides Basic (Level 1) Unicode Support
+ // See http://unicode.org/reports/tr18/ for details
+
+ struct properties
+ {
+ // bit pattern: xxMMMCCC
+ // MMM: major_category
+ // CCC: category
+
+ enum major_category
+ {
+ letter,
+ mark,
+ number,
+ separator,
+ other,
+ punctuation,
+ symbol
+ };
+
+ enum category
+ {
+ uppercase_letter = 0, // [Lu] an uppercase letter
+ lowercase_letter, // [Ll] a lowercase letter
+ titlecase_letter, // [Lt] a digraphic character, with first part uppercase
+ modifier_letter, // [Lm] a modifier letter
+ other_letter, // [Lo] other letters, including syllables and ideographs
+
+ nonspacing_mark = 8, // [Mn] a nonspacing combining mark (zero advance width)
+ enclosing_mark, // [Me] an enclosing combining mark
+ spacing_mark, // [Mc] a spacing combining mark (positive advance width)
+
+ decimal_number = 16, // [Nd] a decimal digit
+ letter_number, // [Nl] a letterlike numeric character
+ other_number, // [No] a numeric character of other type
+
+ space_separator = 24, // [Zs] a space character (of various non-zero widths)
+ line_separator, // [Zl] U+2028 LINE SEPARATOR only
+ paragraph_separator, // [Zp] U+2029 PARAGRAPH SEPARATOR only
+
+ control = 32, // [Cc] a C0 or C1 control code
+ format, // [Cf] a format control character
+ private_use, // [Co] a private-use character
+ surrogate, // [Cs] a surrogate code point
+ unassigned, // [Cn] a reserved unassigned code point or a noncharacter
+
+ dash_punctuation = 40, // [Pd] a dash or hyphen punctuation mark
+ open_punctuation, // [Ps] an opening punctuation mark (of a pair)
+ close_punctuation, // [Pe] a closing punctuation mark (of a pair)
+ connector_punctuation, // [Pc] a connecting punctuation mark, like a tie
+ other_punctuation, // [Po] a punctuation mark of other type
+ initial_punctuation, // [Pi] an initial quotation mark
+ final_punctuation, // [Pf] a final quotation mark
+
+ math_symbol = 48, // [Sm] a symbol of primarily mathematical use
+ currency_symbol, // [Sc] a currency sign
+ modifier_symbol, // [Sk] a non-letterlike modifier symbol
+ other_symbol // [So] a symbol of other type
+ };
+
+ enum derived_properties
+ {
+ alphabetic = 64,
+ uppercase = 128,
+ lowercase = 256,
+ white_space = 512,
+ hex_digit = 1024,
+ noncharacter_code_point = 2048,
+ default_ignorable_code_point = 4096
+ };
+
+ enum script
+ {
+ arabic = 0,
+ imperial_aramaic = 1,
+ armenian = 2,
+ avestan = 3,
+ balinese = 4,
+ bamum = 5,
+ bengali = 6,
+ bopomofo = 7,
+ braille = 8,
+ buginese = 9,
+ buhid = 10,
+ canadian_aboriginal = 11,
+ carian = 12,
+ cham = 13,
+ cherokee = 14,
+ coptic = 15,
+ cypriot = 16,
+ cyrillic = 17,
+ devanagari = 18,
+ deseret = 19,
+ egyptian_hieroglyphs = 20,
+ ethiopic = 21,
+ georgian = 22,
+ glagolitic = 23,
+ gothic = 24,
+ greek = 25,
+ gujarati = 26,
+ gurmukhi = 27,
+ hangul = 28,
+ han = 29,
+ hanunoo = 30,
+ hebrew = 31,
+ hiragana = 32,
+ katakana_or_hiragana = 33,
+ old_italic = 34,
+ javanese = 35,
+ kayah_li = 36,
+ katakana = 37,
+ kharoshthi = 38,
+ khmer = 39,
+ kannada = 40,
+ kaithi = 41,
+ tai_tham = 42,
+ lao = 43,
+ latin = 44,
+ lepcha = 45,
+ limbu = 46,
+ linear_b = 47,
+ lisu = 48,
+ lycian = 49,
+ lydian = 50,
+ malayalam = 51,
+ mongolian = 52,
+ meetei_mayek = 53,
+ myanmar = 54,
+ nko = 55,
+ ogham = 56,
+ ol_chiki = 57,
+ old_turkic = 58,
+ oriya = 59,
+ osmanya = 60,
+ phags_pa = 61,
+ inscriptional_pahlavi = 62,
+ phoenician = 63,
+ inscriptional_parthian = 64,
+ rejang = 65,
+ runic = 66,
+ samaritan = 67,
+ old_south_arabian = 68,
+ saurashtra = 69,
+ shavian = 70,
+ sinhala = 71,
+ sundanese = 72,
+ syloti_nagri = 73,
+ syriac = 74,
+ tagbanwa = 75,
+ tai_le = 76,
+ new_tai_lue = 77,
+ tamil = 78,
+ tai_viet = 79,
+ telugu = 80,
+ tifinagh = 81,
+ tagalog = 82,
+ thaana = 83,
+ thai = 84,
+ tibetan = 85,
+ ugaritic = 86,
+ vai = 87,
+ old_persian = 88,
+ cuneiform = 89,
+ yi = 90,
+ inherited = 91,
+ common = 92,
+ unknown = 93
+ };
+ };
+
+ inline properties::category get_category(::boost::uint32_t ch)
+ {
+ return static_cast<properties::category>(detail::category_lookup(ch) & 0x3F);
+ }
+
+ inline properties::major_category get_major_category(::boost::uint32_t ch)
+ {
+ return static_cast<properties::major_category>(get_category(ch) >> 3);
+ }
+
+ inline bool is_punctuation(::boost::uint32_t ch)
+ {
+ return get_major_category(ch) == properties::punctuation;
+ }
+
+ inline bool is_decimal_number(::boost::uint32_t ch)
+ {
+ return get_category(ch) == properties::decimal_number;
+ }
+
+ inline bool is_hex_digit(::boost::uint32_t ch)
+ {
+ return (detail::category_lookup(ch) & properties::hex_digit) != 0;
+ }
+
+ inline bool is_control(::boost::uint32_t ch)
+ {
+ return get_category(ch) == properties::control;
+ }
+
+ inline bool is_alphabetic(::boost::uint32_t ch)
+ {
+ return (detail::category_lookup(ch) & properties::alphabetic) != 0;
+ }
+
+ inline bool is_alphanumeric(::boost::uint32_t ch)
+ {
+ return is_decimal_number(ch) || is_alphabetic(ch);
+ }
+
+ inline bool is_uppercase(::boost::uint32_t ch)
+ {
+ return (detail::category_lookup(ch) & properties::uppercase) != 0;
+ }
+
+ inline bool is_lowercase(::boost::uint32_t ch)
+ {
+ return (detail::category_lookup(ch) & properties::lowercase) != 0;
+ }
+
+ inline bool is_white_space(::boost::uint32_t ch)
+ {
+ return (detail::category_lookup(ch) & properties::white_space) != 0;
+ }
+
+ inline bool is_blank(::boost::uint32_t ch)
+ {
+ switch (ch)
+ {
+ case '\n': case '\v': case '\f': case '\r':
+ return false;
+ default:
+ return is_white_space(ch)
+ && !( get_category(ch) == properties::line_separator
+ || get_category(ch) == properties::paragraph_separator
+ );
+ }
+ }
+
+ inline bool is_graph(::boost::uint32_t ch)
+ {
+ return !( is_white_space(ch)
+ || get_category(ch) == properties::control
+ || get_category(ch) == properties::surrogate
+ || get_category(ch) == properties::unassigned
+ );
+ }
+
+ inline bool is_print(::boost::uint32_t ch)
+ {
+ return (is_graph(ch) || is_blank(ch)) && !is_control(ch);
+ }
+
+ inline bool is_noncharacter_code_point(::boost::uint32_t ch)
+ {
+ return (detail::category_lookup(ch) & properties::noncharacter_code_point) != 0;
+ }
+
+ inline bool is_default_ignorable_code_point(::boost::uint32_t ch)
+ {
+ return (detail::category_lookup(ch) & properties::default_ignorable_code_point) != 0;
+ }
+
+ inline properties::script get_script(::boost::uint32_t ch)
+ {
+ return static_cast<properties::script>(detail::script_lookup(ch) & 0x3F);
+ }
+
+ inline ::boost::uint32_t to_lowercase(::boost::uint32_t ch)
+ {
+ // The table returns 0 to signal that this code maps to itself
+ ::boost::uint32_t r = detail::lowercase_lookup(ch);
+ return (r == 0)? ch : r;
+ }
+
+ inline ::boost::uint32_t to_uppercase(::boost::uint32_t ch)
+ {
+ // The table returns 0 to signal that this code maps to itself
+ ::boost::uint32_t r = detail::uppercase_lookup(ch);
+ return (r == 0)? ch : r;
+ }
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/char_encoding/unicode/script_table.hpp b/boost/spirit/home/support/char_encoding/unicode/script_table.hpp
new file mode 100644
index 0000000000..a4c117c3ee
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/script_table.hpp
@@ -0,0 +1,2159 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+ AUTOGENERATED. DO NOT EDIT!!!
+==============================================================================*/
+#include <boost/cstdint.hpp>
+
+namespace boost { namespace spirit { namespace ucd { namespace detail
+{
+ static const ::boost::uint8_t script_stage1[] = {
+
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 1, 29,
+ 30, 31, 32, 33, 34, 32, 35, 36, 37, 32, 32, 38, 39, 40, 41, 42,
+ 43, 44, 45, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 49,
+ 50, 50, 50, 50, 51, 52, 53, 54, 55, 56, 57, 58, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 59, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 47, 61, 62, 60, 63, 64, 65,
+ 66, 67, 68, 69, 70, 60, 60, 60, 71, 72, 73, 74, 75, 60, 60, 60,
+ 76, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 77, 77, 77, 78, 79, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 80, 80, 80, 80, 81, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 82, 83, 84, 85, 86, 87, 88, 89, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 90, 91, 92, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 93, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 94, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 47, 47, 95, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 96, 97, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60
+ };
+
+ static const ::boost::uint8_t script_stage2[] = {
+
+ // block 0
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 92, 92, 92, 92, 92,
+ 92, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 44, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 44, 92, 92, 92, 92, 92,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 92, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 92, 44, 44, 44, 44, 44, 44, 44, 44,
+
+
+ // block 1
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+
+
+ // block 2
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 44, 44, 44, 44, 44, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 3
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 25, 25, 25, 25, 92, 25, 25, 25, 0, 0, 25, 25, 25, 25, 92, 0,
+ 0, 0, 0, 0, 25, 92, 25, 92, 25, 25, 25, 0, 25, 0, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+
+
+ // block 4
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 91, 91, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+
+
+ // block 5
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 0, 92, 2, 0, 0, 0, 0, 0,
+ 0, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, 0,
+ 31, 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 6
+ 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 92,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0,
+ 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 7
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 0, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 0, 0, 74, 74, 74,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0,
+
+
+ // block 8
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 9
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0,
+ 18, 91, 91, 18, 18, 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 92, 92, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 92, 18, 18, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18,
+ 0, 6, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6,
+ 6, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 6,
+ 6, 0, 6, 0, 0, 0, 6, 6, 6, 6, 0, 0, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 0, 0, 6, 6, 0, 0, 6, 6, 6, 6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0, 6,
+ 6, 6, 6, 6, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0,
+
+
+ // block 10
+ 0, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 27,
+ 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27,
+ 27, 0, 27, 27, 0, 27, 27, 0, 27, 27, 0, 0, 27, 0, 27, 27,
+ 27, 27, 27, 0, 0, 0, 0, 27, 27, 0, 0, 27, 27, 27, 0, 0,
+ 0, 27, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 0, 27, 0,
+ 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26,
+ 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26,
+ 26, 0, 26, 26, 0, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 0, 26, 26, 26, 0, 0,
+ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 11
+ 0, 59, 59, 59, 0, 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, 59,
+ 59, 0, 0, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 0, 59, 59, 59, 59, 59, 59,
+ 59, 0, 59, 59, 0, 59, 59, 59, 59, 59, 0, 0, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 0, 0, 59, 59, 0, 0, 59, 59, 59, 0, 0,
+ 0, 0, 0, 0, 0, 0, 59, 59, 0, 0, 0, 0, 59, 59, 0, 59,
+ 59, 59, 59, 59, 0, 0, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 78, 78, 0, 78, 78, 78, 78, 78, 78, 0, 0, 0, 78, 78,
+ 78, 0, 78, 78, 78, 78, 0, 0, 0, 78, 78, 0, 78, 0, 78, 78,
+ 0, 0, 0, 78, 78, 0, 0, 0, 78, 78, 78, 0, 0, 0, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 78, 78,
+ 78, 78, 78, 0, 0, 0, 78, 78, 78, 0, 78, 78, 78, 78, 0, 0,
+ 78, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0,
+
+
+ // block 12
+ 0, 80, 80, 80, 0, 80, 80, 80, 80, 80, 80, 80, 80, 0, 80, 80,
+ 80, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 0, 80, 80, 80, 80, 80, 0, 0, 0, 80, 80, 80,
+ 80, 80, 80, 80, 80, 0, 80, 80, 80, 0, 80, 80, 80, 80, 0, 0,
+ 0, 0, 0, 0, 0, 80, 80, 0, 80, 80, 0, 0, 0, 0, 0, 0,
+ 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80,
+ 0, 0, 40, 40, 0, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40,
+ 40, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 0, 40, 40, 40, 40, 40, 0, 0, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 0, 40, 40, 40, 0, 40, 40, 40, 40, 0, 0,
+ 0, 0, 0, 0, 0, 40, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0,
+ 40, 40, 40, 40, 0, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 0, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 13
+ 0, 0, 51, 51, 0, 51, 51, 51, 51, 51, 51, 51, 51, 0, 51, 51,
+ 51, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51,
+ 51, 51, 51, 51, 51, 0, 51, 51, 51, 0, 51, 51, 51, 51, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51, 51, 51, 51, 0, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, 51, 51, 51, 51,
+ 0, 0, 71, 71, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 71, 0, 0,
+ 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 71, 0, 0, 0, 0, 71,
+ 71, 71, 71, 71, 71, 0, 71, 0, 71, 71, 71, 71, 71, 71, 71, 71,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 14
+ 0, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0, 92,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 43, 43, 0, 43, 0, 0, 43, 43, 0, 43, 0, 0, 43, 0, 0,
+ 0, 0, 0, 0, 43, 43, 43, 43, 0, 43, 43, 43, 43, 43, 43, 43,
+ 0, 43, 43, 43, 0, 43, 0, 43, 0, 0, 43, 43, 0, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 43, 43, 43, 0, 0,
+ 43, 43, 43, 43, 43, 0, 43, 0, 43, 43, 43, 43, 43, 43, 0, 0,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 43, 43, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 15
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 0, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0,
+ 0, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, 0,
+ 85, 85, 85, 85, 85, 85, 85, 85, 0, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 85, 85,
+ 85, 85, 85, 85, 85, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 16
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 92, 22, 0, 0, 0,
+
+
+ // block 17
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+
+
+ // block 18
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 0, 0,
+ 21, 21, 21, 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 0, 0,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 0, 0,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 0, 21, 21, 21, 21, 0, 0, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 0, 21, 21, 21, 21, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+
+
+ // block 19
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 0, 21, 21, 21, 21, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 20
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+
+
+ // block 21
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 92, 92, 92, 66, 66,
+ 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 22
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 82, 82,
+ 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 0, 75, 75,
+ 75, 0, 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, 0, 0,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, 0, 0,
+
+
+ // block 23
+ 52, 52, 92, 92, 52, 92, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 0, 0, 0, 0, 0,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 0, 0, 0, 0, 0, 0, 0, 0,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 0, 0, 0, 0,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 24
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0,
+ 46, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0,
+ 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 0, 0,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 0, 0, 0, 0,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 0, 77, 77,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+
+
+ // block 25
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 26
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, 0, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 27
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 45, 45, 45,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 91, 91, 91, 92, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 92, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 91, 92, 92,
+ 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 28
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 25, 25, 25, 25, 25, 17, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 25, 25, 25,
+ 25, 25, 44, 44, 44, 44, 25, 25, 25, 25, 25, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 17, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 25,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 91,
+
+
+ // block 29
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 25, 25, 25, 0, 0,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 25, 25, 25, 0, 0,
+ 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 25, 0, 25, 0, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 0, 0, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 0, 0, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0,
+
+
+ // block 30
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 91, 91, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92,
+ 92, 44, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 44,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0,
+ 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 31
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 25, 92, 92, 92, 44, 44, 92, 92, 92, 92,
+ 92, 92, 44, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 44, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 92, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 32
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 33
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 34
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 35
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 0, 92, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 36
+ 0, 92, 92, 92, 92, 0, 92, 92, 92, 92, 0, 0, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 92, 0, 92,
+ 92, 92, 92, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0,
+ 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 92, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 37
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+
+
+ // block 38
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 39
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15,
+
+
+ // block 40
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+
+
+ // block 41
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 42
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0,
+
+
+ // block 43
+ 92, 92, 92, 92, 92, 29, 92, 29, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 29, 29, 29, 29, 29, 29, 29, 29, 29, 91, 91, 91, 91, 91, 91,
+ 92, 92, 92, 92, 92, 92, 92, 92, 29, 29, 29, 29, 92, 92, 92, 92,
+ 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 0, 0, 91, 91, 92, 92, 32, 32, 32,
+ 92, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 92, 92, 37, 37, 37,
+
+
+ // block 44
+ 0, 0, 0, 0, 0, 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, 0, 0,
+ 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+
+
+ // block 45
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+
+
+ // block 46
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 47
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+
+
+ // block 48
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 49
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 50
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+
+
+ // block 51
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 0, 0,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+
+
+ // block 52
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+
+
+ // block 53
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,
+ 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,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 54
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 92, 92, 92, 44, 44, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44,
+
+
+ // block 55
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, 0, 0, 0, 0,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0,
+
+
+ // block 56
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 35, 35,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 57
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 58
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0,
+
+
+ // block 59
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0,
+
+
+ // block 60
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 61
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 62
+ 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 0, 31, 31, 31, 31, 31, 0, 31, 0,
+ 31, 31, 0, 31, 31, 0, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 63
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0,
+
+
+ // block 64
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0,
+ 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92,
+
+
+ // block 65
+ 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 92, 92, 92, 92, 92,
+ 92, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 92, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 92, 92,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0,
+ 0, 0, 28, 28, 28, 28, 28, 28, 0, 0, 28, 28, 28, 28, 28, 28,
+ 0, 0, 28, 28, 28, 28, 28, 28, 0, 0, 28, 28, 28, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 0, 0,
+
+
+ // block 66
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 0, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0,
+
+
+ // block 67
+ 92, 92, 92, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 91, 0, 0,
+
+
+ // block 68
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 0, 0, 0,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 69
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0,
+ 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 0, 86,
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 0, 0, 0, 0, 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 70
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 0, 0,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 71
+ 16, 16, 16, 16, 16, 16, 0, 0, 16, 0, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 0, 16, 16, 0, 0, 0, 16, 0, 0, 16,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 72
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 63,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 50,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 73
+ 38, 38, 38, 38, 0, 38, 38, 0, 0, 0, 0, 0, 38, 38, 38, 38,
+ 38, 38, 38, 38, 0, 38, 38, 38, 0, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 0, 0, 0, 0, 38, 38, 38, 0, 0, 0, 0, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 0, 0, 0, 0, 0, 0, 0, 0,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 0, 0, 0, 0, 0, 0, 0,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 74
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 0, 0, 0, 0, 0, 62, 62, 62, 62, 62, 62, 62, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 75
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 76
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 77
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+
+
+ // block 78
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 79
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 89, 89, 89, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 80
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+
+
+ // block 81
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 82
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 83
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 0, 0, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 91, 91, 91, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 91, 91, 91, 91, 91,
+ 91, 91, 91, 92, 92, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 91, 91, 91, 91, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 84
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 85
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 86
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 92, 92,
+ 0, 0, 92, 0, 0, 92, 92, 0, 0, 92, 92, 92, 92, 0, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 92, 0, 92, 92, 92,
+ 92, 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 87
+ 92, 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 0, 0, 92, 92, 92,
+ 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 0, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 0,
+ 92, 92, 92, 92, 92, 0, 92, 0, 0, 0, 92, 92, 92, 92, 92, 92,
+ 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 88
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 89
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+
+
+ // block 90
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 91
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0,
+ 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 92,
+ 0, 0, 92, 0, 0, 0, 92, 0, 0, 0, 92, 92, 92, 92, 92, 0,
+ 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 92,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 92, 92, 0, 0, 92,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 0, 0,
+ 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 92
+ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 93
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 94
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 95
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 96
+ 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 97
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+
+ inline ::boost::uint8_t script_lookup(::boost::uint32_t ch)
+ {
+ ::boost::uint32_t block_offset = script_stage1[ch / 256] * 256;
+ return script_stage2[block_offset + ch % 256];
+ }
+
+}}}} // namespace boost::spirit::unicode::detail
diff --git a/boost/spirit/home/support/char_encoding/unicode/uppercase_table.hpp b/boost/spirit/home/support/char_encoding/unicode/uppercase_table.hpp
new file mode 100644
index 0000000000..5ecae7c5c7
--- /dev/null
+++ b/boost/spirit/home/support/char_encoding/unicode/uppercase_table.hpp
@@ -0,0 +1,639 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+ AUTOGENERATED. DO NOT EDIT!!!
+==============================================================================*/
+#include <boost/cstdint.hpp>
+
+namespace boost { namespace spirit { namespace ucd { namespace detail
+{
+ static const ::boost::uint8_t uppercase_stage1[] = {
+
+ 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9,
+ 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 13, 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, 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, 14, 15, 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, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 16,
+ 6, 6, 6, 6, 17, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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
+ };
+
+ static const ::boost::uint32_t uppercase_stage2[] = {
+
+ // block 0
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
+ 208, 209, 210, 211, 212, 213, 214, 0, 216, 217, 218, 219, 220, 221, 222, 376,
+
+
+ // block 1
+ 0, 256, 0, 258, 0, 260, 0, 262, 0, 264, 0, 266, 0, 268, 0, 270,
+ 0, 272, 0, 274, 0, 276, 0, 278, 0, 280, 0, 282, 0, 284, 0, 286,
+ 0, 288, 0, 290, 0, 292, 0, 294, 0, 296, 0, 298, 0, 300, 0, 302,
+ 0, 73, 0, 306, 0, 308, 0, 310, 0, 0, 313, 0, 315, 0, 317, 0,
+ 319, 0, 321, 0, 323, 0, 325, 0, 327, 0, 0, 330, 0, 332, 0, 334,
+ 0, 336, 0, 338, 0, 340, 0, 342, 0, 344, 0, 346, 0, 348, 0, 350,
+ 0, 352, 0, 354, 0, 356, 0, 358, 0, 360, 0, 362, 0, 364, 0, 366,
+ 0, 368, 0, 370, 0, 372, 0, 374, 0, 0, 377, 0, 379, 0, 381, 83,
+ 579, 0, 0, 386, 0, 388, 0, 0, 391, 0, 0, 0, 395, 0, 0, 0,
+ 0, 0, 401, 0, 0, 502, 0, 0, 0, 408, 573, 0, 0, 0, 544, 0,
+ 0, 416, 0, 418, 0, 420, 0, 0, 423, 0, 0, 0, 0, 428, 0, 0,
+ 431, 0, 0, 0, 435, 0, 437, 0, 0, 440, 0, 0, 0, 444, 0, 503,
+ 0, 0, 0, 0, 0, 452, 452, 0, 455, 455, 0, 458, 458, 0, 461, 0,
+ 463, 0, 465, 0, 467, 0, 469, 0, 471, 0, 473, 0, 475, 398, 0, 478,
+ 0, 480, 0, 482, 0, 484, 0, 486, 0, 488, 0, 490, 0, 492, 0, 494,
+ 0, 0, 497, 497, 0, 500, 0, 0, 0, 504, 0, 506, 0, 508, 0, 510,
+
+
+ // block 2
+ 0, 512, 0, 514, 0, 516, 0, 518, 0, 520, 0, 522, 0, 524, 0, 526,
+ 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 0, 540, 0, 542,
+ 0, 0, 0, 546, 0, 548, 0, 550, 0, 552, 0, 554, 0, 556, 0, 558,
+ 0, 560, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0,
+ 0, 0, 577, 0, 0, 0, 0, 582, 0, 584, 0, 586, 0, 588, 0, 590,
+ 11375, 11373, 0, 385, 390, 0, 393, 394, 0, 399, 0, 400, 0, 0, 0, 0,
+ 403, 0, 0, 404, 0, 0, 0, 0, 407, 406, 0, 11362, 0, 0, 0, 412,
+ 0, 11374, 413, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 11364, 0, 0,
+ 422, 0, 0, 425, 0, 0, 0, 0, 430, 580, 433, 434, 581, 0, 0, 0,
+ 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 3
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 880, 0, 882, 0, 0, 0, 886, 0, 0, 0, 1021, 1022, 1023, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 902, 904, 905, 906,
+ 0, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927,
+ 928, 929, 931, 931, 932, 933, 934, 935, 936, 937, 938, 939, 908, 910, 911, 0,
+ 914, 920, 0, 0, 0, 934, 928, 975, 0, 984, 0, 986, 0, 988, 0, 990,
+ 0, 992, 0, 994, 0, 996, 0, 998, 0, 1000, 0, 1002, 0, 1004, 0, 1006,
+ 922, 929, 1017, 0, 0, 917, 0, 0, 1015, 0, 0, 1018, 0, 0, 0, 0,
+
+
+ // block 4
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055,
+ 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071,
+ 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
+ 0, 1120, 0, 1122, 0, 1124, 0, 1126, 0, 1128, 0, 1130, 0, 1132, 0, 1134,
+ 0, 1136, 0, 1138, 0, 1140, 0, 1142, 0, 1144, 0, 1146, 0, 1148, 0, 1150,
+ 0, 1152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1162, 0, 1164, 0, 1166,
+ 0, 1168, 0, 1170, 0, 1172, 0, 1174, 0, 1176, 0, 1178, 0, 1180, 0, 1182,
+ 0, 1184, 0, 1186, 0, 1188, 0, 1190, 0, 1192, 0, 1194, 0, 1196, 0, 1198,
+ 0, 1200, 0, 1202, 0, 1204, 0, 1206, 0, 1208, 0, 1210, 0, 1212, 0, 1214,
+ 0, 0, 1217, 0, 1219, 0, 1221, 0, 1223, 0, 1225, 0, 1227, 0, 1229, 1216,
+ 0, 1232, 0, 1234, 0, 1236, 0, 1238, 0, 1240, 0, 1242, 0, 1244, 0, 1246,
+ 0, 1248, 0, 1250, 0, 1252, 0, 1254, 0, 1256, 0, 1258, 0, 1260, 0, 1262,
+ 0, 1264, 0, 1266, 0, 1268, 0, 1270, 0, 1272, 0, 1274, 0, 1276, 0, 1278,
+
+
+ // block 5
+ 0, 1280, 0, 1282, 0, 1284, 0, 1286, 0, 1288, 0, 1290, 0, 1292, 0, 1294,
+ 0, 1296, 0, 1298, 0, 1300, 0, 1302, 0, 1304, 0, 1306, 0, 1308, 0, 1310,
+ 0, 1312, 0, 1314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343,
+ 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359,
+ 1360, 1361, 1362, 1363, 1364, 1365, 1366, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 6
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 7
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 42877, 0, 0, 0, 11363, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 8
+ 0, 7680, 0, 7682, 0, 7684, 0, 7686, 0, 7688, 0, 7690, 0, 7692, 0, 7694,
+ 0, 7696, 0, 7698, 0, 7700, 0, 7702, 0, 7704, 0, 7706, 0, 7708, 0, 7710,
+ 0, 7712, 0, 7714, 0, 7716, 0, 7718, 0, 7720, 0, 7722, 0, 7724, 0, 7726,
+ 0, 7728, 0, 7730, 0, 7732, 0, 7734, 0, 7736, 0, 7738, 0, 7740, 0, 7742,
+ 0, 7744, 0, 7746, 0, 7748, 0, 7750, 0, 7752, 0, 7754, 0, 7756, 0, 7758,
+ 0, 7760, 0, 7762, 0, 7764, 0, 7766, 0, 7768, 0, 7770, 0, 7772, 0, 7774,
+ 0, 7776, 0, 7778, 0, 7780, 0, 7782, 0, 7784, 0, 7786, 0, 7788, 0, 7790,
+ 0, 7792, 0, 7794, 0, 7796, 0, 7798, 0, 7800, 0, 7802, 0, 7804, 0, 7806,
+ 0, 7808, 0, 7810, 0, 7812, 0, 7814, 0, 7816, 0, 7818, 0, 7820, 0, 7822,
+ 0, 7824, 0, 7826, 0, 7828, 0, 0, 0, 0, 0, 7776, 0, 0, 0, 0,
+ 0, 7840, 0, 7842, 0, 7844, 0, 7846, 0, 7848, 0, 7850, 0, 7852, 0, 7854,
+ 0, 7856, 0, 7858, 0, 7860, 0, 7862, 0, 7864, 0, 7866, 0, 7868, 0, 7870,
+ 0, 7872, 0, 7874, 0, 7876, 0, 7878, 0, 7880, 0, 7882, 0, 7884, 0, 7886,
+ 0, 7888, 0, 7890, 0, 7892, 0, 7894, 0, 7896, 0, 7898, 0, 7900, 0, 7902,
+ 0, 7904, 0, 7906, 0, 7908, 0, 7910, 0, 7912, 0, 7914, 0, 7916, 0, 7918,
+ 0, 7920, 0, 7922, 0, 7924, 0, 7926, 0, 7928, 0, 7930, 0, 7932, 0, 7934,
+
+
+ // block 9
+ 7944, 7945, 7946, 7947, 7948, 7949, 7950, 7951, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7960, 7961, 7962, 7963, 7964, 7965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7976, 7977, 7978, 7979, 7980, 7981, 7982, 7983, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7992, 7993, 7994, 7995, 7996, 7997, 7998, 7999, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8008, 8009, 8010, 8011, 8012, 8013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8025, 0, 8027, 0, 8029, 0, 8031, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8047, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8122, 8123, 8136, 8137, 8138, 8139, 8154, 8155, 8184, 8185, 8170, 8171, 8186, 8187, 0, 0,
+ 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8120, 8121, 0, 8124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 921, 0,
+ 0, 0, 0, 8140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8152, 8153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8168, 8169, 0, 0, 0, 8172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 8188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 10
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8498, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 8556, 8557, 8558, 8559,
+ 0, 0, 0, 0, 8579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 11
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9398, 9399, 9400, 9401, 9402, 9403, 9404, 9405, 9406, 9407, 9408, 9409, 9410, 9411, 9412, 9413,
+ 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, 9422, 9423, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 12
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 11264, 11265, 11266, 11267, 11268, 11269, 11270, 11271, 11272, 11273, 11274, 11275, 11276, 11277, 11278, 11279,
+ 11280, 11281, 11282, 11283, 11284, 11285, 11286, 11287, 11288, 11289, 11290, 11291, 11292, 11293, 11294, 11295,
+ 11296, 11297, 11298, 11299, 11300, 11301, 11302, 11303, 11304, 11305, 11306, 11307, 11308, 11309, 11310, 0,
+ 0, 11360, 0, 0, 0, 570, 574, 0, 11367, 0, 11369, 0, 11371, 0, 0, 0,
+ 0, 0, 0, 11378, 0, 0, 11381, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 11392, 0, 11394, 0, 11396, 0, 11398, 0, 11400, 0, 11402, 0, 11404, 0, 11406,
+ 0, 11408, 0, 11410, 0, 11412, 0, 11414, 0, 11416, 0, 11418, 0, 11420, 0, 11422,
+ 0, 11424, 0, 11426, 0, 11428, 0, 11430, 0, 11432, 0, 11434, 0, 11436, 0, 11438,
+ 0, 11440, 0, 11442, 0, 11444, 0, 11446, 0, 11448, 0, 11450, 0, 11452, 0, 11454,
+ 0, 11456, 0, 11458, 0, 11460, 0, 11462, 0, 11464, 0, 11466, 0, 11468, 0, 11470,
+ 0, 11472, 0, 11474, 0, 11476, 0, 11478, 0, 11480, 0, 11482, 0, 11484, 0, 11486,
+ 0, 11488, 0, 11490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 13
+ 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271,
+ 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287,
+ 4288, 4289, 4290, 4291, 4292, 4293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 14
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 42560, 0, 42562, 0, 42564, 0, 42566, 0, 42568, 0, 42570, 0, 42572, 0, 42574,
+ 0, 42576, 0, 42578, 0, 42580, 0, 42582, 0, 42584, 0, 42586, 0, 42588, 0, 42590,
+ 0, 0, 0, 42594, 0, 42596, 0, 42598, 0, 42600, 0, 42602, 0, 42604, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 42624, 0, 42626, 0, 42628, 0, 42630, 0, 42632, 0, 42634, 0, 42636, 0, 42638,
+ 0, 42640, 0, 42642, 0, 42644, 0, 42646, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 15
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 42786, 0, 42788, 0, 42790, 0, 42792, 0, 42794, 0, 42796, 0, 42798,
+ 0, 0, 0, 42802, 0, 42804, 0, 42806, 0, 42808, 0, 42810, 0, 42812, 0, 42814,
+ 0, 42816, 0, 42818, 0, 42820, 0, 42822, 0, 42824, 0, 42826, 0, 42828, 0, 42830,
+ 0, 42832, 0, 42834, 0, 42836, 0, 42838, 0, 42840, 0, 42842, 0, 42844, 0, 42846,
+ 0, 42848, 0, 42850, 0, 42852, 0, 42854, 0, 42856, 0, 42858, 0, 42860, 0, 42862,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42873, 0, 42875, 0, 0, 42878,
+ 0, 42880, 0, 42882, 0, 42884, 0, 42886, 0, 0, 0, 0, 42891, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 16
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, 65325, 65326, 65327,
+ 65328, 65329, 65330, 65331, 65332, 65333, 65334, 65335, 65336, 65337, 65338, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+ // block 17
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66560, 66561, 66562, 66563, 66564, 66565, 66566, 66567,
+ 66568, 66569, 66570, 66571, 66572, 66573, 66574, 66575, 66576, 66577, 66578, 66579, 66580, 66581, 66582, 66583,
+ 66584, 66585, 66586, 66587, 66588, 66589, 66590, 66591, 66592, 66593, 66594, 66595, 66596, 66597, 66598, 66599,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+
+ inline ::boost::uint32_t uppercase_lookup(::boost::uint32_t ch)
+ {
+ ::boost::uint32_t block_offset = uppercase_stage1[ch / 256] * 256;
+ return uppercase_stage2[block_offset + ch % 256];
+ }
+
+}}}} // namespace boost::spirit::unicode::detail
diff --git a/boost/spirit/home/support/char_set/basic_chset.hpp b/boost/spirit/home/support/char_set/basic_chset.hpp
new file mode 100644
index 0000000000..f716ad03db
--- /dev/null
+++ b/boost/spirit/home/support/char_set/basic_chset.hpp
@@ -0,0 +1,249 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2009 Daniel Nuffer
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_BASIC_CHSET_APRIL_17_2008
+#define BOOST_SPIRIT_BASIC_CHSET_APRIL_17_2008
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#include <bitset>
+#include <climits>
+#include <boost/spirit/home/support/char_set/range_run.hpp>
+
+namespace boost { namespace spirit { namespace support { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // basic_chset: basic character set implementation using range_run
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ struct basic_chset
+ {
+ basic_chset() {}
+ basic_chset(basic_chset const& arg_)
+ : rr(arg_.rr) {}
+
+ bool
+ test(Char v) const
+ {
+ return rr.test(v);
+ }
+
+ void
+ set(Char from, Char to)
+ {
+ rr.set(range<Char>(from, to));
+ }
+
+ void
+ set(Char c)
+ {
+ rr.set(range<Char>(c, c));
+ }
+
+ void
+ clear(Char from, Char to)
+ {
+ rr.clear(range<Char>(from, to));
+ }
+
+ void
+ clear(Char c)
+ {
+ rr.clear(range<Char>(c, c));
+ }
+
+ void
+ clear()
+ {
+ rr.clear();
+ }
+
+ void
+ inverse()
+ {
+ basic_chset inv;
+ inv.set(
+ (std::numeric_limits<Char>::min)(),
+ (std::numeric_limits<Char>::max)()
+ );
+ inv -= *this;
+ swap(inv);
+ }
+
+ void
+ swap(basic_chset& x)
+ {
+ rr.swap(x.rr);
+ }
+
+
+ basic_chset&
+ operator|=(basic_chset const& x)
+ {
+ typedef typename range_run<Char>::const_iterator const_iterator;
+ for (const_iterator iter = x.rr.begin(); iter != x.rr.end(); ++iter)
+ rr.set(*iter);
+ return *this;
+ }
+
+ basic_chset&
+ operator&=(basic_chset const& x)
+ {
+ basic_chset inv;
+ inv.set(
+ (std::numeric_limits<Char>::min)(),
+ (std::numeric_limits<Char>::max)()
+ );
+ inv -= x;
+ *this -= inv;
+ return *this;
+ }
+
+ basic_chset&
+ operator-=(basic_chset const& x)
+ {
+ typedef typename range_run<Char>::const_iterator const_iterator;
+ for (const_iterator iter = x.rr.begin(); iter != x.rr.end(); ++iter)
+ rr.clear(*iter);
+ return *this;
+ }
+
+ basic_chset&
+ operator^=(basic_chset const& x)
+ {
+ basic_chset bma = x;
+ bma -= *this;
+ *this -= x;
+ *this |= bma;
+ return *this;
+ }
+
+ private: range_run<Char> rr;
+ };
+
+#if (CHAR_BIT == 8)
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // basic_chset: specializations for 8 bit chars using std::bitset
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ struct basic_chset_8bit
+ {
+ basic_chset_8bit() {}
+ basic_chset_8bit(basic_chset_8bit const& arg_)
+ : bset(arg_.bset) {}
+
+ bool
+ test(Char v) const
+ {
+ return bset.test((unsigned char)v);
+ }
+
+ void
+ set(Char from, Char to)
+ {
+ for (int i = from; i <= to; ++i)
+ bset.set((unsigned char)i);
+ }
+
+ void
+ set(Char c)
+ {
+ bset.set((unsigned char)c);
+ }
+
+ void
+ clear(Char from, Char to)
+ {
+ for (int i = from; i <= to; ++i)
+ bset.reset((unsigned char)i);
+ }
+
+ void
+ clear(Char c)
+ {
+ bset.reset((unsigned char)c);
+ }
+
+ void
+ clear()
+ {
+ bset.reset();
+ }
+
+ void
+ inverse()
+ {
+ bset.flip();
+ }
+
+ void
+ swap(basic_chset_8bit& x)
+ {
+ std::swap(bset, x.bset);
+ }
+
+ basic_chset_8bit&
+ operator|=(basic_chset_8bit const& x)
+ {
+ bset |= x.bset;
+ return *this;
+ }
+
+ basic_chset_8bit&
+ operator&=(basic_chset_8bit const& x)
+ {
+ bset &= x.bset;
+ return *this;
+ }
+
+ basic_chset_8bit&
+ operator-=(basic_chset_8bit const& x)
+ {
+ bset &= ~x.bset;
+ return *this;
+ }
+
+ basic_chset_8bit&
+ operator^=(basic_chset_8bit const& x)
+ {
+ bset ^= x.bset;
+ return *this;
+ }
+
+ private: std::bitset<256> bset;
+ };
+
+ /////////////////////////////////
+ template <>
+ struct basic_chset<char>
+ : basic_chset_8bit<char> {};
+
+ /////////////////////////////////
+ template <>
+ struct basic_chset<signed char>
+ : basic_chset_8bit<signed char> {};
+
+ /////////////////////////////////
+ template <>
+ struct basic_chset<unsigned char>
+ : basic_chset_8bit<unsigned char> {};
+
+#endif // #if (CHAR_BIT == 8)
+
+}}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/char_set/range.hpp b/boost/spirit/home/support/char_set/range.hpp
new file mode 100644
index 0000000000..6d1f661996
--- /dev/null
+++ b/boost/spirit/home/support/char_set/range.hpp
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_RANGE_MAY_16_2006_0720_PM)
+#define BOOST_SPIRIT_RANGE_MAY_16_2006_0720_PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+namespace boost { namespace spirit { namespace support { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // A closed range (first, last)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct range
+ {
+ typedef T value_type;
+
+ range() : first(), last() {}
+ range(T first, T last) : first(first), last(last) {}
+
+ T first;
+ T last;
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/support/char_set/range_functions.hpp b/boost/spirit/home/support/char_set/range_functions.hpp
new file mode 100644
index 0000000000..9afde6f482
--- /dev/null
+++ b/boost/spirit/home/support/char_set/range_functions.hpp
@@ -0,0 +1,98 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_RANGE_FUNCTIONS_MAY_16_2006_0720_PM)
+#define BOOST_SPIRIT_RANGE_FUNCTIONS_MAY_16_2006_0720_PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/integer_traits.hpp>
+
+namespace boost { namespace spirit { namespace support { namespace detail
+{
+ template <typename Range>
+ inline bool
+ is_valid(Range const& range)
+ {
+ // test for valid ranges
+ return range.first <= range.last;
+ }
+
+ template <typename Range>
+ inline bool
+ includes(Range const& range, Range const& other)
+ {
+ // see if two ranges intersect
+ return (range.first <= other.first) && (range.last >= other.last);
+ }
+
+ template <typename Range>
+ inline bool
+ includes(Range const& range, typename Range::value_type val)
+ {
+ // see if val is in range
+ return (range.first <= val) && (range.last >= val);
+ }
+
+ template <typename Range>
+ inline bool
+ can_merge(Range const& range, Range const& other)
+ {
+ // see if a 'range' overlaps, or is adjacent to
+ // another range 'other', so we can merge them
+
+ typedef typename Range::value_type value_type;
+ typedef integer_traits<value_type> integer_traits;
+
+ value_type decr_first =
+ range.first == integer_traits::const_min
+ ? range.first : range.first-1;
+
+ value_type incr_last =
+ range.last == integer_traits::const_max
+ ? range.last : range.last+1;
+
+ return (decr_first <= other.last) && (incr_last >= other.first);
+ }
+
+ template <typename Range>
+ inline void
+ merge(Range& result, Range const& other)
+ {
+ // merge two ranges
+ if (result.first > other.first)
+ result.first = other.first;
+ if (result.last < other.last)
+ result.last = other.last;
+ }
+
+ template <typename Range>
+ struct range_compare
+ {
+ // compare functor with a value or another range
+
+ typedef typename Range::value_type value_type;
+
+ bool operator()(Range const& x, const value_type y) const
+ {
+ return x.first < y;
+ }
+
+ bool operator()(value_type const x, Range const& y) const
+ {
+ return x < y.first;
+ }
+
+ bool operator()(Range const& x, Range const& y) const
+ {
+ return x.first < y.first;
+ }
+ };
+}}}}
+
+#endif
diff --git a/boost/spirit/home/support/char_set/range_run.hpp b/boost/spirit/home/support/char_set/range_run.hpp
new file mode 100644
index 0000000000..8c1bb590a4
--- /dev/null
+++ b/boost/spirit/home/support/char_set/range_run.hpp
@@ -0,0 +1,56 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_RANGE_RUN_MAY_16_2006_0801_PM)
+#define BOOST_SPIRIT_RANGE_RUN_MAY_16_2006_0801_PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_set/range.hpp>
+#include <vector>
+
+namespace boost { namespace spirit { namespace support { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // range_run
+ //
+ // An implementation of a sparse bit (boolean) set. The set uses
+ // a sorted vector of disjoint ranges. This class implements the
+ // bare minimum essentials from which the full range of set
+ // operators can be implemented. The set is constructed from
+ // ranges. Internally, adjacent or overlapping ranges are
+ // coalesced.
+ //
+ // range_runs are very space-economical in situations where there
+ // are lots of ranges and a few individual disjoint values.
+ // Searching is O(log n) where n is the number of ranges.
+ //
+ // { Low level interface }
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ class range_run
+ {
+ public:
+
+ typedef range<Char> range_type;
+ typedef std::vector<range_type> storage_type;
+
+ void swap(range_run& other);
+ bool test(Char v) const;
+ void set(range_type const& range);
+ void clear(range_type const& range);
+ void clear();
+
+ private:
+
+ storage_type run;
+ };
+}}}}
+
+#include <boost/spirit/home/support/char_set/range_run_impl.hpp>
+#endif
diff --git a/boost/spirit/home/support/char_set/range_run_impl.hpp b/boost/spirit/home/support/char_set/range_run_impl.hpp
new file mode 100644
index 0000000000..fe91ad8f0d
--- /dev/null
+++ b/boost/spirit/home/support/char_set/range_run_impl.hpp
@@ -0,0 +1,189 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_RANGE_RUN_MAY_16_2006_0807_PM)
+#define BOOST_SPIRIT_RANGE_RUN_MAY_16_2006_0807_PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_set/range_functions.hpp>
+#include <boost/assert.hpp>
+#include <boost/integer_traits.hpp>
+#include <algorithm>
+
+namespace boost { namespace spirit { namespace support { namespace detail
+{
+ template <typename Run, typename Iterator, typename Range>
+ inline bool
+ try_merge(Run& run, Iterator iter, Range const& range)
+ {
+ // if *iter intersects with, or is adjacent to, 'range'...
+ if (can_merge(*iter, range))
+ {
+ typedef typename Range::value_type value_type;
+ typedef integer_traits<value_type> integer_traits;
+
+ // merge range and *iter
+ merge(*iter, range);
+
+ // collapse all subsequent ranges that can merge with *iter:
+ Iterator i = iter+1;
+ // 1. skip subsequent ranges completely included in *iter
+ while (i != run.end() && i->last <= iter->last)
+ ++i;
+ // 2. collapse next range if adjacent or overlapping with *iter
+ if (i != run.end() && i->first-1 <= iter->last)
+ {
+ iter->last = i->last;
+ ++i;
+ }
+
+ // erase all ranges that were collapsed
+ run.erase(iter+1, i);
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Char>
+ inline bool
+ range_run<Char>::test(Char val) const
+ {
+ if (run.empty())
+ return false;
+
+ // search the ranges for one that potentially includes val
+ typename storage_type::const_iterator iter =
+ std::upper_bound(
+ run.begin(), run.end(), val,
+ range_compare<range_type>()
+ );
+
+ // return true if *(iter-1) includes val
+ return iter != run.begin() && includes(*(--iter), val);
+ }
+
+ template <typename Char>
+ inline void
+ range_run<Char>::swap(range_run& other)
+ {
+ run.swap(other.run);
+ }
+
+ template <typename Char>
+ void
+ range_run<Char>::set(range_type const& range)
+ {
+ BOOST_ASSERT(is_valid(range));
+ if (run.empty())
+ {
+ // the vector is empty, insert 'range'
+ run.push_back(range);
+ return;
+ }
+
+ // search the ranges for one that potentially includes 'range'
+ typename storage_type::iterator iter =
+ std::upper_bound(
+ run.begin(), run.end(), range,
+ range_compare<range_type>()
+ );
+
+ if (iter != run.begin())
+ {
+ // if *(iter-1) includes 'range', return early
+ if (includes(*(iter-1), range))
+ {
+ return;
+ }
+
+ // if *(iter-1) can merge with 'range', merge them and return
+ if (try_merge(run, iter-1, range))
+ {
+ return;
+ }
+ }
+
+ // if *iter can merge with with 'range', merge them
+ if (iter == run.end() || !try_merge(run, iter, range))
+ {
+ // no overlap, insert 'range'
+ run.insert(iter, range);
+ }
+ }
+
+ template <typename Char>
+ void
+ range_run<Char>::clear(range_type const& range)
+ {
+ BOOST_ASSERT(is_valid(range));
+ if (!run.empty())
+ {
+ // search the ranges for one that potentially includes 'range'
+ typename storage_type::iterator iter =
+ std::upper_bound(
+ run.begin(), run.end(), range,
+ range_compare<range_type>()
+ );
+
+ // 'range' starts with or after another range:
+ if (iter != run.begin())
+ {
+ typename storage_type::iterator const left_iter = iter-1;
+
+ // 'range' starts after '*left_iter':
+ if (left_iter->first < range.first)
+ {
+ // if 'range' is completely included inside '*left_iter':
+ // need to break it apart into two ranges (punch a hole),
+ if (left_iter->last > range.last)
+ {
+ Char save_last = left_iter->last;
+ left_iter->last = range.first-1;
+ run.insert(iter, range_type(range.last+1, save_last));
+ return;
+ }
+ // if 'range' contains 'left_iter->last':
+ // truncate '*left_iter' (clip its right)
+ else if (left_iter->last >= range.first)
+ {
+ left_iter->last = range.first-1;
+ }
+ }
+
+ // 'range' has the same left bound as '*left_iter': it
+ // must be removed or truncated by the code below
+ else
+ {
+ iter = left_iter;
+ }
+ }
+
+ // remove or truncate subsequent ranges that overlap with 'range':
+ typename storage_type::iterator i = iter;
+ // 1. skip subsequent ranges completely included in 'range'
+ while (i != run.end() && i->last <= range.last)
+ ++i;
+ // 2. clip left of next range if overlapping with 'range'
+ if (i != run.end() && i->first <= range.last)
+ i->first = range.last+1;
+
+ // erase all ranges that 'range' contained
+ run.erase(iter, i);
+ }
+ }
+
+ template <typename Char>
+ inline void
+ range_run<Char>::clear()
+ {
+ run.clear();
+ }
+}}}}
+
+#endif
diff --git a/boost/spirit/home/support/common_terminals.hpp b/boost/spirit/home/support/common_terminals.hpp
new file mode 100644
index 0000000000..2c7772df66
--- /dev/null
+++ b/boost/spirit/home/support/common_terminals.hpp
@@ -0,0 +1,437 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_COMMON_PLACEHOLDERS_OCTOBER_16_2008_0102PM
+#define BOOST_SPIRIT_COMMON_PLACEHOLDERS_OCTOBER_16_2008_0102PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/terminal.hpp>
+#include <boost/spirit/home/support/char_encoding/standard.hpp>
+#include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
+#include <boost/spirit/home/support/char_encoding/ascii.hpp>
+#include <boost/spirit/home/support/char_encoding/iso8859_1.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/mpl/vector.hpp>
+
+#if defined(BOOST_SPIRIT_UNICODE)
+# include <boost/spirit/home/support/char_encoding/unicode.hpp>
+#endif
+
+namespace boost { namespace spirit
+{
+ typedef mpl::vector<
+ spirit::char_encoding::ascii
+ , spirit::char_encoding::iso8859_1
+ , spirit::char_encoding::standard
+ , spirit::char_encoding::standard_wide
+#if defined(BOOST_SPIRIT_UNICODE)
+ , spirit::char_encoding::unicode
+#endif
+ >
+ char_encodings;
+
+ template <typename T>
+ struct is_char_encoding : mpl::false_ {};
+
+ template <>
+ struct is_char_encoding<spirit::char_encoding::ascii> : mpl::true_ {};
+
+ template <>
+ struct is_char_encoding<spirit::char_encoding::iso8859_1> : mpl::true_ {};
+
+ template <>
+ struct is_char_encoding<spirit::char_encoding::standard> : mpl::true_ {};
+
+ template <>
+ struct is_char_encoding<spirit::char_encoding::standard_wide> : mpl::true_ {};
+
+#if defined(BOOST_SPIRIT_UNICODE)
+ template <>
+ struct is_char_encoding<spirit::char_encoding::unicode> : mpl::true_ {};
+#endif
+
+ template <typename Encoding>
+ struct encoding
+ : proto::terminal<tag::char_code<tag::encoding, Encoding> >::type
+ {};
+
+ // Our basic terminals
+ BOOST_SPIRIT_DEFINE_TERMINALS_NAME(
+ ( verbatim, verbatim_type )
+ ( no_delimit, no_delimit_type )
+ ( lexeme, lexeme_type )
+ ( no_skip, no_skip_type )
+ ( omit, omit_type )
+ ( raw, raw_type )
+ ( as_string, as_string_type )
+ ( as_wstring, as_wstring_type )
+ ( inf, inf_type )
+ ( eol, eol_type )
+ ( eoi, eoi_type )
+ ( buffer, buffer_type )
+ ( true_, true_type )
+ ( false_, false_type )
+ ( matches, matches_type )
+ ( hold, hold_type )
+ ( strict, strict_type )
+ ( relaxed, relaxed_type )
+ ( duplicate, duplicate_type )
+ )
+
+ // Our extended terminals
+ BOOST_SPIRIT_DEFINE_TERMINALS_NAME_EX(
+ ( lit, lit_type )
+ ( bin, bin_type )
+ ( oct, oct_type )
+ ( hex, hex_type )
+ ( bool_, bool_type )
+ ( ushort_, ushort_type )
+ ( ulong_, ulong_type )
+ ( uint_, uint_type )
+ ( short_, short_type )
+ ( long_, long_type )
+ ( int_, int_type )
+ ( ulong_long, ulong_long_type )
+ ( long_long, long_long_type )
+ ( float_, float_type )
+ ( double_, double_type )
+ ( long_double, long_double_type )
+ ( repeat, repeat_type )
+ ( eps, eps_type )
+ ( pad, pad_type )
+ ( byte_, byte_type )
+ ( word, word_type )
+ ( big_word, big_word_type )
+ ( little_word, little_word_type )
+ ( dword, dword_type )
+ ( big_dword, big_dword_type )
+ ( little_dword, little_dword_type )
+ ( qword, qword_type )
+ ( big_qword, big_qword_type )
+ ( little_qword, little_qword_type )
+ ( bin_float, bin_float_type )
+ ( big_bin_float, big_bin_float_type )
+ ( little_bin_float, little_bin_float_type )
+ ( bin_double, bin_double_type )
+ ( big_bin_double, big_bin_double_type )
+ ( little_bin_double, little_bin_double_type )
+ ( skip, skip_type )
+ ( delimit, delimit_type )
+ ( stream, stream_type )
+ ( wstream, wstream_type )
+ ( left_align, left_align_type )
+ ( right_align, right_align_type )
+ ( center, center_type )
+ ( maxwidth, maxwidth_type )
+ ( set_state, set_state_type )
+ ( in_state, in_state_type )
+ ( token, token_type )
+ ( tokenid, tokenid_type )
+ ( raw_token, raw_token_type )
+ ( tokenid_mask, tokenid_mask_type )
+ ( attr, attr_type )
+ ( columns, columns_type )
+ ( auto_, auto_type )
+ )
+
+ // special tags (used mainly for stateful tag types)
+ namespace tag
+ {
+ struct attr_cast { BOOST_SPIRIT_IS_TAG() };
+ struct as { BOOST_SPIRIT_IS_TAG() };
+ }
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+// Here we place the character-set sensitive placeholders. We have one set
+// each for ascii, iso8859_1, standard and standard_wide and unicode. These
+// placeholders are placed in its char-set namespace. For example, there exist
+// a placeholder spirit::ascii::alnum for ascii versions of alnum.
+
+#define BOOST_SPIRIT_TAG_CHAR_SPEC(charset) \
+ typedef tag::char_code<tag::char_, charset> char_; \
+ typedef tag::char_code<tag::string, charset> string; \
+ /***/
+
+#ifdef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+#define BOOST_SPIRIT_CHAR_SPEC(charset) \
+ typedef spirit::terminal<tag::charset::char_> char_type; \
+ typedef spirit::terminal<tag::charset::string> string_type; \
+ /***/
+
+#else
+
+#define BOOST_SPIRIT_CHAR_SPEC(charset) \
+ typedef spirit::terminal<tag::charset::char_> char_type; \
+ char_type const char_ = char_type(); \
+ \
+ inline void silence_unused_warnings_##char_() { (void) char_; } \
+ \
+ typedef spirit::terminal<tag::charset::string> string_type; \
+ string_type const string = string_type(); \
+ \
+ inline void silence_unused_warnings_##string() { (void) string; } \
+ /***/
+
+#endif
+
+#ifdef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+#define BOOST_SPIRIT_CHAR_CODE(name, charset) \
+ typedef proto::terminal<tag::char_code<tag::name, charset> >::type \
+ name##_type; \
+ /***/
+
+#else
+
+#define BOOST_SPIRIT_CHAR_CODE(name, charset) \
+ typedef proto::terminal<tag::char_code<tag::name, charset> >::type \
+ name##_type; \
+ name##_type const name = name##_type(); \
+ \
+ inline void silence_unused_warnings_##name() { (void) name; } \
+ /***/
+
+
+#endif
+
+#define BOOST_SPIRIT_DEFINE_CHAR_CODES(charset) \
+ namespace boost { namespace spirit { namespace tag { namespace charset \
+ { \
+ BOOST_SPIRIT_TAG_CHAR_SPEC(spirit::char_encoding::charset) \
+ }}}} \
+ namespace boost { namespace spirit { namespace charset \
+ { \
+ BOOST_SPIRIT_CHAR_SPEC(charset) \
+ \
+ BOOST_SPIRIT_CHAR_CODE(alnum, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(alpha, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(blank, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(cntrl, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(digit, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(graph, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(print, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(punct, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(space, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(xdigit, spirit::char_encoding::charset) \
+ \
+ BOOST_SPIRIT_CHAR_CODE(no_case, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(lower, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(upper, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(lowernum, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(uppernum, spirit::char_encoding::charset) \
+ }}} \
+ /***/
+
+BOOST_SPIRIT_DEFINE_CHAR_CODES(ascii)
+BOOST_SPIRIT_DEFINE_CHAR_CODES(iso8859_1)
+BOOST_SPIRIT_DEFINE_CHAR_CODES(standard)
+BOOST_SPIRIT_DEFINE_CHAR_CODES(standard_wide)
+
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Char>
+ struct char_encoding_from_char;
+
+ template <>
+ struct char_encoding_from_char<char>
+ : mpl::identity<spirit::char_encoding::standard>
+ {};
+
+ template <>
+ struct char_encoding_from_char<wchar_t>
+ : mpl::identity<spirit::char_encoding::standard_wide>
+ {};
+
+ template <typename T>
+ struct char_encoding_from_char<T const>
+ : char_encoding_from_char<T>
+ {};
+}}}
+
+#if defined(BOOST_SPIRIT_UNICODE)
+BOOST_SPIRIT_DEFINE_CHAR_CODES(unicode)
+
+ namespace boost { namespace spirit { namespace tag { namespace unicode
+ {
+ BOOST_SPIRIT_TAG_CHAR_SPEC(spirit::char_encoding::unicode)
+ }}}}
+
+ namespace boost { namespace spirit { namespace unicode
+ {
+#define BOOST_SPIRIT_UNICODE_CHAR_CODE(name) \
+ BOOST_SPIRIT_CHAR_CODE(name, spirit::char_encoding::unicode) \
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Unicode Major Categories
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(letter)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(mark)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(number)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(separator)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(other)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(punctuation)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(symbol)
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Unicode General Categories
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(uppercase_letter)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(lowercase_letter)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(titlecase_letter)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(modifier_letter)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(other_letter)
+
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(nonspacing_mark)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(enclosing_mark)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(spacing_mark)
+
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(decimal_number)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(letter_number)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(other_number)
+
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(space_separator)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(line_separator)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(paragraph_separator)
+
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(control)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(format)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(private_use)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(surrogate)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(unassigned)
+
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(dash_punctuation)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(open_punctuation)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(close_punctuation)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(connector_punctuation)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(other_punctuation)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(initial_punctuation)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(final_punctuation)
+
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(math_symbol)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(currency_symbol)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(modifier_symbol)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(other_symbol)
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Unicode Derived Categories
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(alphabetic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(uppercase)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(lowercase)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(white_space)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(hex_digit)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(noncharacter_code_point)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(default_ignorable_code_point)
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Unicode Scripts
+ ///////////////////////////////////////////////////////////////////////////
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(arabic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(imperial_aramaic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(armenian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(avestan)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(balinese)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(bamum)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(bengali)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(bopomofo)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(braille)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(buginese)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(buhid)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(canadian_aboriginal)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(carian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(cham)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(cherokee)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(coptic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(cypriot)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(cyrillic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(devanagari)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(deseret)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(egyptian_hieroglyphs)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(ethiopic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(georgian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(glagolitic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(gothic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(greek)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(gujarati)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(gurmukhi)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(hangul)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(han)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(hanunoo)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(hebrew)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(hiragana)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(katakana_or_hiragana)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(old_italic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(javanese)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(kayah_li)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(katakana)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(kharoshthi)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(khmer)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(kannada)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(kaithi)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(tai_tham)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(lao)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(latin)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(lepcha)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(limbu)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(linear_b)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(lisu)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(lycian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(lydian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(malayalam)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(mongolian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(meetei_mayek)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(myanmar)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(nko)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(ogham)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(ol_chiki)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(old_turkic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(oriya)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(osmanya)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(phags_pa)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(inscriptional_pahlavi)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(phoenician)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(inscriptional_parthian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(rejang)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(runic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(samaritan)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(old_south_arabian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(saurashtra)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(shavian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(sinhala)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(sundanese)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(syloti_nagri)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(syriac)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(tagbanwa)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(tai_le)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(new_tai_lue)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(tamil)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(tai_viet)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(telugu)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(tifinagh)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(tagalog)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(thaana)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(thai)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(tibetan)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(ugaritic)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(vai)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(old_persian)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(cuneiform)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(yi)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(inherited)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(common)
+ BOOST_SPIRIT_UNICODE_CHAR_CODE(unknown)
+
+#undef BOOST_SPIRIT_UNICODE_CHAR_CODE
+ }}}
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/container.hpp b/boost/spirit/home/support/container.hpp
new file mode 100644
index 0000000000..7f491aa476
--- /dev/null
+++ b/boost/spirit/home/support/container.hpp
@@ -0,0 +1,575 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_CONTAINER_FEBRUARY_06_2007_1001AM)
+#define BOOST_SPIRIT_CONTAINER_FEBRUARY_06_2007_1001AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/optional.hpp>
+#include <boost/variant.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/range/iterator_range.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // This file contains some container utils for stl containers. The
+ // utilities provided also accept spirit's unused_type; all no-ops.
+ // Compiler optimization will easily strip these away.
+ ///////////////////////////////////////////////////////////////////////////
+
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(size_type)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(reference)
+ }
+
+ template <typename T, typename Enable/* = void*/>
+ struct is_container
+ : mpl::bool_<
+ detail::has_value_type<T>::value &&
+ detail::has_iterator<T>::value &&
+ detail::has_size_type<T>::value &&
+ detail::has_reference<T>::value>
+ {};
+
+ template <typename T>
+ struct is_container<T&>
+ : is_container<T>
+ {};
+
+ template <typename T>
+ struct is_container<boost::optional<T> >
+ : is_container<T>
+ {};
+
+#define BOOST_SPIRIT_IS_CONTAINER(z, N, data) \
+ is_container<BOOST_PP_CAT(T, N)>::value || \
+ /***/
+
+ // make sure unused variant parameters do not affect the outcome
+ template <>
+ struct is_container<boost::detail::variant::void_>
+ : mpl::false_
+ {};
+
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct is_container<variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ : mpl::bool_<BOOST_PP_REPEAT(BOOST_VARIANT_LIMIT_TYPES
+ , BOOST_SPIRIT_IS_CONTAINER, _) false>
+ {};
+
+#undef BOOST_SPIRIT_IS_CONTAINER
+
+ template <typename T, typename Enable/* = void*/>
+ struct is_iterator_range
+ : mpl::false_
+ {};
+
+ template <typename T>
+ struct is_iterator_range<iterator_range<T> >
+ : mpl::true_
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T>
+ struct remove_value_const
+ {
+ typedef T type;
+ };
+
+ template <typename T>
+ struct remove_value_const<T const>
+ : remove_value_const<T>
+ {};
+
+ template <typename F, typename S>
+ struct remove_value_const<std::pair<F, S> >
+ {
+ typedef typename remove_value_const<F>::type first_type;
+ typedef typename remove_value_const<S>::type second_type;
+ typedef std::pair<first_type, second_type> type;
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////
+ //[customization_container_value_default
+ template <typename Container, typename Enable/* = void*/>
+ struct container_value
+ : detail::remove_value_const<typename Container::value_type>
+ {};
+ //]
+
+ template <typename T>
+ struct container_value<T&>
+ : container_value<T>
+ {};
+
+ // this will be instantiated if the optional holds a container
+ template <typename T>
+ struct container_value<boost::optional<T> >
+ : container_value<T>
+ {};
+
+ // this will be instantiated if the variant holds a container
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct container_value<variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ {
+ typedef typename
+ variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types
+ types;
+ typedef typename
+ mpl::find_if<types, is_container<mpl::_1> >::type
+ iter;
+
+ typedef typename container_value<
+ typename mpl::if_<
+ is_same<iter, typename mpl::end<types>::type>
+ , unused_type, typename mpl::deref<iter>::type
+ >::type
+ >::type type;
+ };
+
+ //[customization_container_value_unused
+ template <>
+ struct container_value<unused_type>
+ {
+ typedef unused_type type;
+ };
+ //]
+
+ template <>
+ struct container_value<unused_type const>
+ {
+ typedef unused_type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Container, typename Enable/* = void*/>
+ struct container_iterator
+ {
+ typedef typename Container::iterator type;
+ };
+
+ template <typename Container>
+ struct container_iterator<Container&>
+ : container_iterator<Container>
+ {};
+
+ template <typename Container>
+ struct container_iterator<Container const>
+ {
+ typedef typename Container::const_iterator type;
+ };
+
+ template <typename T>
+ struct container_iterator<optional<T> >
+ : container_iterator<T>
+ {};
+
+ template <typename T>
+ struct container_iterator<optional<T> const>
+ : container_iterator<T const>
+ {};
+
+ template <typename Iterator>
+ struct container_iterator<iterator_range<Iterator> >
+ {
+ typedef typename range_const_iterator<
+ iterator_range<Iterator> >::type type;
+ };
+
+ template <>
+ struct container_iterator<unused_type>
+ {
+ typedef unused_type const* type;
+ };
+
+ template <>
+ struct container_iterator<unused_type const>
+ {
+ typedef unused_type const* type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable/* = void*/>
+ struct optional_attribute
+ {
+ typedef T const& type;
+
+ static type call(T const& val)
+ {
+ return val;
+ }
+
+ static bool is_valid(T const&)
+ {
+ return true;
+ }
+ };
+
+ template <typename T>
+ struct optional_attribute<boost::optional<T> >
+ {
+ typedef T const& type;
+
+ static type call(boost::optional<T> const& val)
+ {
+ return boost::get<T>(val);
+ }
+
+ static bool is_valid(boost::optional<T> const& val)
+ {
+ return val;
+ }
+ };
+
+ template <typename T>
+ typename optional_attribute<T>::type
+ optional_value(T const& val)
+ {
+ return optional_attribute<T>::call(val);
+ }
+
+ inline unused_type optional_value(unused_type)
+ {
+ return unused;
+ }
+
+ template <typename T>
+ bool has_optional_value(T const& val)
+ {
+ return optional_attribute<T>::is_valid(val);
+ }
+
+ inline bool has_optional_value(unused_type)
+ {
+ return true;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Container, typename T>
+ bool push_back(Container& c, T const& val);
+
+ //[customization_push_back_default
+ template <typename Container, typename T, typename Enable/* = void*/>
+ struct push_back_container
+ {
+ static bool call(Container& c, T const& val)
+ {
+ c.insert(c.end(), val);
+ return true;
+ }
+ };
+ //]
+
+ template <typename Container, typename T>
+ struct push_back_container<optional<Container>, T>
+ {
+ static bool call(boost::optional<Container>& c, T const& val)
+ {
+ if (!c)
+ c = Container();
+ return push_back(boost::get<Container>(c), val);
+ }
+ };
+
+ namespace detail
+ {
+ template <typename T>
+ struct push_back_visitor : public static_visitor<>
+ {
+ typedef bool result_type;
+
+ push_back_visitor(T const& t) : t_(t) {}
+
+ template <typename Container>
+ bool push_back_impl(Container& c, mpl::true_) const
+ {
+ return push_back(c, t_);
+ }
+
+ template <typename T_>
+ bool push_back_impl(T_&, mpl::false_) const
+ {
+ // this variant doesn't hold a container
+ BOOST_ASSERT(false && "This variant doesn't hold a container");
+ return false;
+ }
+
+ template <typename T_>
+ bool operator()(T_& c) const
+ {
+ return push_back_impl(c, typename is_container<T_>::type());
+ }
+
+ T const& t_;
+ };
+ }
+
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T_), typename T>
+ struct push_back_container<variant<BOOST_VARIANT_ENUM_PARAMS(T_)>, T>
+ {
+ static bool call(variant<BOOST_VARIANT_ENUM_PARAMS(T_)>& c, T const& val)
+ {
+ return apply_visitor(detail::push_back_visitor<T>(val), c);
+ }
+ };
+
+ template <typename Container, typename T>
+ bool push_back(Container& c, T const& val)
+ {
+ return push_back_container<Container, T>::call(c, val);
+ }
+
+ //[customization_push_back_unused
+ template <typename Container>
+ bool push_back(Container&, unused_type)
+ {
+ return true;
+ }
+ //]
+
+ template <typename T>
+ bool push_back(unused_type, T const&)
+ {
+ return true;
+ }
+
+ inline bool push_back(unused_type, unused_type)
+ {
+ return true;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Container, typename Enable/* = void*/>
+ struct is_empty_container
+ {
+ static bool call(Container const& c)
+ {
+ return c.empty();
+ }
+ };
+
+ template <typename Container>
+ bool is_empty(Container const& c)
+ {
+ return is_empty_container<Container>::call(c);
+ }
+
+ inline bool is_empty(unused_type)
+ {
+ return true;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Ensure the attribute is actually a container type
+ template <typename Container, typename Enable/* = void*/>
+ struct make_container_attribute
+ {
+ static void call(Container&)
+ {
+ // for static types this function does nothing
+ }
+ };
+
+ template <typename T>
+ void make_container(T& t)
+ {
+ make_container_attribute<T>::call(t);
+ }
+
+ inline void make_container(unused_type)
+ {
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Container, typename Enable/* = void*/>
+ struct begin_container
+ {
+ static typename container_iterator<Container>::type call(Container& c)
+ {
+ return c.begin();
+ }
+ };
+
+ template <typename Container>
+ typename spirit::result_of::begin<Container>::type
+ begin(Container& c)
+ {
+ return begin_container<Container>::call(c);
+ }
+
+ inline unused_type const*
+ begin(unused_type)
+ {
+ return &unused;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Container, typename Enable/* = void*/>
+ struct end_container
+ {
+ static typename container_iterator<Container>::type call(Container& c)
+ {
+ return c.end();
+ }
+ };
+
+ template <typename Container>
+ inline typename spirit::result_of::end<Container>::type
+ end(Container& c)
+ {
+ return end_container<Container>::call(c);
+ }
+
+ inline unused_type const*
+ end(unused_type)
+ {
+ return &unused;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Enable/* = void*/>
+ struct deref_iterator
+ {
+ typedef typename boost::detail::iterator_traits<Iterator>::reference type;
+ static type call(Iterator& it)
+ {
+ return *it;
+ }
+ };
+
+ template <typename Iterator>
+ typename deref_iterator<Iterator>::type
+ deref(Iterator& it)
+ {
+ return deref_iterator<Iterator>::call(it);
+ }
+
+ inline unused_type
+ deref(unused_type const*)
+ {
+ return unused;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Enable/* = void*/>
+ struct next_iterator
+ {
+ static void call(Iterator& it)
+ {
+ ++it;
+ }
+ };
+
+ template <typename Iterator>
+ void next(Iterator& it)
+ {
+ next_iterator<Iterator>::call(it);
+ }
+
+ inline void next(unused_type const*)
+ {
+ // do nothing
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Iterator, typename Enable/* = void*/>
+ struct compare_iterators
+ {
+ static bool call(Iterator const& it1, Iterator const& it2)
+ {
+ return it1 == it2;
+ }
+ };
+
+ template <typename Iterator>
+ bool compare(Iterator& it1, Iterator& it2)
+ {
+ return compare_iterators<Iterator>::call(it1, it2);
+ }
+
+ inline bool compare(unused_type const*, unused_type const*)
+ {
+ return false;
+ }
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace result_of
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct optional_value
+ {
+ typedef T type;
+ };
+
+ template <typename T>
+ struct optional_value<boost::optional<T> >
+ {
+ typedef T type;
+ };
+
+ template <typename T>
+ struct optional_value<boost::optional<T> const>
+ {
+ typedef T const type;
+ };
+
+ template <>
+ struct optional_value<unused_type>
+ {
+ typedef unused_type type;
+ };
+
+ template <>
+ struct optional_value<unused_type const>
+ {
+ typedef unused_type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Container>
+ struct begin
+ : traits::container_iterator<Container>
+ {};
+
+ template <typename Container>
+ struct end
+ : traits::container_iterator<Container>
+ {};
+
+ template <typename Iterator>
+ struct deref
+ : traits::deref_iterator<Iterator>
+ {};
+
+ template <>
+ struct deref<unused_type const*>
+ {
+ typedef unused_type type;
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/context.hpp b/boost/spirit/home/support/context.hpp
new file mode 100644
index 0000000000..b728b4f10d
--- /dev/null
+++ b/boost/spirit/home/support/context.hpp
@@ -0,0 +1,299 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Thomas Heller
+
+ Distributed under the 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_SPIRIT_CONTEXT_OCTOBER_31_2008_0654PM)
+#define BOOST_SPIRIT_CONTEXT_OCTOBER_31_2008_0654PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/home/support/nonterminal/expand_arg.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/limits.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/as_list.hpp>
+#include <boost/fusion/include/transform.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/at.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+#define SPIRIT_DECLARE_ATTRIBUTE(z, n, data) \
+ typedef phoenix::actor<attribute<n> > \
+ BOOST_PP_CAT(BOOST_PP_CAT(_r, n), _type); \
+ phoenix::actor<attribute<n> > const \
+ BOOST_PP_CAT(_r, n) = BOOST_PP_CAT(BOOST_PP_CAT(_r, n), _type)();
+ /***/
+#define SPIRIT_USING_ATTRIBUTE(z, n, data) \
+ using spirit::BOOST_PP_CAT(BOOST_PP_CAT(_r, n), _type); \
+ using spirit::BOOST_PP_CAT(_r, n); \
+ /***/
+
+#else
+
+#define SPIRIT_DECLARE_ATTRIBUTE(z, n, data) \
+ typedef phoenix::actor<attribute<n> > \
+ BOOST_PP_CAT(BOOST_PP_CAT(_r, n), _type); \
+ /***/
+#define SPIRIT_USING_ATTRIBUTE(z, n, data) \
+ using spirit::BOOST_PP_CAT(BOOST_PP_CAT(_r, n), _type); \
+ /***/
+
+#endif
+
+namespace boost { namespace spirit
+{
+ template <int>
+ struct attribute;
+
+ template <int>
+ struct local_variable;
+}}
+
+BOOST_PHOENIX_DEFINE_CUSTOM_TERMINAL(
+ template <int N>
+ , boost::spirit::attribute<N>
+ , mpl::false_ // is not nullary
+ , v2_eval(
+ proto::make<
+ boost::spirit::attribute<N>()
+ >
+ , proto::call<
+ functional::env(proto::_state)
+ >
+ )
+)
+
+BOOST_PHOENIX_DEFINE_CUSTOM_TERMINAL(
+ template <int N>
+ , boost::spirit::local_variable<N>
+ , mpl::false_ // is not nullary
+ , v2_eval(
+ proto::make<
+ boost::spirit::local_variable<N>()
+ >
+ , proto::call<
+ functional::env(proto::_state)
+ >
+ )
+)
+
+namespace boost { namespace spirit
+{
+ template <typename Attributes, typename Locals>
+ struct context
+ {
+ typedef Attributes attributes_type;
+ typedef Locals locals_type;
+
+ context(typename Attributes::car_type attribute)
+ : attributes(attribute, fusion::nil()), locals() {}
+
+ template <typename Args, typename Context>
+ context(
+ typename Attributes::car_type attribute
+ , Args const& args
+ , Context& caller_context
+ ) : attributes(
+ attribute
+ , fusion::as_list(
+ fusion::transform(
+ args
+ , detail::expand_arg<Context>(caller_context)
+ )
+ )
+ )
+ , locals() {}
+
+ context(Attributes const& attributes)
+ : attributes(attributes), locals() {}
+
+ Attributes attributes; // The attributes
+ Locals locals; // Local variables
+ };
+
+ template <typename Context>
+ struct attributes_of
+ {
+ typedef typename Context::attributes_type type;
+ };
+
+ template <typename Context>
+ struct attributes_of<Context const>
+ {
+ typedef typename Context::attributes_type const type;
+ };
+
+ template <typename Context>
+ struct attributes_of<Context &>
+ : attributes_of<Context>
+ {};
+
+ template <typename Context>
+ struct locals_of
+ {
+ typedef typename Context::locals_type type;
+ };
+
+ template <typename Context>
+ struct locals_of<Context const>
+ {
+ typedef typename Context::locals_type const type;
+ };
+
+ template <typename Context>
+ struct locals_of<Context &>
+ {
+ typedef typename Context::locals_type type;
+ };
+
+ template <int N>
+ struct attribute
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ attributes_of<typename
+ mpl::at_c<typename Env::args_type, 1>::type
+ >::type
+ attributes_type;
+
+ typedef typename
+ fusion::result_of::size<attributes_type>::type
+ attributes_size;
+
+ // report invalid argument not found (N is out of bounds)
+ BOOST_SPIRIT_ASSERT_MSG(
+ (N < attributes_size::value),
+ index_is_out_of_bounds, ());
+
+ typedef typename
+ fusion::result_of::at_c<attributes_type, N>::type
+ type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return fusion::at_c<N>((fusion::at_c<1>(env.args())).attributes);
+ }
+ };
+
+ template <int N>
+ struct local_variable
+ {
+ typedef mpl::true_ no_nullary;
+
+ template <typename Env>
+ struct result
+ {
+ typedef typename
+ locals_of<typename
+ mpl::at_c<typename Env::args_type, 1>::type
+ >::type
+ locals_type;
+
+ typedef typename
+ fusion::result_of::size<locals_type>::type
+ locals_size;
+
+ // report invalid argument not found (N is out of bounds)
+ BOOST_SPIRIT_ASSERT_MSG(
+ (N < locals_size::value),
+ index_is_out_of_bounds, ());
+
+ typedef typename
+ fusion::result_of::at_c<locals_type, N>::type
+ type;
+ };
+
+ template <typename Env>
+ typename result<Env>::type
+ eval(Env const& env) const
+ {
+ return get_arg<N>((fusion::at_c<1>(env.args())).locals);
+ }
+ };
+
+ typedef phoenix::actor<attribute<0> > _val_type;
+ typedef phoenix::actor<attribute<0> > _r0_type;
+ typedef phoenix::actor<attribute<1> > _r1_type;
+ typedef phoenix::actor<attribute<2> > _r2_type;
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ // _val refers to the 'return' value of a rule (same as _r0)
+ // _r1, _r2, ... refer to the rule arguments
+ _val_type const _val = _val_type();
+ _r0_type const _r0 = _r0_type();
+ _r1_type const _r1 = _r1_type();
+ _r2_type const _r2 = _r2_type();
+#endif
+
+ // Bring in the rest of the attributes (_r4 .. _rN+1), using PP
+ BOOST_PP_REPEAT_FROM_TO(
+ 3, SPIRIT_ATTRIBUTES_LIMIT, SPIRIT_DECLARE_ATTRIBUTE, _)
+
+ typedef phoenix::actor<local_variable<0> > _a_type;
+ typedef phoenix::actor<local_variable<1> > _b_type;
+ typedef phoenix::actor<local_variable<2> > _c_type;
+ typedef phoenix::actor<local_variable<3> > _d_type;
+ typedef phoenix::actor<local_variable<4> > _e_type;
+ typedef phoenix::actor<local_variable<5> > _f_type;
+ typedef phoenix::actor<local_variable<6> > _g_type;
+ typedef phoenix::actor<local_variable<7> > _h_type;
+ typedef phoenix::actor<local_variable<8> > _i_type;
+ typedef phoenix::actor<local_variable<9> > _j_type;
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ // _a, _b, ... refer to the local variables of a rule
+ _a_type const _a = _a_type();
+ _b_type const _b = _b_type();
+ _c_type const _c = _c_type();
+ _d_type const _d = _d_type();
+ _e_type const _e = _e_type();
+ _f_type const _f = _f_type();
+ _g_type const _g = _g_type();
+ _h_type const _h = _h_type();
+ _i_type const _i = _i_type();
+ _j_type const _j = _j_type();
+#endif
+
+ // You can bring these in with the using directive
+ // without worrying about bringing in too much.
+ namespace labels
+ {
+ BOOST_PP_REPEAT(SPIRIT_ARGUMENTS_LIMIT, SPIRIT_USING_ARGUMENT, _)
+ BOOST_PP_REPEAT(SPIRIT_ATTRIBUTES_LIMIT, SPIRIT_USING_ATTRIBUTE, _)
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using spirit::_val;
+ using spirit::_a;
+ using spirit::_b;
+ using spirit::_c;
+ using spirit::_d;
+ using spirit::_e;
+ using spirit::_f;
+ using spirit::_g;
+ using spirit::_h;
+ using spirit::_i;
+ using spirit::_j;
+#endif
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/support/detail/as_variant.hpp b/boost/spirit/home/support/detail/as_variant.hpp
new file mode 100644
index 0000000000..e2fe18d68e
--- /dev/null
+++ b/boost/spirit/home/support/detail/as_variant.hpp
@@ -0,0 +1,104 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_PP_IS_ITERATING
+#if !defined(BOOST_SPIRIT_AS_VARIANT_NOVEMBER_16_2007_0420PM)
+#define BOOST_SPIRIT_AS_VARIANT_NOVEMBER_16_2007_0420PM
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/variant/variant_fwd.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/begin.hpp>
+#include <boost/fusion/include/next.hpp>
+#include <boost/fusion/include/value_of.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/contains.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ template <int size>
+ struct as_variant_impl;
+
+ template <>
+ struct as_variant_impl<0>
+ {
+ template <typename Iterator>
+ struct apply
+ {
+ typedef variant<> type;
+ };
+ };
+
+#define BOOST_FUSION_NEXT_ITERATOR(z, n, data) \
+ typedef typename fusion::result_of::next<BOOST_PP_CAT(I, n)>::type \
+ BOOST_PP_CAT(I, BOOST_PP_INC(n));
+
+#define BOOST_FUSION_NEXT_CALL_ITERATOR(z, n, data) \
+ typename gen::BOOST_PP_CAT(I, BOOST_PP_INC(n)) \
+ BOOST_PP_CAT(i, BOOST_PP_INC(n)) = fusion::next(BOOST_PP_CAT(i, n));
+
+#define BOOST_FUSION_VALUE_OF_ITERATOR(z, n, data) \
+ typedef typename fusion::result_of::value_of<BOOST_PP_CAT(I, n)>::type \
+ BOOST_PP_CAT(T, n);
+
+#define BOOST_PP_FILENAME_1 <boost/spirit/home/support/detail/as_variant.hpp>
+#define BOOST_PP_ITERATION_LIMITS (1, BOOST_VARIANT_LIMIT_TYPES)
+#include BOOST_PP_ITERATE()
+
+#undef BOOST_FUSION_NEXT_ITERATOR
+#undef BOOST_FUSION_NEXT_CALL_ITERATOR
+#undef BOOST_FUSION_VALUE_OF_ITERATOR
+
+ template <typename Sequence>
+ struct as_variant
+ {
+ // build a variant generator being able to generate a variant holding
+ // all of the types as given in the typelist
+ typedef typename
+ detail::as_variant_impl<fusion::result_of::size<Sequence>::value>
+ gen;
+
+ // use this generator to create the actual variant
+ typedef typename gen::template apply<
+ typename fusion::result_of::begin<Sequence>::type
+ >::type
+ type;
+ };
+}}}
+
+#endif
+#else // defined(BOOST_PP_IS_ITERATING)
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#define N BOOST_PP_ITERATION()
+
+ template <>
+ struct as_variant_impl<N>
+ {
+ template <typename I0>
+ struct apply
+ {
+ BOOST_PP_REPEAT(N, BOOST_FUSION_NEXT_ITERATOR, _)
+ BOOST_PP_REPEAT(N, BOOST_FUSION_VALUE_OF_ITERATOR, _)
+ typedef variant<BOOST_PP_ENUM_PARAMS(N, T)> type;
+ };
+ };
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+
diff --git a/boost/spirit/home/support/detail/endian.hpp b/boost/spirit/home/support/detail/endian.hpp
new file mode 100644
index 0000000000..3507aaafd5
--- /dev/null
+++ b/boost/spirit/home/support/detail/endian.hpp
@@ -0,0 +1,29 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// http://spirit.sourceforge.net/
+//
+// Distributed under the 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(SPIRIT_ENDIAN_MAR_21_2009_0349PM)
+#define SPIRIT_ENDIAN_MAR_21_2009_0349PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/version.hpp>
+
+// We need to treat the endian number types as PODs
+#if !defined(BOOST_ENDIAN_FORCE_PODNESS)
+#define BOOST_ENDIAN_FORCE_PODNESS 1
+#endif
+
+// If Boost has the endian library, use it, otherwise use an adapted version
+// included with Spirit
+#if BOOST_VERSION >= 105000
+#include <boost/endian/integers.hpp>
+#else
+#include <boost/spirit/home/support/detail/endian/endian.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/detail/endian/cover_operators.hpp b/boost/spirit/home/support/detail/endian/cover_operators.hpp
new file mode 100644
index 0000000000..68e0db82e4
--- /dev/null
+++ b/boost/spirit/home/support/detail/endian/cover_operators.hpp
@@ -0,0 +1,115 @@
+// boost/integer/cover_operators.hpp ----------------------------------------//
+
+// Copyright Darin Adler 2000
+// Copyright Beman Dawes 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)
+
+//----------------------------------------------------------------------------//
+
+// If the class being covered has a non-explicit conversion to an integer type
+// then a smaller number of cover operations are needed. Define the macro
+// BOOST_MINIMAL_INTEGER_COVER_OPERATORS to indicate this.
+
+// Define BOOST_NO_IO_COVER_OPERATORS if I/O cover operations are not desired.
+
+//----------------------------------------------------------------------------//
+
+#ifndef BOOST_SPIRIT_INTEGER_COVER_OPERATORS_HPP
+#define BOOST_SPIRIT_INTEGER_COVER_OPERATORS_HPP
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+# ifndef BOOST_MINIMAL_INTEGER_COVER_OPERATORS
+# include <boost/operators.hpp>
+# endif
+
+#include <iosfwd>
+
+namespace boost { namespace spirit
+{
+ namespace endian
+ {
+
+ // A class that adds integer operators to an integer cover class
+
+ template <typename T, typename IntegerType>
+ class cover_operators
+# ifndef BOOST_MINIMAL_INTEGER_COVER_OPERATORS
+ : boost::operators<T>
+# endif
+ {
+ // The other operations take advantage of the type conversion that's
+ // built into unary +.
+
+ // Unary operations.
+ friend IntegerType operator+(const T& x) { return x; }
+# ifndef BOOST_MINIMAL_INTEGER_COVER_OPERATORS
+ friend IntegerType operator-(const T& x) { return -+x; }
+ friend IntegerType operator~(const T& x) { return ~+x; }
+ friend IntegerType operator!(const T& x) { return !+x; }
+
+ // The basic ordering operations.
+ friend bool operator==(const T& x, IntegerType y) { return +x == y; }
+ friend bool operator<(const T& x, IntegerType y) { return +x < y; }
+# endif
+
+ // The basic arithmetic operations.
+ friend T& operator+=(T& x, IntegerType y) { return x = +x + y; }
+ friend T& operator-=(T& x, IntegerType y) { return x = +x - y; }
+ friend T& operator*=(T& x, IntegerType y) { return x = +x * y; }
+ friend T& operator/=(T& x, IntegerType y) { return x = +x / y; }
+ friend T& operator%=(T& x, IntegerType y) { return x = +x % y; }
+ friend T& operator&=(T& x, IntegerType y) { return x = +x & y; }
+ friend T& operator|=(T& x, IntegerType y) { return x = +x | y; }
+ friend T& operator^=(T& x, IntegerType y) { return x = +x ^ y; }
+ friend T& operator<<=(T& x, IntegerType y) { return x = +x << y; }
+ friend T& operator>>=(T& x, IntegerType y) { return x = +x >> y; }
+
+ // A few binary arithmetic operations not covered by operators base class.
+ friend IntegerType operator<<(const T& x, IntegerType y) { return +x << y; }
+ friend IntegerType operator>>(const T& x, IntegerType y) { return +x >> y; }
+
+ // Auto-increment and auto-decrement can be defined in terms of the
+ // arithmetic operations.
+ friend T& operator++(T& x) { return x += 1; }
+ friend T& operator--(T& x) { return x -= 1; }
+
+# ifdef BOOST_MINIMAL_INTEGER_COVER_OPERATORS
+ friend T operator++(T& x, int)
+ {
+ T tmp(x);
+ x += 1;
+ return tmp;
+ }
+ friend T operator--(T& x, int)
+ {
+ T tmp(x);
+ x -= 1;
+ return tmp;
+ }
+# endif
+
+# ifndef BOOST_NO_IO_COVER_OPERATORS
+ // TODO: stream I/O needs to be templatized on the stream type, so will
+ // work with wide streams, etc.
+
+ // Stream input and output.
+ friend std::ostream& operator<<(std::ostream& s, const T& x)
+ { return s << +x; }
+ friend std::istream& operator>>(std::istream& s, T& x)
+ {
+ IntegerType i;
+ if (s >> i)
+ x = i;
+ return s;
+ }
+# endif
+ };
+ } // namespace endian
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_INTEGER_COVER_OPERATORS_HPP
diff --git a/boost/spirit/home/support/detail/endian/endian.hpp b/boost/spirit/home/support/detail/endian/endian.hpp
new file mode 100644
index 0000000000..c806b58473
--- /dev/null
+++ b/boost/spirit/home/support/detail/endian/endian.hpp
@@ -0,0 +1,568 @@
+// Boost endian.hpp header file -------------------------------------------------------//
+
+// (C) Copyright Darin Adler 2000
+// (C) Copyright Beman Dawes 2006, 2009
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+// See library home page at http://www.boost.org/libs/endian
+
+//--------------------------------------------------------------------------------------//
+
+// Original design developed by Darin Adler based on classes developed by Mark
+// Borgerding. Four original class templates were combined into a single endian
+// class template by Beman Dawes, who also added the unrolled_byte_loops sign
+// partial specialization to correctly extend the sign when cover integer size
+// differs from endian representation size.
+
+// TODO: When a compiler supporting constexpr becomes available, try possible uses.
+
+#ifndef BOOST_SPIRIT_ENDIAN_HPP
+#define BOOST_SPIRIT_ENDIAN_HPP
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#ifdef BOOST_ENDIAN_LOG
+# include <iostream>
+#endif
+
+#if defined(__BORLANDC__) || defined( __CODEGEARC__)
+# pragma pack(push, 1)
+#endif
+
+#include <boost/config.hpp>
+#include <boost/detail/endian.hpp>
+#define BOOST_MINIMAL_INTEGER_COVER_OPERATORS
+#define BOOST_NO_IO_COVER_OPERATORS
+#include <boost/spirit/home/support/detail/endian/cover_operators.hpp>
+#undef BOOST_NO_IO_COVER_OPERATORS
+#undef BOOST_MINIMAL_INTEGER_COVER_OPERATORS
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/spirit/home/support/detail/scoped_enum_emulation.hpp>
+#include <iosfwd>
+#include <climits>
+
+# if CHAR_BIT != 8
+# error Platforms with CHAR_BIT != 8 are not supported
+# endif
+
+# define BOOST_ENDIAN_DEFAULT_CONSTRUCT {} // C++03
+
+# if defined(BOOST_ENDIAN_FORCE_PODNESS)
+# define BOOST_ENDIAN_NO_CTORS
+# endif
+
+
+namespace boost { namespace spirit
+{
+ namespace detail
+ {
+ // Unrolled loops for loading and storing streams of bytes.
+
+ template <typename T, std::size_t n_bytes,
+ bool sign=boost::is_signed<T>::value >
+ struct unrolled_byte_loops
+ {
+ typedef unrolled_byte_loops<T, n_bytes - 1, sign> next;
+
+ static T load_big(const unsigned char* bytes)
+ { return *(bytes - 1) | (next::load_big(bytes - 1) << 8); }
+ static T load_little(const unsigned char* bytes)
+ { return *bytes | (next::load_little(bytes + 1) << 8); }
+
+ static void store_big(char* bytes, T value)
+ {
+ *(bytes - 1) = static_cast<char>(value);
+ next::store_big(bytes - 1, value >> 8);
+ }
+ static void store_little(char* bytes, T value)
+ {
+ *bytes = static_cast<char>(value);
+ next::store_little(bytes + 1, value >> 8);
+ }
+ };
+
+ template <typename T>
+ struct unrolled_byte_loops<T, 1, false>
+ {
+ static T load_big(const unsigned char* bytes)
+ { return *(bytes - 1); }
+ static T load_little(const unsigned char* bytes)
+ { return *bytes; }
+ static void store_big(char* bytes, T value)
+ { *(bytes - 1) = static_cast<char>(value); }
+ static void store_little(char* bytes, T value)
+ { *bytes = static_cast<char>(value); }
+
+ };
+
+ template <typename T>
+ struct unrolled_byte_loops<T, 1, true>
+ {
+ static T load_big(const unsigned char* bytes)
+ { return *reinterpret_cast<const signed char*>(bytes - 1); }
+ static T load_little(const unsigned char* bytes)
+ { return *reinterpret_cast<const signed char*>(bytes); }
+ static void store_big(char* bytes, T value)
+ { *(bytes - 1) = static_cast<char>(value); }
+ static void store_little(char* bytes, T value)
+ { *bytes = static_cast<char>(value); }
+ };
+
+ template <typename T, std::size_t n_bytes>
+ inline
+ T load_big_endian(const void* bytes)
+ {
+ return unrolled_byte_loops<T, n_bytes>::load_big
+ (static_cast<const unsigned char*>(bytes) + n_bytes);
+ }
+
+ template <>
+ inline
+ float load_big_endian<float, 4>(const void* bytes)
+ {
+ const unsigned char *b = reinterpret_cast<const unsigned char *>(
+ bytes);
+ b += 3;
+
+ float value;
+ unsigned char *v = reinterpret_cast<unsigned char *>(&value);
+
+ for(std::size_t i = 0; i < 4; ++i)
+ {
+ *v++ = *b--;
+ }
+
+ return value;
+ }
+
+ template <>
+ inline
+ double load_big_endian<double, 8>(const void* bytes)
+ {
+ const unsigned char *b = reinterpret_cast<const unsigned char *>(
+ bytes);
+ b += 7;
+
+ double value;
+ unsigned char *v = reinterpret_cast<unsigned char *>(&value);
+
+ for(std::size_t i = 0; i < 8; ++i)
+ {
+ *v++ = *b--;
+ }
+
+ return value;
+ }
+
+ template <typename T, std::size_t n_bytes>
+ inline
+ T load_little_endian(const void* bytes)
+ {
+ return unrolled_byte_loops<T, n_bytes>::load_little
+ (static_cast<const unsigned char*>(bytes));
+ }
+
+ template <>
+ inline
+ float load_little_endian<float, 4>(const void* bytes)
+ {
+ const unsigned char *b = reinterpret_cast<const unsigned char *>(
+ bytes);
+
+ float value;
+ unsigned char *v = reinterpret_cast<unsigned char *>(&value);
+
+ for(std::size_t i = 0; i < 4; ++i)
+ {
+ *v++ = *b++;
+ }
+
+ return value;
+ }
+
+ template <>
+ inline
+ double load_little_endian<double, 8>(const void* bytes)
+ {
+ const unsigned char *b = reinterpret_cast<const unsigned char *>(
+ bytes);
+
+ double value;
+ unsigned char *v = reinterpret_cast<unsigned char *>(&value);
+
+ for(std::size_t i = 0; i < 8; ++i)
+ {
+ *v++ = *b++;
+ }
+
+ return value;
+ }
+
+ template <typename T, std::size_t n_bytes>
+ inline
+ void store_big_endian(void* bytes, T value)
+ {
+ unrolled_byte_loops<T, n_bytes>::store_big
+ (static_cast<char*>(bytes) + n_bytes, value);
+ }
+
+ template <>
+ inline
+ void store_big_endian<float, 4>(void* bytes, float value)
+ {
+ unsigned char *b = reinterpret_cast<unsigned char *>(bytes);
+ b += 3;
+
+ const unsigned char *v = reinterpret_cast<const unsigned char *>(
+ &value);
+
+ for(std::size_t i = 0; i < 4; ++i)
+ {
+ *b-- = *v++;
+ }
+ }
+
+ template <>
+ inline
+ void store_big_endian<double, 8>(void* bytes, double value)
+ {
+ unsigned char *b = reinterpret_cast<unsigned char *>(bytes);
+ b += 7;
+
+ const unsigned char *v = reinterpret_cast<const unsigned char *>(
+ &value);
+
+ for(std::size_t i = 0; i < 8; ++i)
+ {
+ *b-- = *v++;
+ }
+ }
+
+ template <typename T, std::size_t n_bytes>
+ inline
+ void store_little_endian(void* bytes, T value)
+ {
+ unrolled_byte_loops<T, n_bytes>::store_little
+ (static_cast<char*>(bytes), value);
+ }
+
+ template <>
+ inline
+ void store_little_endian<float, 4>(void* bytes, float value)
+ {
+ unsigned char *b = reinterpret_cast<unsigned char *>(bytes);
+
+ const unsigned char *v = reinterpret_cast<const unsigned char *>(
+ &value);
+
+ for(std::size_t i = 0; i < 4; ++i)
+ {
+ *b++ = *v++;
+ }
+ }
+
+ template <>
+ inline
+ void store_little_endian<double, 8>(void* bytes, double value)
+ {
+ unsigned char *b = reinterpret_cast<unsigned char *>(bytes);
+
+ const unsigned char *v = reinterpret_cast<const unsigned char *>(
+ &value);
+
+ for(std::size_t i = 0; i < 8; ++i)
+ {
+ *b++ = *v++;
+ }
+ }
+
+ } // namespace detail
+
+ namespace endian
+ {
+
+# ifdef BOOST_ENDIAN_LOG
+ bool endian_log(true);
+# endif
+
+
+ // endian class template and specializations ---------------------------------------//
+
+ BOOST_SCOPED_ENUM_START(endianness) { big, little, native }; BOOST_SCOPED_ENUM_END
+ BOOST_SCOPED_ENUM_START(alignment) { unaligned, aligned }; BOOST_SCOPED_ENUM_END
+
+ template <BOOST_SCOPED_ENUM(endianness) E, typename T, std::size_t n_bits,
+ BOOST_SCOPED_ENUM(alignment) A = alignment::unaligned>
+ class endian;
+
+ // Specializations that represent unaligned bytes.
+ // Taking an integer type as a parameter provides a nice way to pass both
+ // the size and signedness of the desired integer and get the appropriate
+ // corresponding integer type for the interface.
+
+ // unaligned big endian specialization
+ template <typename T, std::size_t n_bits>
+ class endian< endianness::big, T, n_bits, alignment::unaligned >
+ : cover_operators< endian< endianness::big, T, n_bits >, T >
+ {
+ BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+ public:
+ typedef T value_type;
+# ifndef BOOST_ENDIAN_NO_CTORS
+ endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+ explicit endian(T val)
+ {
+# ifdef BOOST_ENDIAN_LOG
+ if ( endian_log )
+ std::clog << "big, unaligned, " << n_bits << "-bits, construct(" << val << ")\n";
+# endif
+ detail::store_big_endian<T, n_bits/8>(m_value, val);
+ }
+# endif
+ endian & operator=(T val) { detail::store_big_endian<T, n_bits/8>(m_value, val); return *this; }
+ operator T() const
+ {
+# ifdef BOOST_ENDIAN_LOG
+ if ( endian_log )
+ std::clog << "big, unaligned, " << n_bits << "-bits, convert(" << detail::load_big_endian<T, n_bits/8>(m_value) << ")\n";
+# endif
+ return detail::load_big_endian<T, n_bits/8>(m_value);
+ }
+ private:
+ char m_value[n_bits/8];
+ };
+
+ // unaligned little endian specialization
+ template <typename T, std::size_t n_bits>
+ class endian< endianness::little, T, n_bits, alignment::unaligned >
+ : cover_operators< endian< endianness::little, T, n_bits >, T >
+ {
+ BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+ public:
+ typedef T value_type;
+# ifndef BOOST_ENDIAN_NO_CTORS
+ endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+ explicit endian(T val)
+ {
+# ifdef BOOST_ENDIAN_LOG
+ if ( endian_log )
+ std::clog << "little, unaligned, " << n_bits << "-bits, construct(" << val << ")\n";
+# endif
+ detail::store_little_endian<T, n_bits/8>(m_value, val);
+ }
+# endif
+ endian & operator=(T val) { detail::store_little_endian<T, n_bits/8>(m_value, val); return *this; }
+ operator T() const
+ {
+# ifdef BOOST_ENDIAN_LOG
+ if ( endian_log )
+ std::clog << "little, unaligned, " << n_bits << "-bits, convert(" << detail::load_little_endian<T, n_bits/8>(m_value) << ")\n";
+# endif
+ return detail::load_little_endian<T, n_bits/8>(m_value);
+ }
+ private:
+ char m_value[n_bits/8];
+ };
+
+ // unaligned native endian specialization
+ template <typename T, std::size_t n_bits>
+ class endian< endianness::native, T, n_bits, alignment::unaligned >
+ : cover_operators< endian< endianness::native, T, n_bits >, T >
+ {
+ BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+ public:
+ typedef T value_type;
+# ifndef BOOST_ENDIAN_NO_CTORS
+ endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+# ifdef BOOST_BIG_ENDIAN
+ explicit endian(T val) { detail::store_big_endian<T, n_bits/8>(m_value, val); }
+# else
+ explicit endian(T val) { detail::store_little_endian<T, n_bits/8>(m_value, val); }
+# endif
+# endif
+# ifdef BOOST_BIG_ENDIAN
+ endian & operator=(T val) { detail::store_big_endian<T, n_bits/8>(m_value, val); return *this; }
+ operator T() const { return detail::load_big_endian<T, n_bits/8>(m_value); }
+# else
+ endian & operator=(T val) { detail::store_little_endian<T, n_bits/8>(m_value, val); return *this; }
+ operator T() const { return detail::load_little_endian<T, n_bits/8>(m_value); }
+# endif
+ private:
+ char m_value[n_bits/8];
+ };
+
+ // Specializations that mimic built-in integer types.
+ // These typically have the same alignment as the underlying types.
+
+ // aligned big endian specialization
+ template <typename T, std::size_t n_bits>
+ class endian< endianness::big, T, n_bits, alignment::aligned >
+ : cover_operators< endian< endianness::big, T, n_bits, alignment::aligned >, T >
+ {
+ BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+ BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 );
+ public:
+ typedef T value_type;
+# ifndef BOOST_ENDIAN_NO_CTORS
+ endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+# ifdef BOOST_BIG_ENDIAN
+ endian(T val) : m_value(val) { }
+# else
+ explicit endian(T val) { detail::store_big_endian<T, sizeof(T)>(&m_value, val); }
+# endif
+# endif
+# ifdef BOOST_BIG_ENDIAN
+ endian & operator=(T val) { m_value = val; return *this; }
+ operator T() const { return m_value; }
+# else
+ endian & operator=(T val) { detail::store_big_endian<T, sizeof(T)>(&m_value, val); return *this; }
+ operator T() const { return detail::load_big_endian<T, sizeof(T)>(&m_value); }
+# endif
+ private:
+ T m_value;
+ };
+
+ // aligned little endian specialization
+ template <typename T, std::size_t n_bits>
+ class endian< endianness::little, T, n_bits, alignment::aligned >
+ : cover_operators< endian< endianness::little, T, n_bits, alignment::aligned >, T >
+ {
+ BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+ BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 );
+ public:
+ typedef T value_type;
+# ifndef BOOST_ENDIAN_NO_CTORS
+ endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+# ifdef BOOST_LITTLE_ENDIAN
+ endian(T val) : m_value(val) { }
+# else
+ explicit endian(T val) { detail::store_little_endian<T, sizeof(T)>(&m_value, val); }
+# endif
+# endif
+# ifdef BOOST_LITTLE_ENDIAN
+ endian & operator=(T val) { m_value = val; return *this; }
+ operator T() const { return m_value; }
+ #else
+ endian & operator=(T val) { detail::store_little_endian<T, sizeof(T)>(&m_value, val); return *this; }
+ operator T() const { return detail::load_little_endian<T, sizeof(T)>(&m_value); }
+ #endif
+ private:
+ T m_value;
+ };
+
+ // naming convention typedefs ------------------------------------------------------//
+
+ // unaligned big endian signed integer types
+ typedef endian< endianness::big, int_least8_t, 8 > big8_t;
+ typedef endian< endianness::big, int_least16_t, 16 > big16_t;
+ typedef endian< endianness::big, int_least32_t, 24 > big24_t;
+ typedef endian< endianness::big, int_least32_t, 32 > big32_t;
+ typedef endian< endianness::big, int_least64_t, 40 > big40_t;
+ typedef endian< endianness::big, int_least64_t, 48 > big48_t;
+ typedef endian< endianness::big, int_least64_t, 56 > big56_t;
+ typedef endian< endianness::big, int_least64_t, 64 > big64_t;
+
+ // unaligned big endian unsigned integer types
+ typedef endian< endianness::big, uint_least8_t, 8 > ubig8_t;
+ typedef endian< endianness::big, uint_least16_t, 16 > ubig16_t;
+ typedef endian< endianness::big, uint_least32_t, 24 > ubig24_t;
+ typedef endian< endianness::big, uint_least32_t, 32 > ubig32_t;
+ typedef endian< endianness::big, uint_least64_t, 40 > ubig40_t;
+ typedef endian< endianness::big, uint_least64_t, 48 > ubig48_t;
+ typedef endian< endianness::big, uint_least64_t, 56 > ubig56_t;
+ typedef endian< endianness::big, uint_least64_t, 64 > ubig64_t;
+
+ // unaligned little endian signed integer types
+ typedef endian< endianness::little, int_least8_t, 8 > little8_t;
+ typedef endian< endianness::little, int_least16_t, 16 > little16_t;
+ typedef endian< endianness::little, int_least32_t, 24 > little24_t;
+ typedef endian< endianness::little, int_least32_t, 32 > little32_t;
+ typedef endian< endianness::little, int_least64_t, 40 > little40_t;
+ typedef endian< endianness::little, int_least64_t, 48 > little48_t;
+ typedef endian< endianness::little, int_least64_t, 56 > little56_t;
+ typedef endian< endianness::little, int_least64_t, 64 > little64_t;
+
+ // unaligned little endian unsigned integer types
+ typedef endian< endianness::little, uint_least8_t, 8 > ulittle8_t;
+ typedef endian< endianness::little, uint_least16_t, 16 > ulittle16_t;
+ typedef endian< endianness::little, uint_least32_t, 24 > ulittle24_t;
+ typedef endian< endianness::little, uint_least32_t, 32 > ulittle32_t;
+ typedef endian< endianness::little, uint_least64_t, 40 > ulittle40_t;
+ typedef endian< endianness::little, uint_least64_t, 48 > ulittle48_t;
+ typedef endian< endianness::little, uint_least64_t, 56 > ulittle56_t;
+ typedef endian< endianness::little, uint_least64_t, 64 > ulittle64_t;
+
+ // unaligned native endian signed integer types
+ typedef endian< endianness::native, int_least8_t, 8 > native8_t;
+ typedef endian< endianness::native, int_least16_t, 16 > native16_t;
+ typedef endian< endianness::native, int_least32_t, 24 > native24_t;
+ typedef endian< endianness::native, int_least32_t, 32 > native32_t;
+ typedef endian< endianness::native, int_least64_t, 40 > native40_t;
+ typedef endian< endianness::native, int_least64_t, 48 > native48_t;
+ typedef endian< endianness::native, int_least64_t, 56 > native56_t;
+ typedef endian< endianness::native, int_least64_t, 64 > native64_t;
+
+ // unaligned native endian unsigned integer types
+ typedef endian< endianness::native, uint_least8_t, 8 > unative8_t;
+ typedef endian< endianness::native, uint_least16_t, 16 > unative16_t;
+ typedef endian< endianness::native, uint_least32_t, 24 > unative24_t;
+ typedef endian< endianness::native, uint_least32_t, 32 > unative32_t;
+ typedef endian< endianness::native, uint_least64_t, 40 > unative40_t;
+ typedef endian< endianness::native, uint_least64_t, 48 > unative48_t;
+ typedef endian< endianness::native, uint_least64_t, 56 > unative56_t;
+ typedef endian< endianness::native, uint_least64_t, 64 > unative64_t;
+
+#define BOOST_HAS_INT16_T
+#define BOOST_HAS_INT32_T
+#define BOOST_HAS_INT64_T
+
+ // These types only present if platform has exact size integers:
+ // aligned big endian signed integer types
+ // aligned big endian unsigned integer types
+ // aligned little endian signed integer types
+ // aligned little endian unsigned integer types
+
+ // aligned native endian typedefs are not provided because
+ // <cstdint> types are superior for this use case
+
+# if defined(BOOST_HAS_INT16_T)
+ typedef endian< endianness::big, int16_t, 16, alignment::aligned > aligned_big16_t;
+ typedef endian< endianness::big, uint16_t, 16, alignment::aligned > aligned_ubig16_t;
+ typedef endian< endianness::little, int16_t, 16, alignment::aligned > aligned_little16_t;
+ typedef endian< endianness::little, uint16_t, 16, alignment::aligned > aligned_ulittle16_t;
+# endif
+
+# if defined(BOOST_HAS_INT32_T)
+ typedef endian< endianness::big, int32_t, 32, alignment::aligned > aligned_big32_t;
+ typedef endian< endianness::big, uint32_t, 32, alignment::aligned > aligned_ubig32_t;
+ typedef endian< endianness::little, int32_t, 32, alignment::aligned > aligned_little32_t;
+ typedef endian< endianness::little, uint32_t, 32, alignment::aligned > aligned_ulittle32_t;
+# endif
+
+# if defined(BOOST_HAS_INT64_T)
+ typedef endian< endianness::big, int64_t, 64, alignment::aligned > aligned_big64_t;
+ typedef endian< endianness::big, uint64_t, 64, alignment::aligned > aligned_ubig64_t;
+ typedef endian< endianness::little, int64_t, 64, alignment::aligned > aligned_little64_t;
+ typedef endian< endianness::little, uint64_t, 64, alignment::aligned > aligned_ulittle64_t;
+# endif
+
+ } // namespace endian
+}} // namespace boost::spirit
+
+// import the namespace above into boost::endian
+namespace boost { namespace endian
+{
+ using namespace boost::spirit::endian;
+}}
+
+#if defined(__BORLANDC__) || defined( __CODEGEARC__)
+# pragma pack(pop)
+#endif
+
+#endif // BOOST_SPIRIT_ENDIAN_HPP
diff --git a/boost/spirit/home/support/detail/get_encoding.hpp b/boost/spirit/home/support/detail/get_encoding.hpp
new file mode 100644
index 0000000000..ac514a918d
--- /dev/null
+++ b/boost/spirit/home/support/detail/get_encoding.hpp
@@ -0,0 +1,75 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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_SPIRIT_GET_ENCODING_JANUARY_13_2009_1255PM)
+#define BOOST_SPIRIT_GET_ENCODING_JANUARY_13_2009_1255PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ template <typename Modifiers, typename Encoding>
+ struct get_implicit_encoding
+ {
+ // Extract the implicit encoding from the Modifiers
+ // If one is not found, Encoding is used. The explicit
+ // encoding is the first viable encoding that can be
+ // extracted from the Modifiers (there can be more than one).
+
+ typedef typename
+ mpl::find_if<
+ char_encodings,
+ has_modifier<Modifiers, tag::char_encoding_base<mpl::_1> >
+ >::type
+ iter;
+
+ typedef typename
+ mpl::eval_if<
+ is_same<iter, typename mpl::end<char_encodings>::type>,
+ mpl::identity<Encoding>,
+ mpl::deref<iter>
+ >::type
+ type;
+ };
+
+ template <typename Modifiers, typename Encoding>
+ struct get_encoding
+ {
+ // Extract the explicit encoding from the Modifiers
+ // If one is not found, get implicit encoding (see above).
+ // Explicit encoding is the encoding explicitly declared
+ // using the encoding[c] directive.
+
+ typedef typename
+ mpl::find_if<
+ char_encodings,
+ has_modifier<Modifiers, tag::char_code<tag::encoding, mpl::_1> >
+ >::type
+ iter;
+
+ typedef typename
+ mpl::eval_if<
+ is_same<iter, typename mpl::end<char_encodings>::type>,
+ get_implicit_encoding<Modifiers, Encoding>,
+ mpl::deref<iter>
+ >::type
+ type;
+ };
+
+ template <typename Modifiers, typename Encoding, bool case_modifier = false>
+ struct get_encoding_with_case : mpl::identity<Encoding> {};
+
+ template <typename Modifiers, typename Encoding>
+ struct get_encoding_with_case<Modifiers, Encoding, true>
+ : get_encoding<Modifiers, Encoding> {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/detail/hold_any.hpp b/boost/spirit/home/support/detail/hold_any.hpp
new file mode 100644
index 0000000000..4332fa2c08
--- /dev/null
+++ b/boost/spirit/home/support/detail/hold_any.hpp
@@ -0,0 +1,459 @@
+/*=============================================================================
+ Copyright (c) 2007-2011 Hartmut Kaiser
+ Copyright (c) Christopher Diggins 2005
+ Copyright (c) Pablo Aguilar 2005
+ Copyright (c) Kevlin Henney 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)
+
+ The class boost::spirit::hold_any is built based on the any class
+ published here: http://www.codeproject.com/cpp/dynamic_typing.asp. It adds
+ support for std streaming operator<<() and operator>>().
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_HOLD_ANY_MAY_02_2007_0857AM)
+#define BOOST_SPIRIT_HOLD_ANY_MAY_02_2007_0857AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/assert.hpp>
+#include <boost/detail/sp_typeinfo.hpp>
+
+#include <stdexcept>
+#include <typeinfo>
+#include <algorithm>
+#include <iosfwd>
+
+///////////////////////////////////////////////////////////////////////////////
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4100) // 'x': unreferenced formal parameter
+# pragma warning(disable: 4127) // conditional expression is constant
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ struct bad_any_cast
+ : std::bad_cast
+ {
+ bad_any_cast(boost::detail::sp_typeinfo const& src, boost::detail::sp_typeinfo const& dest)
+ : from(src.name()), to(dest.name())
+ {}
+
+ virtual const char* what() const throw() { return "bad any cast"; }
+
+ const char* from;
+ const char* to;
+ };
+
+ namespace detail
+ {
+ // function pointer table
+ template <typename Char>
+ struct fxn_ptr_table
+ {
+ boost::detail::sp_typeinfo const& (*get_type)();
+ void (*static_delete)(void**);
+ void (*destruct)(void**);
+ void (*clone)(void* const*, void**);
+ void (*move)(void* const*, void**);
+ std::basic_istream<Char>& (*stream_in)(std::basic_istream<Char>&, void**);
+ std::basic_ostream<Char>& (*stream_out)(std::basic_ostream<Char>&, void* const*);
+ };
+
+ // static functions for small value-types
+ template <typename Small>
+ struct fxns;
+
+ template <>
+ struct fxns<mpl::true_>
+ {
+ template<typename T, typename Char>
+ struct type
+ {
+ static boost::detail::sp_typeinfo const& get_type()
+ {
+ return BOOST_SP_TYPEID(T);
+ }
+ static void static_delete(void** x)
+ {
+ reinterpret_cast<T*>(x)->~T();
+ }
+ static void destruct(void** x)
+ {
+ reinterpret_cast<T*>(x)->~T();
+ }
+ static void clone(void* const* src, void** dest)
+ {
+ new (dest) T(*reinterpret_cast<T const*>(src));
+ }
+ static void move(void* const* src, void** dest)
+ {
+ reinterpret_cast<T*>(dest)->~T();
+ *reinterpret_cast<T*>(dest) =
+ *reinterpret_cast<T const*>(src);
+ }
+ static std::basic_istream<Char>&
+ stream_in (std::basic_istream<Char>& i, void** obj)
+ {
+ i >> *reinterpret_cast<T*>(obj);
+ return i;
+ }
+ static std::basic_ostream<Char>&
+ stream_out(std::basic_ostream<Char>& o, void* const* obj)
+ {
+ o << *reinterpret_cast<T const*>(obj);
+ return o;
+ }
+ };
+ };
+
+ // static functions for big value-types (bigger than a void*)
+ template <>
+ struct fxns<mpl::false_>
+ {
+ template<typename T, typename Char>
+ struct type
+ {
+ static boost::detail::sp_typeinfo const& get_type()
+ {
+ return BOOST_SP_TYPEID(T);
+ }
+ static void static_delete(void** x)
+ {
+ // destruct and free memory
+ delete (*reinterpret_cast<T**>(x));
+ }
+ static void destruct(void** x)
+ {
+ // destruct only, we'll reuse memory
+ (*reinterpret_cast<T**>(x))->~T();
+ }
+ static void clone(void* const* src, void** dest)
+ {
+ *dest = new T(**reinterpret_cast<T* const*>(src));
+ }
+ static void move(void* const* src, void** dest)
+ {
+ (*reinterpret_cast<T**>(dest))->~T();
+ **reinterpret_cast<T**>(dest) =
+ **reinterpret_cast<T* const*>(src);
+ }
+ static std::basic_istream<Char>&
+ stream_in(std::basic_istream<Char>& i, void** obj)
+ {
+ i >> **reinterpret_cast<T**>(obj);
+ return i;
+ }
+ static std::basic_ostream<Char>&
+ stream_out(std::basic_ostream<Char>& o, void* const* obj)
+ {
+ o << **reinterpret_cast<T* const*>(obj);
+ return o;
+ }
+ };
+ };
+
+ template <typename T>
+ struct get_table
+ {
+ typedef mpl::bool_<(sizeof(T) <= sizeof(void*))> is_small;
+
+ template <typename Char>
+ static fxn_ptr_table<Char>* get()
+ {
+ static fxn_ptr_table<Char> static_table =
+ {
+ fxns<is_small>::template type<T, Char>::get_type,
+ fxns<is_small>::template type<T, Char>::static_delete,
+ fxns<is_small>::template type<T, Char>::destruct,
+ fxns<is_small>::template type<T, Char>::clone,
+ fxns<is_small>::template type<T, Char>::move,
+ fxns<is_small>::template type<T, Char>::stream_in,
+ fxns<is_small>::template type<T, Char>::stream_out
+ };
+ return &static_table;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ struct empty {};
+
+ template <typename Char>
+ inline std::basic_istream<Char>&
+ operator>> (std::basic_istream<Char>& i, empty&)
+ {
+ // If this assertion fires you tried to insert from a std istream
+ // into an empty hold_any instance. This simply can't work, because
+ // there is no way to figure out what type to extract from the
+ // stream.
+ // The only way to make this work is to assign an arbitrary
+ // value of the required type to the hold_any instance you want to
+ // stream to. This assignment has to be executed before the actual
+ // call to the operator>>().
+ BOOST_ASSERT(false &&
+ "Tried to insert from a std istream into an empty "
+ "hold_any instance");
+ return i;
+ }
+
+ template <typename Char>
+ inline std::basic_ostream<Char>&
+ operator<< (std::basic_ostream<Char>& o, empty const&)
+ {
+ return o;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char>
+ class basic_hold_any
+ {
+ public:
+ // constructors
+ template <typename T>
+ explicit basic_hold_any(T const& x)
+ : table(spirit::detail::get_table<T>::template get<Char>()), object(0)
+ {
+ if (spirit::detail::get_table<T>::is_small::value)
+ new (&object) T(x);
+ else
+ object = new T(x);
+ }
+
+ basic_hold_any()
+ : table(spirit::detail::get_table<spirit::detail::empty>::template get<Char>()),
+ object(0)
+ {
+ }
+
+ basic_hold_any(basic_hold_any const& x)
+ : table(spirit::detail::get_table<spirit::detail::empty>::template get<Char>()),
+ object(0)
+ {
+ assign(x);
+ }
+
+ ~basic_hold_any()
+ {
+ table->static_delete(&object);
+ }
+
+ // assignment
+ basic_hold_any& assign(basic_hold_any const& x)
+ {
+ if (&x != this) {
+ // are we copying between the same type?
+ if (table == x.table) {
+ // if so, we can avoid reallocation
+ table->move(&x.object, &object);
+ }
+ else {
+ reset();
+ x.table->clone(&x.object, &object);
+ table = x.table;
+ }
+ }
+ return *this;
+ }
+
+ template <typename T>
+ basic_hold_any& assign(T const& x)
+ {
+ // are we copying between the same type?
+ spirit::detail::fxn_ptr_table<Char>* x_table =
+ spirit::detail::get_table<T>::template get<Char>();
+ if (table == x_table) {
+ // if so, we can avoid deallocating and re-use memory
+ table->destruct(&object); // first destruct the old content
+ if (spirit::detail::get_table<T>::is_small::value) {
+ // create copy on-top of object pointer itself
+ new (&object) T(x);
+ }
+ else {
+ // create copy on-top of old version
+ new (object) T(x);
+ }
+ }
+ else {
+ if (spirit::detail::get_table<T>::is_small::value) {
+ // create copy on-top of object pointer itself
+ table->destruct(&object); // first destruct the old content
+ new (&object) T(x);
+ }
+ else {
+ reset(); // first delete the old content
+ object = new T(x);
+ }
+ table = x_table; // update table pointer
+ }
+ return *this;
+ }
+
+ // assignment operator
+ template <typename T>
+ basic_hold_any& operator=(T const& x)
+ {
+ return assign(x);
+ }
+
+ // utility functions
+ basic_hold_any& swap(basic_hold_any& x)
+ {
+ std::swap(table, x.table);
+ std::swap(object, x.object);
+ return *this;
+ }
+
+ boost::detail::sp_typeinfo const& type() const
+ {
+ return table->get_type();
+ }
+
+ template <typename T>
+ T const& cast() const
+ {
+ if (type() != BOOST_SP_TYPEID(T))
+ throw bad_any_cast(type(), BOOST_SP_TYPEID(T));
+
+ return spirit::detail::get_table<T>::is_small::value ?
+ *reinterpret_cast<T const*>(&object) :
+ *reinterpret_cast<T const*>(object);
+ }
+
+// implicit casting is disabled by default for compatibility with boost::any
+#ifdef BOOST_SPIRIT_ANY_IMPLICIT_CASTING
+ // automatic casting operator
+ template <typename T>
+ operator T const& () const { return cast<T>(); }
+#endif // implicit casting
+
+ bool empty() const
+ {
+ return table == spirit::detail::get_table<spirit::detail::empty>::template get<Char>();
+ }
+
+ void reset()
+ {
+ if (!empty())
+ {
+ table->static_delete(&object);
+ table = spirit::detail::get_table<spirit::detail::empty>::template get<Char>();
+ object = 0;
+ }
+ }
+
+ // these functions have been added in the assumption that the embedded
+ // type has a corresponding operator defined, which is completely safe
+ // because spirit::hold_any is used only in contexts where these operators
+ // do exist
+ template <typename Char_>
+ friend inline std::basic_istream<Char_>&
+ operator>> (std::basic_istream<Char_>& i, basic_hold_any<Char_>& obj)
+ {
+ return obj.table->stream_in(i, &obj.object);
+ }
+
+ template <typename Char_>
+ friend inline std::basic_ostream<Char_>&
+ operator<< (std::basic_ostream<Char_>& o, basic_hold_any<Char_> const& obj)
+ {
+ return obj.table->stream_out(o, &obj.object);
+ }
+
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+ private: // types
+ template <typename T, typename Char_>
+ friend T* any_cast(basic_hold_any<Char_> *);
+#else
+ public: // types (public so any_cast can be non-friend)
+#endif
+ // fields
+ spirit::detail::fxn_ptr_table<Char>* table;
+ void* object;
+ };
+
+ // boost::any-like casting
+ template <typename T, typename Char>
+ inline T* any_cast (basic_hold_any<Char>* operand)
+ {
+ if (operand && operand->type() == BOOST_SP_TYPEID(T)) {
+ return spirit::detail::get_table<T>::is_small::value ?
+ reinterpret_cast<T*>(&operand->object) :
+ reinterpret_cast<T*>(operand->object);
+ }
+ return 0;
+ }
+
+ template <typename T, typename Char>
+ inline T const* any_cast(basic_hold_any<Char> const* operand)
+ {
+ return any_cast<T>(const_cast<basic_hold_any<Char>*>(operand));
+ }
+
+ template <typename T, typename Char>
+ T any_cast(basic_hold_any<Char>& operand)
+ {
+ typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type nonref;
+
+#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+ // If 'nonref' is still reference type, it means the user has not
+ // specialized 'remove_reference'.
+
+ // Please use BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION macro
+ // to generate specialization of remove_reference for your class
+ // See type traits library documentation for details
+ BOOST_STATIC_ASSERT(!is_reference<nonref>::value);
+#endif
+
+ nonref* result = any_cast<nonref>(&operand);
+ if(!result)
+ boost::throw_exception(bad_any_cast(operand.type(), BOOST_SP_TYPEID(T)));
+ return *result;
+ }
+
+ template <typename T, typename Char>
+ T const& any_cast(basic_hold_any<Char> const& operand)
+ {
+ typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type nonref;
+
+#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+ // The comment in the above version of 'any_cast' explains when this
+ // assert is fired and what to do.
+ BOOST_STATIC_ASSERT(!is_reference<nonref>::value);
+#endif
+
+ return any_cast<nonref const&>(const_cast<basic_hold_any<Char> &>(operand));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////
+ // backwards compatibility
+ typedef basic_hold_any<char> hold_any;
+ typedef basic_hold_any<wchar_t> whold_any;
+
+ namespace traits
+ {
+ template <typename T>
+ struct is_hold_any : mpl::false_ {};
+
+ template <typename Char>
+ struct is_hold_any<basic_hold_any<Char> > : mpl::true_ {};
+ }
+
+}} // namespace boost::spirit
+
+///////////////////////////////////////////////////////////////////////////////
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/detail/is_spirit_tag.hpp b/boost/spirit/home/support/detail/is_spirit_tag.hpp
new file mode 100644
index 0000000000..73269e22e1
--- /dev/null
+++ b/boost/spirit/home/support/detail/is_spirit_tag.hpp
@@ -0,0 +1,20 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_SUPPORT_DETAIL_IS_SPIRIT_TAG_MAR_28_2011_0341PM)
+#define BOOST_SPIRIT_SUPPORT_DETAIL_IS_SPIRIT_TAG_MAR_28_2011_0341PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#define BOOST_SPIRIT_IS_TAG()
+#else
+#define BOOST_SPIRIT_IS_TAG() typedef void is_spirit_tag;
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/char_traits.hpp b/boost/spirit/home/support/detail/lexer/char_traits.hpp
new file mode 100644
index 0000000000..6b112ad79d
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/char_traits.hpp
@@ -0,0 +1,54 @@
+// char_traits.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_CHAR_TRAITS_H
+#define BOOST_LEXER_CHAR_TRAITS_H
+
+// Make sure wchar_t is defined
+#include <string>
+
+namespace boost
+{
+namespace lexer
+{
+template<typename CharT>
+struct char_traits
+{
+ typedef CharT char_type;
+ typedef CharT index_type;
+
+ static index_type call (CharT ch)
+ {
+ return ch;
+ }
+};
+
+template<>
+struct char_traits<char>
+{
+ typedef char char_type;
+ typedef unsigned char index_type;
+
+ static index_type call (char ch)
+ {
+ return static_cast<index_type>(ch);
+ }
+};
+
+template<>
+struct char_traits<wchar_t>
+{
+ typedef wchar_t char_type;
+ typedef wchar_t index_type;
+
+ static index_type call (wchar_t ch)
+ {
+ return ch;
+ }
+};
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/consts.hpp b/boost/spirit/home/support/detail/lexer/consts.hpp
new file mode 100644
index 0000000000..a8a8ccef40
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/consts.hpp
@@ -0,0 +1,39 @@
+// consts.h
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_CONSTS_H
+#define BOOST_LEXER_CONSTS_H
+
+#include <boost/config.hpp>
+#include <boost/integer_traits.hpp>
+#include "size_t.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+ enum regex_flags {none = 0, icase = 1, dot_not_newline = 2};
+ // 0 = end state, 1 = id, 2 = unique_id, 3 = lex state, 4 = bol, 5 = eol,
+ // 6 = dead_state_index
+ enum {end_state_index, id_index, unique_id_index, state_index, bol_index,
+ eol_index, dead_state_index, dfa_offset};
+
+ const std::size_t max_macro_len = 30;
+ const std::size_t num_chars = 256;
+ // If sizeof(wchar_t) == sizeof(size_t) then don't overflow to 0
+ // by adding one to comparison.
+ const std::size_t num_wchar_ts =
+ (boost::integer_traits<wchar_t>::const_max < 0x110000) ?
+ boost::integer_traits<wchar_t>::const_max +
+ static_cast<std::size_t> (1) : 0x110000;
+ const std::size_t null_token = static_cast<std::size_t> (~0);
+ const std::size_t bol_token = static_cast<std::size_t> (~1);
+ const std::size_t eol_token = static_cast<std::size_t> (~2);
+ const std::size_t end_state = 1;
+ const std::size_t npos = static_cast<std::size_t> (~0);
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/containers/ptr_list.hpp b/boost/spirit/home/support/detail/lexer/containers/ptr_list.hpp
new file mode 100644
index 0000000000..5995849346
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/containers/ptr_list.hpp
@@ -0,0 +1,71 @@
+// ptr_list.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_PTR_LIST_HPP
+#define BOOST_LEXER_PTR_LIST_HPP
+
+#include <list>
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename Type>
+class ptr_list
+{
+public:
+ typedef std::list<Type *> list;
+
+ ptr_list ()
+ {
+ }
+
+ ~ptr_list ()
+ {
+ clear ();
+ }
+
+ list *operator -> ()
+ {
+ return &_list;
+ }
+
+ const list *operator -> () const
+ {
+ return &_list;
+ }
+
+ list &operator * ()
+ {
+ return _list;
+ }
+
+ const list &operator * () const
+ {
+ return _list;
+ }
+
+ void clear ()
+ {
+ while (!_list.empty ())
+ {
+ delete _list.front ();
+ _list.pop_front ();
+ }
+ }
+
+private:
+ list _list;
+
+ ptr_list (const ptr_list &); // No copy construction.
+ ptr_list &operator = (const ptr_list &); // No assignment.
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/containers/ptr_vector.hpp b/boost/spirit/home/support/detail/lexer/containers/ptr_vector.hpp
new file mode 100644
index 0000000000..98411e676c
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/containers/ptr_vector.hpp
@@ -0,0 +1,108 @@
+// ptr_vector.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_PTR_VECTOR_HPP
+#define BOOST_LEXER_PTR_VECTOR_HPP
+
+#include "../size_t.hpp"
+#include <vector>
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename Type>
+class ptr_vector
+{
+public:
+ typedef std::vector<Type *> vector;
+
+ ptr_vector ()
+ {
+ }
+
+ ~ptr_vector ()
+ {
+ clear ();
+ }
+
+ vector *operator -> ()
+ {
+ return &_vector;
+ }
+
+ const vector *operator -> () const
+ {
+ return &_vector;
+ }
+
+ vector &operator * ()
+ {
+ return _vector;
+ }
+
+ const vector &operator * () const
+ {
+ return _vector;
+ }
+
+ Type * &operator [] (const std::size_t index_)
+ {
+ return _vector[index_];
+ }
+
+ Type * const &operator [] (const std::size_t index_) const
+ {
+ return _vector[index_];
+ }
+
+ bool operator == (const ptr_vector &rhs_) const
+ {
+ bool equal_ = _vector.size () == rhs_._vector.size ();
+
+ if (equal_)
+ {
+ typename vector::const_iterator lhs_iter_ = _vector.begin ();
+ typename vector::const_iterator end_ = _vector.end ();
+ typename vector::const_iterator rhs_iter_ = rhs_._vector.begin ();
+
+ for (; equal_ && lhs_iter_ != end_; ++lhs_iter_, ++rhs_iter_)
+ {
+ equal_ = **lhs_iter_ == **rhs_iter_;
+ }
+ }
+
+ return equal_;
+ }
+
+ void clear ()
+ {
+ if (!_vector.empty ())
+ {
+ Type **iter_ = &_vector.front ();
+ Type **end_ = iter_ + _vector.size ();
+
+ for (; iter_ != end_; ++iter_)
+ {
+ delete *iter_;
+ }
+ }
+
+ _vector.clear ();
+ }
+
+private:
+ vector _vector;
+
+ ptr_vector (const ptr_vector &); // No copy construction.
+ ptr_vector &operator = (const ptr_vector &); // No assignment.
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/conversion/char_state_machine.hpp b/boost/spirit/home/support/detail/lexer/conversion/char_state_machine.hpp
new file mode 100644
index 0000000000..38c70b5476
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/conversion/char_state_machine.hpp
@@ -0,0 +1,77 @@
+// char_state_machine.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_CHAR_STATE_MACHINE_HPP
+#define BOOST_LEXER_CHAR_STATE_MACHINE_HPP
+
+#include "../consts.hpp"
+#include <map>
+#include "../size_t.hpp"
+#include "../string_token.hpp"
+#include <vector>
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename CharT>
+struct basic_char_state_machine
+{
+ struct state
+ {
+ typedef basic_string_token<CharT> string_token;
+ typedef std::map<std::size_t, string_token> size_t_string_token_map;
+ typedef std::pair<std::size_t, string_token> size_t_string_token_pair;
+
+ bool _end_state;
+ std::size_t _id;
+ std::size_t _unique_id;
+ std::size_t _state;
+ std::size_t _bol_index;
+ std::size_t _eol_index;
+ size_t_string_token_map _transitions;
+
+ state () :
+ _end_state (false),
+ _id (0),
+ _unique_id (npos),
+ _state (0),
+ _bol_index (npos),
+ _eol_index (npos)
+ {
+ }
+ };
+
+ typedef std::vector<state> state_vector;
+ typedef std::vector<state_vector> state_vector_vector;
+
+ state_vector_vector _sm_vector;
+
+ bool empty () const
+ {
+ return _sm_vector.empty ();
+ }
+
+ void clear ()
+ {
+ _sm_vector.clear ();
+ }
+
+ void swap (basic_char_state_machine &csm_)
+ {
+ _sm_vector.swap (csm_._sm_vector);
+ }
+};
+
+typedef basic_char_state_machine<char> char_state_machine;
+typedef basic_char_state_machine<wchar_t> wchar_state_machine;
+
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/debug.hpp b/boost/spirit/home/support/detail/lexer/debug.hpp
new file mode 100644
index 0000000000..23cda87315
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/debug.hpp
@@ -0,0 +1,285 @@
+// debug.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_DEBUG_HPP
+#define BOOST_LEXER_DEBUG_HPP
+
+#include <map>
+#include <ostream>
+#include "rules.hpp"
+#include "size_t.hpp"
+#include "state_machine.hpp"
+#include "string_token.hpp"
+#include <vector>
+
+namespace boost
+{
+namespace lexer
+{
+template<typename CharT>
+class basic_debug
+{
+public:
+ typedef std::basic_ostream<CharT> ostream;
+ typedef std::basic_string<CharT> string;
+ typedef std::vector<std::size_t> size_t_vector;
+
+ static void escape_control_chars (const string &in_, string &out_)
+ {
+ const CharT *ptr_ = in_.c_str ();
+ std::size_t size_ = in_.size ();
+
+#if defined _MSC_VER && _MSC_VER <= 1200
+ out_.erase ();
+#else
+ out_.clear ();
+#endif
+
+ while (size_)
+ {
+ basic_string_token<CharT>::escape_char (*ptr_, out_);
+ ++ptr_;
+ --size_;
+ }
+ }
+
+ static void dump (const basic_state_machine<CharT> &state_machine_,
+ basic_rules<CharT> &rules_, ostream &stream_)
+ {
+ typename basic_state_machine<CharT>::iterator iter_ =
+ state_machine_.begin ();
+ typename basic_state_machine<CharT>::iterator end_ =
+ state_machine_.end ();
+
+ for (std::size_t dfa_ = 0, dfas_ = state_machine_.size ();
+ dfa_ < dfas_; ++dfa_)
+ {
+ lexer_state (stream_);
+ stream_ << rules_.state (dfa_) << std::endl << std::endl;
+
+ dump_ex (iter_, stream_);
+ }
+ }
+
+ static void dump (const basic_state_machine<CharT> &state_machine_,
+ ostream &stream_)
+ {
+ typename basic_state_machine<CharT>::iterator iter_ =
+ state_machine_.begin ();
+ typename basic_state_machine<CharT>::iterator end_ =
+ state_machine_.end ();
+
+ for (std::size_t dfa_ = 0, dfas_ = state_machine_.size ();
+ dfa_ < dfas_; ++dfa_)
+ {
+ lexer_state (stream_);
+ stream_ << dfa_ << std::endl << std::endl;
+
+ dump_ex (iter_, stream_);
+ }
+ }
+
+protected:
+ typedef std::basic_stringstream<CharT> stringstream;
+
+ static void dump_ex (typename basic_state_machine<CharT>::iterator &iter_,
+ ostream &stream_)
+ {
+ const std::size_t states_ = iter_->states;
+
+ for (std::size_t i_ = 0; i_ < states_; ++i_)
+ {
+ state (stream_);
+ stream_ << i_ << std::endl;
+
+ if (iter_->end_state)
+ {
+ end_state (stream_);
+ stream_ << iter_->id;
+ unique_id (stream_);
+ stream_ << iter_->unique_id;
+ dfa (stream_);
+ stream_ << iter_->goto_dfa;
+ stream_ << std::endl;
+ }
+
+ if (iter_->bol_index != npos)
+ {
+ bol (stream_);
+ stream_ << iter_->bol_index << std::endl;
+ }
+
+ if (iter_->eol_index != npos)
+ {
+ eol (stream_);
+ stream_ << iter_->eol_index << std::endl;
+ }
+
+ const std::size_t transitions_ = iter_->transitions;
+
+ if (transitions_ == 0)
+ {
+ ++iter_;
+ }
+
+ for (std::size_t t_ = 0; t_ < transitions_; ++t_)
+ {
+ std::size_t goto_state_ = iter_->goto_state;
+
+ if (iter_->token.any ())
+ {
+ any (stream_);
+ }
+ else
+ {
+ open_bracket (stream_);
+
+ if (iter_->token._negated)
+ {
+ negated (stream_);
+ }
+
+ string charset_;
+ CharT c_ = 0;
+
+ escape_control_chars (iter_->token._charset,
+ charset_);
+ c_ = *charset_.c_str ();
+
+ if (!iter_->token._negated &&
+ (c_ == '^' || c_ == ']'))
+ {
+ stream_ << '\\';
+ }
+
+ stream_ << charset_;
+ close_bracket (stream_);
+ }
+
+ stream_ << goto_state_ << std::endl;
+ ++iter_;
+ }
+
+ stream_ << std::endl;
+ }
+ }
+
+ static void lexer_state (std::ostream &stream_)
+ {
+ stream_ << "Lexer state: ";
+ }
+
+ static void lexer_state (std::wostream &stream_)
+ {
+ stream_ << L"Lexer state: ";
+ }
+
+ static void state (std::ostream &stream_)
+ {
+ stream_ << "State: ";
+ }
+
+ static void state (std::wostream &stream_)
+ {
+ stream_ << L"State: ";
+ }
+
+ static void bol (std::ostream &stream_)
+ {
+ stream_ << " BOL -> ";
+ }
+
+ static void bol (std::wostream &stream_)
+ {
+ stream_ << L" BOL -> ";
+ }
+
+ static void eol (std::ostream &stream_)
+ {
+ stream_ << " EOL -> ";
+ }
+
+ static void eol (std::wostream &stream_)
+ {
+ stream_ << L" EOL -> ";
+ }
+
+ static void end_state (std::ostream &stream_)
+ {
+ stream_ << " END STATE, Id = ";
+ }
+
+ static void end_state (std::wostream &stream_)
+ {
+ stream_ << L" END STATE, Id = ";
+ }
+
+ static void unique_id (std::ostream &stream_)
+ {
+ stream_ << ", Unique Id = ";
+ }
+
+ static void unique_id (std::wostream &stream_)
+ {
+ stream_ << L", Unique Id = ";
+ }
+
+ static void any (std::ostream &stream_)
+ {
+ stream_ << " . -> ";
+ }
+
+ static void any (std::wostream &stream_)
+ {
+ stream_ << L" . -> ";
+ }
+
+ static void open_bracket (std::ostream &stream_)
+ {
+ stream_ << " [";
+ }
+
+ static void open_bracket (std::wostream &stream_)
+ {
+ stream_ << L" [";
+ }
+
+ static void negated (std::ostream &stream_)
+ {
+ stream_ << "^";
+ }
+
+ static void negated (std::wostream &stream_)
+ {
+ stream_ << L"^";
+ }
+
+ static void close_bracket (std::ostream &stream_)
+ {
+ stream_ << "] -> ";
+ }
+
+ static void close_bracket (std::wostream &stream_)
+ {
+ stream_ << L"] -> ";
+ }
+
+ static void dfa (std::ostream &stream_)
+ {
+ stream_ << ", dfa = ";
+ }
+
+ static void dfa (std::wostream &stream_)
+ {
+ stream_ << L", dfa = ";
+ }
+};
+
+typedef basic_debug<char> debug;
+typedef basic_debug<wchar_t> wdebug;
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/file_input.hpp b/boost/spirit/home/support/detail/lexer/file_input.hpp
new file mode 100644
index 0000000000..bf7dba742f
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/file_input.hpp
@@ -0,0 +1,483 @@
+// file_input.hpp
+// Copyright (c) 2008-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_FILE_INPUT
+#define BOOST_LEXER_FILE_INPUT
+
+#include "char_traits.hpp"
+// memcpy
+#include <cstring>
+#include <fstream>
+#include "size_t.hpp"
+#include "state_machine.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+template<typename CharT, typename Traits = char_traits<CharT> >
+class basic_file_input
+{
+public:
+ class iterator
+ {
+ public:
+#if defined _MSC_VER && _MSC_VER <= 1200
+ friend basic_file_input;
+#else
+ friend class basic_file_input;
+#endif
+
+ struct data
+ {
+ std::size_t id;
+ std::size_t unique_id;
+ const CharT *start;
+ const CharT *end;
+ std::size_t state;
+
+ // Construct in end() state.
+ data () :
+ id (0),
+ unique_id (npos),
+ state (npos)
+ {
+ }
+
+ bool operator == (const data &rhs_) const
+ {
+ return id == rhs_.id && unique_id == rhs_.unique_id &&
+ start == rhs_.start && end == rhs_.end &&
+ state == rhs_.state;
+ }
+ };
+
+ iterator () :
+ _input (0)
+ {
+ }
+
+ bool operator == (const iterator &rhs_) const
+ {
+ return _data == rhs_._data;
+ }
+
+ bool operator != (const iterator &rhs_) const
+ {
+ return !(*this == rhs_);
+ }
+
+ data &operator * ()
+ {
+ return _data;
+ }
+
+ data *operator -> ()
+ {
+ return &_data;
+ }
+
+ // Let compiler generate operator = ().
+
+ // prefix version
+ iterator &operator ++ ()
+ {
+ next_token ();
+ return *this;
+ }
+
+ // postfix version
+ iterator operator ++ (int)
+ {
+ iterator iter_ = *this;
+
+ next_token ();
+ return iter_;
+ }
+
+ void next_token ()
+ {
+ const detail::internals &internals_ =
+ _input->_state_machine->data ();
+
+ _data.start = _data.end;
+
+ if (internals_._dfa->size () == 1)
+ {
+ _data.id = _input->next (&internals_._lookup->front ()->
+ front (), internals_._dfa_alphabet.front (),
+ &internals_._dfa->front ()->front (), _data.start,
+ _data.end, _data.unique_id);
+ }
+ else
+ {
+ _data.id = _input->next (internals_, _data.state, _data.start,
+ _data.end, _data.unique_id);
+ }
+
+ if (_data.id == 0)
+ {
+ _data.start = 0;
+ _data.end = 0;
+ // Ensure current state matches that returned by end().
+ _data.state = npos;
+ }
+ }
+
+ private:
+ // Not owner (obviously!)
+ basic_file_input *_input;
+ data _data;
+ };
+
+#if defined _MSC_VER && _MSC_VER <= 1200
+ friend iterator;
+#else
+ friend class iterator;
+#endif
+
+ // Make it explict that we are NOT taking a copy of state_machine_!
+ basic_file_input (const basic_state_machine<CharT> *state_machine_,
+ std::basic_ifstream<CharT> *is_,
+ const std::streamsize buffer_size_ = 4096,
+ const std::streamsize buffer_increment_ = 1024) :
+ _state_machine (state_machine_),
+ _stream (is_),
+ _buffer_size (buffer_size_),
+ _buffer_increment (buffer_increment_),
+ _buffer (_buffer_size, '!')
+ {
+ _start_buffer = &_buffer.front ();
+ _end_buffer = _start_buffer + _buffer.size ();
+ _start_token = _end_buffer;
+ _end_token = _end_buffer;
+ }
+
+ iterator begin ()
+ {
+ iterator iter_;
+
+ iter_._input = this;
+ // Over-ride default of 0 (EOF)
+ iter_._data.id = npos;
+ iter_._data.start = 0;
+ iter_._data.end = 0;
+ iter_._data.state = 0;
+ ++iter_;
+ return iter_;
+ }
+
+ iterator end ()
+ {
+ iterator iter_;
+
+ iter_._input = this;
+ iter_._data.start = 0;
+ iter_._data.end = 0;
+ return iter_;
+ }
+
+ void flush ()
+ {
+ // This temporary is mandatory, otherwise the
+ // pointer calculations won't work!
+ const CharT *temp_ = _end_buffer;
+
+ _start_token = _end_token = _end_buffer;
+ reload_buffer (temp_, true, _end_token);
+ }
+
+private:
+ typedef std::basic_istream<CharT> istream;
+ typedef std::vector<CharT> buffer;
+
+ const basic_state_machine<CharT> *_state_machine;
+ const std::streamsize _buffer_size;
+ const std::streamsize _buffer_increment;
+
+ buffer _buffer;
+ CharT *_start_buffer;
+ istream *_stream;
+ const CharT *_start_token;
+ const CharT *_end_token;
+ CharT *_end_buffer;
+
+ std::size_t next (const detail::internals &internals_,
+ std::size_t &start_state_, const CharT * &start_, const CharT * &end_,
+ std::size_t &unique_id_)
+ {
+ _start_token = _end_token;
+
+again:
+ const std::size_t * lookup_ = &internals_._lookup[start_state_]->
+ front ();
+ std::size_t dfa_alphabet_ = internals_._dfa_alphabet[start_state_];
+ const std::size_t *dfa_ = &internals_._dfa[start_state_]->front ();
+ const std::size_t *ptr_ = dfa_ + dfa_alphabet_;
+ const CharT *curr_ = _start_token;
+ bool end_state_ = *ptr_ != 0;
+ std::size_t id_ = *(ptr_ + id_index);
+ std::size_t uid_ = *(ptr_ + unique_id_index);
+ const CharT *end_token_ = curr_;
+
+ for (;;)
+ {
+ if (curr_ >= _end_buffer)
+ {
+ if (!reload_buffer (curr_, end_state_, end_token_))
+ {
+ // EOF
+ break;
+ }
+ }
+
+ const std::size_t BOL_state_ = ptr_[bol_index];
+ const std::size_t EOL_state_ = ptr_[eol_index];
+
+ if (BOL_state_ && (_start_token == _start_buffer ||
+ *(_start_token - 1) == '\n'))
+ {
+ ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];
+ }
+ else if (EOL_state_ && *curr_ == '\n')
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+ }
+ else
+ {
+ const std::size_t state_ =
+ ptr_[lookup_[static_cast<typename Traits::index_type>
+ (*curr_++)]];
+
+ if (state_ == 0)
+ {
+ break;
+ }
+
+ ptr_ = &dfa_[state_ * dfa_alphabet_];
+ }
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ start_state_ = *(ptr_ + state_index);
+ end_token_ = curr_;
+ }
+ }
+
+ if (_start_token >= _end_buffer)
+ {
+ // No more tokens...
+ unique_id_ = npos;
+ return 0;
+ }
+
+ const std::size_t EOL_state_ = ptr_[eol_index];
+
+ if (EOL_state_ && curr_ == end_)
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ start_state_ = *(ptr_ + state_index);
+ end_token_ = curr_;
+ }
+ }
+
+ if (end_state_)
+ {
+ // return longest match
+ _end_token = end_token_;
+
+ if (id_ == 0) goto again;
+ }
+ else
+ {
+ // No match causes char to be skipped
+ _end_token = _start_token + 1;
+ id_ = npos;
+ uid_ = npos;
+ }
+
+ start_ = _start_token;
+ end_ = _end_token;
+ unique_id_ = uid_;
+ return id_;
+ }
+
+ std::size_t next (const std::size_t * const lookup_,
+ const std::size_t dfa_alphabet_, const std::size_t * const dfa_,
+ const CharT * &start_, const CharT * &end_, std::size_t &unique_id_)
+ {
+ _start_token = _end_token;
+
+ const std::size_t *ptr_ = dfa_ + dfa_alphabet_;
+ const CharT *curr_ = _start_token;
+ bool end_state_ = *ptr_ != 0;
+ std::size_t id_ = *(ptr_ + id_index);
+ std::size_t uid_ = *(ptr_ + unique_id_index);
+ const CharT *end_token_ = curr_;
+
+ for (;;)
+ {
+ if (curr_ >= _end_buffer)
+ {
+ if (!reload_buffer (curr_, end_state_, end_token_))
+ {
+ // EOF
+ break;
+ }
+ }
+
+ const std::size_t BOL_state_ = ptr_[bol_index];
+ const std::size_t EOL_state_ = ptr_[eol_index];
+
+ if (BOL_state_ && (_start_token == _start_buffer ||
+ *(_start_token - 1) == '\n'))
+ {
+ ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];
+ }
+ else if (EOL_state_ && *curr_ == '\n')
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+ }
+ else
+ {
+ const std::size_t state_ =
+ ptr_[lookup_[static_cast<typename Traits::index_type>
+ (*curr_++)]];
+
+ if (state_ == 0)
+ {
+ break;
+ }
+
+ ptr_ = &dfa_[state_ * dfa_alphabet_];
+ }
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ end_token_ = curr_;
+ }
+ }
+
+ if (_start_token >= _end_buffer)
+ {
+ // No more tokens...
+ unique_id_ = npos;
+ return 0;
+ }
+
+ const std::size_t EOL_state_ = ptr_[eol_index];
+
+ if (EOL_state_ && curr_ == end_)
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ end_token_ = curr_;
+ }
+ }
+
+ if (end_state_)
+ {
+ // return longest match
+ _end_token = end_token_;
+ }
+ else
+ {
+ // No match causes char to be skipped
+ _end_token = _start_token + 1;
+ id_ = npos;
+ uid_ = npos;
+ }
+
+ start_ = _start_token;
+ end_ = _end_token;
+ unique_id_ = uid_;
+ return id_;
+ }
+
+ bool reload_buffer (const CharT * &curr_, const bool end_state_,
+ const CharT * &end_token_)
+ {
+ bool success_ = !_stream->eof ();
+
+ if (success_)
+ {
+ const CharT *old_start_token_ = _start_token;
+ std::size_t old_size_ = _buffer.size ();
+ std::size_t count_ = 0;
+
+ if (_start_token - 1 == _start_buffer)
+ {
+ // Run out of buffer space, so increase.
+ _buffer.resize (old_size_ + _buffer_increment, '!');
+ _start_buffer = &_buffer.front ();
+ _start_token = _start_buffer + 1;
+ _stream->read (_start_buffer + old_size_,
+ _buffer_increment);
+ count_ = _stream->gcount ();
+ _end_buffer = _start_buffer + old_size_ + count_;
+ }
+ else if (_start_token < _end_buffer)
+ {
+ const std::size_t len_ = _end_buffer - _start_token;
+ // Some systems have memcpy in namespace std.
+ using namespace std;
+
+ memcpy (_start_buffer, _start_token - 1, (len_ + 1) *
+ sizeof (CharT));
+ _stream->read (_start_buffer + len_ + 1,
+ static_cast<std::streamsize> (_buffer.size () - len_ - 1));
+ count_ = _stream->gcount ();
+ _start_token = _start_buffer + 1;
+ _end_buffer = _start_buffer + len_ + 1 + count_;
+ }
+ else
+ {
+ _stream->read (_start_buffer, static_cast<std::streamsize>
+ (_buffer.size ()));
+ count_ = _stream->gcount ();
+ _start_token = _start_buffer;
+ _end_buffer = _start_buffer + count_;
+ }
+
+ if (end_state_)
+ {
+ end_token_ = _start_token +
+ (end_token_ - old_start_token_);
+ }
+
+ curr_ = _start_token + (curr_ - old_start_token_);
+ }
+
+ return success_;
+ }
+
+ // Disallow copying of buffer
+ basic_file_input (const basic_file_input &);
+ const basic_file_input &operator = (const basic_file_input &);
+};
+
+typedef basic_file_input<char> file_input;
+typedef basic_file_input<wchar_t> wfile_input;
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/generate_cpp.hpp b/boost/spirit/home/support/detail/lexer/generate_cpp.hpp
new file mode 100644
index 0000000000..f1f05536b8
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/generate_cpp.hpp
@@ -0,0 +1,577 @@
+// generate_cpp.hpp
+// Copyright (c) 2008-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_GENERATE_CPP_HPP
+#define BOOST_LEXER_GENERATE_CPP_HPP
+
+#include "char_traits.hpp"
+#include "consts.hpp"
+#include "internals.hpp"
+#include <iostream>
+#include <boost/detail/iterator.hpp>
+#include "runtime_error.hpp"
+#include "size_t.hpp"
+#include "state_machine.hpp"
+#include <vector>
+
+namespace boost
+{
+namespace lexer
+{
+template<typename CharT>
+void generate_cpp (const basic_state_machine<CharT> &state_machine_,
+ std::ostream &os_, const bool use_pointers_ = false,
+ const bool skip_unknown_ = true, const bool optimise_parameters_ = true,
+ const char *name_ = "next_token")
+{
+ const detail::internals &sm_ = state_machine_.data ();
+
+ if (sm_._lookup->size () == 0)
+ {
+ throw runtime_error ("Cannot generate code from an empty "
+ "state machine");
+ }
+
+ std::string upper_name_ (__DATE__);
+ const std::size_t lookups_ = sm_._lookup->front ()->size ();
+ const std::size_t dfas_ = sm_._dfa->size ();
+ std::string::size_type pos_ = upper_name_.find (' ');
+ const char *iterator_ = 0;
+
+ if (use_pointers_)
+ {
+ if (lookups_ == 256)
+ {
+ iterator_ = "const char *";
+ }
+ else
+ {
+ iterator_ = "const wchar_t *";
+ }
+ }
+ else
+ {
+ iterator_ = "Iterator &";
+ }
+
+ while (pos_ != std::string::npos)
+ {
+ upper_name_.replace (pos_, 1, "_");
+ pos_ = upper_name_.find (' ', pos_);
+ }
+
+ upper_name_ += '_';
+ upper_name_ += __TIME__;
+
+ pos_ = upper_name_.find (':');
+
+ while (pos_ != std::string::npos)
+ {
+ upper_name_.erase (pos_, 1);
+ pos_ = upper_name_.find (':', pos_);
+ }
+
+ upper_name_ = '_' + upper_name_;
+ upper_name_ = name_ + upper_name_;
+ std::transform (upper_name_.begin (), upper_name_.end (),
+ upper_name_.begin (), ::toupper);
+ os_ << "#ifndef " << upper_name_ + '\n';
+ os_ << "#define " << upper_name_ + '\n';
+ os_ << "// Copyright (c) 2008-2009 Ben Hanson\n";
+ os_ << "//\n";
+ os_ << "// Distributed under the Boost Software License, "
+ "Version 1.0. (See accompanying\n";
+ os_ << "// file licence_1_0.txt or copy at "
+ "http://www.boost.org/LICENSE_1_0.txt)\n\n";
+ os_ << "// Auto-generated by boost::lexer\n";
+ os_ << "template<typename Iterator>\n";
+ os_ << "std::size_t " << name_ << " (";
+
+ if (dfas_ > 1 || !optimise_parameters_)
+ {
+ os_ << "std::size_t &start_state_, ";
+ }
+
+ if (use_pointers_)
+ {
+ os_ << iterator_ << " &";
+ }
+ else
+ {
+ os_ << iterator_;
+ }
+
+ os_ << "start_token_, ";
+
+ if (use_pointers_)
+ {
+ os_ << iterator_ << " const ";
+ }
+ else
+ {
+ os_ << "const " << iterator_;
+ }
+
+ os_ << "end_, \n";
+ os_ << " std::size_t &unique_id_";
+
+ if (sm_._seen_BOL_assertion || !optimise_parameters_)
+ {
+ os_ << ", bool &beg_of_line_";
+ }
+
+ os_ << ")\n";
+ os_ << "{\n";
+ os_ << " enum {end_state_index, id_index, unique_id_index, state_index, bol_index,\n";
+ os_ << " eol_index, dead_state_index, dfa_offset};\n";
+ os_ << " static const std::size_t npos = static_cast"
+ "<std::size_t>(~0);\n";
+
+ if (dfas_ > 1)
+ {
+ std::size_t state_ = 0;
+
+ for (; state_ < dfas_; ++state_)
+ {
+ std::size_t i_ = 0;
+ std::size_t j_ = 1;
+ std::size_t count_ = lookups_ / 8;
+ const std::size_t *lookup_ = &sm_._lookup[state_]->front ();
+ const std::size_t *dfa_ = &sm_._dfa[state_]->front ();
+
+ os_ << " static const std::size_t lookup" << state_ << "_[" <<
+ lookups_ << "] = {";
+
+ for (; i_ < count_; ++i_)
+ {
+ const std::size_t index_ = i_ * 8;
+
+ os_ << lookup_[index_];
+
+ for (; j_ < 8; ++j_)
+ {
+ os_ << ", " << lookup_[index_ + j_];
+ }
+
+ if (i_ < count_ - 1)
+ {
+ os_ << "," << std::endl << " ";
+ }
+
+ j_ = 1;
+ }
+
+ os_ << "};\n";
+ count_ = sm_._dfa[state_]->size ();
+ os_ << " static const std::size_t dfa" << state_ << "_[" <<
+ count_ << "] = {";
+ count_ /= 8;
+
+ for (i_ = 0; i_ < count_; ++i_)
+ {
+ const std::size_t index_ = i_ * 8;
+
+ os_ << dfa_[index_];
+
+ for (j_ = 1; j_ < 8; ++j_)
+ {
+ os_ << ", " << dfa_[index_ + j_];
+ }
+
+ if (i_ < count_ - 1)
+ {
+ os_ << "," << std::endl << " ";
+ }
+ }
+
+ const std::size_t mod_ = sm_._dfa[state_]->size () % 8;
+
+ if (mod_)
+ {
+ const std::size_t index_ = count_ * 8;
+
+ if (count_)
+ {
+ os_ << ",\n ";
+ }
+
+ os_ << dfa_[index_];
+
+ for (j_ = 1; j_ < mod_; ++j_)
+ {
+ os_ << ", " << dfa_[index_ + j_];
+ }
+ }
+
+ os_ << "};\n";
+ }
+
+ std::size_t count_ = sm_._dfa_alphabet.size ();
+ std::size_t i_ = 1;
+
+ os_ << " static const std::size_t *lookup_arr_[" << count_ <<
+ "] = {";
+ os_ << "lookup0_";
+
+ for (i_ = 1; i_ < count_; ++i_)
+ {
+ os_ << ", " << "lookup" << i_ << "_";
+ }
+
+ os_ << "};\n";
+ os_ << " static const std::size_t dfa_alphabet_arr_[" << count_ <<
+ "] = {";
+ os_ << sm_._dfa_alphabet.front ();
+
+ for (i_ = 1; i_ < count_; ++i_)
+ {
+ os_ << ", " << sm_._dfa_alphabet[i_];
+ }
+
+ os_ << "};\n";
+ os_ << " static const std::size_t *dfa_arr_[" << count_ <<
+ "] = {";
+ os_ << "dfa0_";
+
+ for (i_ = 1; i_ < count_; ++i_)
+ {
+ os_ << ", " << "dfa" << i_ << "_";
+ }
+
+ os_ << "};\n";
+ }
+ else
+ {
+ const std::size_t *lookup_ = &sm_._lookup->front ()->front ();
+ const std::size_t *dfa_ = &sm_._dfa->front ()->front ();
+ std::size_t i_ = 0;
+ std::size_t j_ = 1;
+ std::size_t count_ = lookups_ / 8;
+
+ os_ << " static const std::size_t lookup_[";
+ os_ << sm_._lookup->front ()->size () << "] = {";
+
+ for (; i_ < count_; ++i_)
+ {
+ const std::size_t index_ = i_ * 8;
+
+ os_ << lookup_[index_];
+
+ for (; j_ < 8; ++j_)
+ {
+ os_ << ", " << lookup_[index_ + j_];
+ }
+
+ if (i_ < count_ - 1)
+ {
+ os_ << "," << std::endl << " ";
+ }
+
+ j_ = 1;
+ }
+
+ os_ << "};\n";
+ os_ << " static const std::size_t dfa_alphabet_ = " <<
+ sm_._dfa_alphabet.front () << ";\n";
+ os_ << " static const std::size_t dfa_[" <<
+ sm_._dfa->front ()->size () << "] = {";
+ count_ = sm_._dfa->front ()->size () / 8;
+
+ for (i_ = 0; i_ < count_; ++i_)
+ {
+ const std::size_t index_ = i_ * 8;
+
+ os_ << dfa_[index_];
+
+ for (j_ = 1; j_ < 8; ++j_)
+ {
+ os_ << ", " << dfa_[index_ + j_];
+ }
+
+ if (i_ < count_ - 1)
+ {
+ os_ << "," << std::endl << " ";
+ }
+ }
+
+ const std::size_t mod_ = sm_._dfa->front ()->size () % 8;
+
+ if (mod_)
+ {
+ const std::size_t index_ = count_ * 8;
+
+ if (count_)
+ {
+ os_ << ",\n ";
+ }
+
+ os_ << dfa_[index_];
+
+ for (j_ = 1; j_ < mod_; ++j_)
+ {
+ os_ << ", " << dfa_[index_ + j_];
+ }
+ }
+
+ os_ << "};\n";
+ }
+
+ os_ << "\n if (start_token_ == end_)\n";
+ os_ << " {\n";
+ os_ << " unique_id_ = npos;\n";
+ os_ << " return 0;\n";
+ os_ << " }\n\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << "again:\n";
+ os_ << " const std::size_t * lookup_ = "
+ "lookup_arr_[start_state_];\n";
+ os_ << " std::size_t dfa_alphabet_ = "
+ "dfa_alphabet_arr_[start_state_];\n";
+ os_ << " const std::size_t *dfa_ = dfa_arr_[start_state_];\n";
+ }
+
+ os_ << " const std::size_t *ptr_ = dfa_ + dfa_alphabet_;\n";
+ os_ << " Iterator curr_ = start_token_;\n";
+ os_ << " bool end_state_ = *ptr_ != 0;\n";
+ os_ << " std::size_t id_ = *(ptr_ + id_index);\n";
+ os_ << " std::size_t uid_ = *(ptr_ + unique_id_index);\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " std::size_t end_start_state_ = start_state_;\n";
+ }
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " bool bol_ = beg_of_line_;\n";
+ os_ << " bool end_bol_ = bol_;\n";
+ }
+
+ os_ << " Iterator end_token_ = start_token_;\n";
+ os_ << '\n';
+ os_ << " while (curr_ != end_)\n";
+ os_ << " {\n";
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " const std::size_t BOL_state_ = ptr_[bol_index];\n";
+ }
+
+ if (sm_._seen_EOL_assertion)
+ {
+ os_ << " const std::size_t EOL_state_ = ptr_[eol_index];\n";
+ }
+
+ if (sm_._seen_BOL_assertion || sm_._seen_EOL_assertion)
+ {
+ os_ << '\n';
+ }
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " if (BOL_state_ && bol_)\n";
+ os_ << " {\n";
+ os_ << " ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];\n";
+ os_ << " }\n";
+ }
+
+ if (sm_._seen_EOL_assertion)
+ {
+ os_ << " ";
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << "else ";
+ }
+
+ os_ << "if (EOL_state_ && *curr_ == '\\n')\n";
+ os_ << " {\n";
+ os_ << " ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];\n";
+ os_ << " }\n";
+ }
+
+ std::string tab_ (sm_._seen_BOL_assertion || sm_._seen_EOL_assertion ? " " : "");
+
+ if (sm_._seen_BOL_assertion || sm_._seen_EOL_assertion)
+ {
+ os_ << " else\n";
+ os_ << " {\n";
+ }
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " ";
+
+ if (lookups_ == 256)
+ {
+ os_ << "char";
+ }
+ else
+ {
+ os_ << "wchar_t";
+ }
+
+ os_ << " prev_char_ = *curr_++;\n\n";
+ os_ << " bol_ = prev_char_ == '\\n';\n\n";
+ }
+
+ os_ << tab_;
+ os_ << " const std::size_t state_ =\n";
+ os_ << tab_;
+ os_ << " ptr_[lookup_[";
+
+ if (lookups_ == 256)
+ {
+ os_ << "static_cast<unsigned char>(";
+ }
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << "prev_char";
+ }
+ else
+ {
+ os_ << "*curr_++";
+ }
+
+
+ if (lookups_ == 256)
+ {
+ os_ << ')';
+ }
+
+ os_ << "]];\n\n";
+
+ os_ << tab_;
+ os_ << " if (state_ == 0) break;\n\n";
+ os_ << tab_;
+ os_ << " ptr_ = &dfa_[state_ * dfa_alphabet_];\n";
+
+ if (sm_._seen_BOL_assertion || sm_._seen_EOL_assertion)
+ {
+ os_ << " }\n";
+ }
+
+ os_ << '\n';
+ os_ << " if (*ptr_)\n";
+ os_ << " {\n";
+ os_ << " end_state_ = true;\n";
+ os_ << " id_ = *(ptr_ + id_index);\n";
+ os_ << " uid_ = *(ptr_ + unique_id_index);\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " end_start_state_ = *(ptr_ + state_index);\n";
+ }
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " end_bol_ = bol_;\n";
+ }
+
+ os_ << " end_token_ = curr_;\n";
+ os_ << " }\n";
+ os_ << " }\n";
+ os_ << '\n';
+
+ if (sm_._seen_EOL_assertion)
+ {
+ os_ << " const std::size_t EOL_state_ = ptr_[eol_index];\n";
+ os_ << '\n';
+ os_ << " if (EOL_state_ && curr_ == end_)\n";
+ os_ << " {\n";
+ os_ << " ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];\n";
+ os_ << '\n';
+ os_ << " if (*ptr_)\n";
+ os_ << " {\n";
+ os_ << " end_state_ = true;\n";
+ os_ << " id_ = *(ptr_ + id_index);\n";
+ os_ << " uid_ = *(ptr_ + unique_id_index);\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " end_start_state_ = *(ptr_ + state_index);\n";
+ }
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " end_bol_ = bol_;\n";
+ }
+
+ os_ << " end_token_ = curr_;\n";
+ os_ << " }\n";
+ os_ << " }\n";
+ os_ << '\n';
+ }
+
+ os_ << " if (end_state_)\n";
+ os_ << " {\n";
+ os_ << " // return longest match\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " start_state_ = end_start_state_;\n";
+ }
+
+ if (sm_._seen_BOL_assertion && dfas_ < 2)
+ {
+ os_ << " beg_of_line_ = end_bol_;\n";
+ }
+
+ os_ << " start_token_ = end_token_;\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << '\n';
+ os_ << " if (id_ == 0)\n";
+ os_ << " {\n";
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " bol_ = end_bol_;\n";
+ }
+
+ os_ << " goto again;\n";
+ os_ << " }\n";
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " else\n";
+ os_ << " {\n";
+ os_ << " beg_of_line_ = end_bol_;\n";
+ os_ << " }\n";
+ }
+ }
+
+ os_ << " }\n";
+ os_ << " else\n";
+ os_ << " {\n";
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " beg_of_line_ = *start_token_ == '\\n';\n";
+ }
+
+ if (skip_unknown_)
+ {
+ os_ << " // No match causes char to be skipped\n";
+ os_ << " ++start_token_;\n";
+ }
+
+ os_ << " id_ = npos;\n";
+ os_ << " uid_ = npos;\n";
+ os_ << " }\n";
+ os_ << '\n';
+ os_ << " unique_id_ = uid_;\n";
+ os_ << " return id_;\n";
+ os_ << "}\n";
+ os_ << "\n#endif\n";
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/generate_re2c.hpp b/boost/spirit/home/support/detail/lexer/generate_re2c.hpp
new file mode 100644
index 0000000000..dced1f9060
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/generate_re2c.hpp
@@ -0,0 +1,444 @@
+// generate_re2c.hpp
+// Copyright (c) 2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef LEXERTL_GENERATE_RE2C_HPP
+#define LEXERTL_GENERATE_RE2C_HPP
+
+#include "char_traits.hpp"
+#include "consts.hpp"
+#include "internals.hpp"
+#include <iostream>
+#include "runtime_error.hpp"
+#include "size_t.hpp"
+#include "state_machine.hpp"
+#include <vector>
+
+namespace boost
+{
+namespace lexer
+{
+// check whether state0_0 is referenced from any of the other states
+template <typename Char>
+bool need_label0_0(boost::lexer::basic_state_machine<Char> const &sm_)
+{
+ typedef typename boost::lexer::basic_state_machine<Char>::iterator
+ iterator_type;
+ iterator_type iter_ = sm_.begin();
+ std::size_t states_ = iter_->states;
+
+ for (std::size_t state_ = 0; state_ < states_; ++state_)
+ {
+ if (0 == iter_->bol_index || 0 == iter_->eol_index)
+ {
+ return true;
+ }
+
+ std::size_t const transitions_ = iter_->transitions;
+ for (std::size_t t_ = 0; t_ < transitions_; ++t_)
+ {
+ if (0 == iter_->goto_state)
+ {
+ return true;
+ }
+ ++iter_;
+ }
+ if (transitions_ == 0) ++iter_;
+ }
+ return false;
+}
+
+template<typename CharT>
+void generate_re2c (const basic_state_machine<CharT> &state_machine_,
+ std::ostream &os_, const bool use_pointers_ = false,
+ const bool skip_unknown_ = true, const bool optimise_parameters_ = true,
+ const char *name_ = "next_token")
+{
+ typedef typename boost::lexer::basic_string_token<CharT> string_token;
+ const detail::internals &sm_ = state_machine_.data ();
+
+ if (sm_._lookup->size () == 0)
+ {
+ throw runtime_error ("Cannot generate code from an empty "
+ "state machine");
+ }
+
+ std::string upper_name_ (__DATE__);
+ const std::size_t lookups_ = sm_._lookup->front ()->size ();
+ typename boost::lexer::basic_state_machine<CharT>::iterator iter_ =
+ state_machine_.begin();
+ typename boost::lexer::basic_state_machine<CharT>::iterator end_ =
+ state_machine_.end();
+ const std::size_t dfas_ = sm_._dfa->size ();
+ std::string::size_type pos_ = upper_name_.find (' ');
+ const char *iterator_ = 0;
+
+ if (use_pointers_)
+ {
+ if (lookups_ == 256)
+ {
+ iterator_ = "const char *";
+ }
+ else
+ {
+ iterator_ = "const wchar_t *";
+ }
+ }
+ else
+ {
+ iterator_ = "Iterator &";
+ }
+
+ while (pos_ != std::string::npos)
+ {
+ upper_name_.replace (pos_, 1, "_");
+ pos_ = upper_name_.find (' ', pos_);
+ }
+
+ upper_name_ += '_';
+ upper_name_ += __TIME__;
+
+ pos_ = upper_name_.find (':');
+
+ while (pos_ != std::string::npos)
+ {
+ upper_name_.erase (pos_, 1);
+ pos_ = upper_name_.find (':', pos_);
+ }
+
+ upper_name_ = '_' + upper_name_;
+ upper_name_ = name_ + upper_name_;
+ std::transform (upper_name_.begin (), upper_name_.end (),
+ upper_name_.begin (), ::toupper);
+ os_ << "#ifndef " << upper_name_ + '\n';
+ os_ << "#define " << upper_name_ + '\n';
+ os_ << "// Copyright (c) 2008-2009 Ben Hanson\n";
+ os_ << "//\n";
+ os_ << "// Distributed under the Boost Software License, "
+ "Version 1.0. (See accompanying\n";
+ os_ << "// file licence_1_0.txt or copy at "
+ "http://www.boost.org/LICENSE_1_0.txt)\n\n";
+ os_ << "// Auto-generated by boost::lexer\n";
+ os_ << "template<typename Iterator>\n";
+ os_ << "std::size_t " << name_ << " (";
+
+ if (dfas_ > 1 || !optimise_parameters_)
+ {
+ os_ << "std::size_t &start_state_, ";
+ }
+
+ if (use_pointers_)
+ {
+ os_ << iterator_ << " &";
+ }
+ else
+ {
+ os_ << iterator_;
+ }
+
+ os_ << "start_token_, ";
+
+ if (use_pointers_)
+ {
+ os_ << iterator_ << " const ";
+ }
+ else
+ {
+ os_ << "const " << iterator_;
+ }
+
+ os_ << "end_, \n";
+ os_ << " std::size_t &unique_id_";
+
+ if (sm_._seen_BOL_assertion || !optimise_parameters_)
+ {
+ os_ << ", bool &beg_of_line_";
+ }
+
+ os_ << ")\n";
+ os_ << "{\n";
+ os_ << " static const std::size_t npos = static_cast"
+ "<std::size_t>(~0);\n";
+ os_ << "\n if (start_token_ == end_)\n";
+ os_ << " {\n";
+ os_ << " unique_id_ = npos;\n";
+ os_ << " return 0;\n";
+ os_ << " }\n\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << "again:\n";
+ }
+
+ os_ << " Iterator curr_ = start_token_;\n";
+ os_ << " bool end_state_ = false;\n";
+ os_ << " std::size_t id_ = npos;\n";
+ os_ << " std::size_t uid_ = npos;\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " std::size_t end_start_state_ = start_state_;\n";
+ }
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " bool bol_ = beg_of_line_;\n";
+ os_ << " bool end_bol_ = bol_;\n";
+ }
+
+ os_ << " Iterator end_token_ = start_token_;\n";
+ os_ << '\n';
+
+ if (dfas_ > 1)
+ {
+ os_ << " switch (start_state_)\n";
+ os_ << " {\n";
+
+ for (std::size_t i_ = 0; i_ < dfas_; ++i_)
+ {
+ os_ << " case " << i_ << ":\n";
+ os_ << " goto " << i_ << "_0;\n";
+ os_ << " // Not needed, but to prevent warnings\n";
+ os_ << " break;\n";
+ }
+
+ os_ << " default:\n";
+ os_ << " throw std::runtime_error (\"Invalid start state!\")\n";
+ os_ << " break;\n";
+ os_ << " }\n\n";
+ }
+
+ os_ << " ";
+
+ if (lookups_ == 256)
+ {
+ os_ << "char";
+ }
+ else
+ {
+ os_ << "wchar_t";
+ }
+
+ os_ << " ch_ = 0;\n\n";
+
+ bool need_state0_0_label = need_label0_0(state_machine_);
+
+ for (std::size_t dfa_ = 0; dfa_ < dfas_; ++dfa_)
+ {
+ const std::size_t states_ = iter_->states;
+
+ for (std::size_t state_ = 0; state_ < states_; ++state_)
+ {
+ const std::size_t transitions_ = iter_->transitions;
+ std::size_t t_ = 0;
+
+ if (dfas_ > 1 || dfa_ != 0 || state_ != 0 || need_state0_0_label)
+ {
+ os_ << "state" << dfa_ << '_' << state_ << ":\n";
+ }
+
+ if (iter_->end_state)
+ {
+ os_ << " end_state_ = true;\n";
+ os_ << " id_ = " << iter_->id << ";\n";
+ os_ << " uid_ = " << iter_->unique_id << ";\n";
+ os_ << " end_token_ = curr_;\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " end_start_state_ = " << iter_->goto_dfa <<
+ ";\n";
+ }
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " end_bol_ = bol_;\n";
+ }
+
+ if (transitions_) os_ << '\n';
+ }
+
+ if (t_ < transitions_ || iter_->bol_index != boost::lexer::npos ||
+ iter_->eol_index != boost::lexer::npos)
+ {
+ os_ << " if (curr_ == end_) goto end;\n\n";
+ os_ << " ch_ = *curr_;\n";
+
+ if (iter_->bol_index != boost::lexer::npos)
+ {
+ os_ << "\n if (bol_) goto state" << dfa_ << '_' <<
+ iter_->bol_index << ";\n\n";
+ }
+
+ if (iter_->eol_index != boost::lexer::npos)
+ {
+ os_ << "\n if (ch_ == '\n') goto state" << dfa_ << '_' <<
+ iter_->eol_index << ";\n\n";
+ }
+
+ os_ << " ++curr_;\n";
+ }
+
+ for (; t_ < transitions_; ++t_)
+ {
+ const char *ptr_ = iter_->token._charset.c_str();
+ const char *end_ = ptr_ + iter_->token._charset.size();
+ char start_char_ = 0;
+ char curr_char_ = 0;
+ bool range_ = false;
+ bool first_char_ = true;
+
+ os_ << "\n if (";
+
+ while (ptr_ != end_)
+ {
+ curr_char_ = *ptr_++;
+
+ if (*ptr_ == curr_char_ + 1)
+ {
+ if (!range_)
+ {
+ start_char_ = curr_char_;
+ }
+
+ range_ = true;
+ }
+ else
+ {
+ if (!first_char_)
+ {
+ if (iter_->token._negated)
+ {
+ os_ << " && ";
+ }
+ else
+ {
+ os_ << " || ";
+ }
+ }
+
+ first_char_ = false;
+
+ if (range_)
+ {
+ typename string_token::string temp_;
+
+ if (iter_->token._negated)
+ {
+ os_ << "!";
+ }
+
+ string_token::escape_char (start_char_, temp_);
+ os_ << "(ch_ >= '" << temp_;
+#if defined _MSC_VER && _MSC_VER <= 1200
+ temp_.erase ();
+#else
+ temp_.clear ();
+#endif
+ string_token::escape_char (curr_char_, temp_);
+ os_ << "' && ch_ <= '" << temp_ << "')";
+ range_ = false;
+ }
+ else
+ {
+ typename string_token::string temp_;
+
+ os_ << "ch_ ";
+
+ if (iter_->token._negated)
+ {
+ os_ << "!=";
+ }
+ else
+ {
+ os_ << "==";
+ }
+
+ string_token::escape_char (curr_char_, temp_);
+ os_ << " '" << temp_ << "'";
+ }
+ }
+ }
+
+ os_ << ") goto state" << dfa_ << '_' << iter_->goto_state <<
+ ";\n\n";
+ ++iter_;
+ }
+
+ if (!(dfa_ == dfas_ - 1 && state_ == states_ - 1))
+ {
+ os_ << " goto end;\n";
+ }
+
+ if (transitions_ == 0) ++iter_;
+ }
+ }
+
+ os_ << "end:\n";
+ os_ << " if (end_state_)\n";
+ os_ << " {\n";
+ os_ << " // return longest match\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << " start_state_ = end_start_state_;\n";
+ }
+
+ if (sm_._seen_BOL_assertion && dfas_ < 2)
+ {
+ os_ << " beg_of_line_ = end_bol_;\n";
+ }
+
+ os_ << " start_token_ = end_token_;\n";
+
+ if (dfas_ > 1)
+ {
+ os_ << '\n';
+ os_ << " if (id_ == 0)\n";
+ os_ << " {\n";
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " bol_ = end_bol_;\n";
+ }
+
+ os_ << " goto again;\n";
+ os_ << " }\n";
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " else\n";
+ os_ << " {\n";
+ os_ << " beg_of_line_ = end_bol_;\n";
+ os_ << " }\n";
+ }
+ }
+
+ os_ << " }\n";
+ os_ << " else\n";
+ os_ << " {\n";
+
+ if (sm_._seen_BOL_assertion)
+ {
+ os_ << " beg_of_line_ = *start_token_ == '\\n';\n";
+ }
+
+ if (skip_unknown_)
+ {
+ os_ << " // No match causes char to be skipped\n";
+ os_ << " ++start_token_;\n";
+ }
+
+ os_ << " id_ = npos;\n";
+ os_ << " uid_ = npos;\n";
+ os_ << " }\n";
+ os_ << '\n';
+ os_ << " unique_id_ = uid_;\n";
+ os_ << " return id_;\n";
+ os_ << "}\n";
+ os_ << "\n#endif\n";
+}
+}
+}
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/generator.hpp b/boost/spirit/home/support/detail/lexer/generator.hpp
new file mode 100644
index 0000000000..49bea2fe9c
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/generator.hpp
@@ -0,0 +1,858 @@
+// generator.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_GENERATOR_HPP
+#define BOOST_LEXER_GENERATOR_HPP
+
+#include "char_traits.hpp"
+// memcmp()
+#include <cstring>
+#include "partition/charset.hpp"
+#include "partition/equivset.hpp"
+#include <memory>
+#include "parser/tree/node.hpp"
+#include "parser/parser.hpp"
+#include "containers/ptr_list.hpp"
+#include "rules.hpp"
+#include "state_machine.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+template<typename CharT, typename Traits = char_traits<CharT> >
+class basic_generator
+{
+public:
+ typedef typename detail::internals::size_t_vector size_t_vector;
+ typedef basic_rules<CharT> rules;
+
+ static void build (const rules &rules_,
+ basic_state_machine<CharT> &state_machine_)
+ {
+ std::size_t index_ = 0;
+ std::size_t size_ = rules_.statemap ().size ();
+ node_ptr_vector node_ptr_vector_;
+ detail::internals &internals_ = const_cast<detail::internals &>
+ (state_machine_.data ());
+ bool seen_BOL_assertion_ = false;
+ bool seen_EOL_assertion_ = false;
+
+ state_machine_.clear ();
+
+ for (; index_ < size_; ++index_)
+ {
+ internals_._lookup->push_back (static_cast<size_t_vector *>(0));
+ internals_._lookup->back () = new size_t_vector;
+ internals_._dfa_alphabet.push_back (0);
+ internals_._dfa->push_back (static_cast<size_t_vector *>(0));
+ internals_._dfa->back () = new size_t_vector;
+ }
+
+ for (index_ = 0, size_ = internals_._lookup->size ();
+ index_ < size_; ++index_)
+ {
+ internals_._lookup[index_]->resize (sizeof (CharT) == 1 ?
+ num_chars : num_wchar_ts, dead_state_index);
+
+ if (!rules_.regexes ()[index_].empty ())
+ {
+ // vector mapping token indexes to partitioned token index sets
+ index_set_vector set_mapping_;
+ // syntax tree
+ detail::node *root_ = build_tree (rules_, index_,
+ node_ptr_vector_, internals_, set_mapping_);
+
+ build_dfa (root_, set_mapping_,
+ internals_._dfa_alphabet[index_],
+ *internals_._dfa[index_]);
+
+ if (internals_._seen_BOL_assertion)
+ {
+ seen_BOL_assertion_ = true;
+ }
+
+ if (internals_._seen_EOL_assertion)
+ {
+ seen_EOL_assertion_ = true;
+ }
+
+ internals_._seen_BOL_assertion = false;
+ internals_._seen_EOL_assertion = false;
+ }
+ }
+
+ internals_._seen_BOL_assertion = seen_BOL_assertion_;
+ internals_._seen_EOL_assertion = seen_EOL_assertion_;
+ }
+
+ static void minimise (basic_state_machine<CharT> &state_machine_)
+ {
+ detail::internals &internals_ = const_cast<detail::internals &>
+ (state_machine_.data ());
+ const std::size_t machines_ = internals_._dfa->size ();
+
+ for (std::size_t i_ = 0; i_ < machines_; ++i_)
+ {
+ const std::size_t dfa_alphabet_ = internals_._dfa_alphabet[i_];
+ size_t_vector *dfa_ = internals_._dfa[i_];
+
+ if (dfa_alphabet_ != 0)
+ {
+ std::size_t size_ = 0;
+
+ do
+ {
+ size_ = dfa_->size ();
+ minimise_dfa (dfa_alphabet_, *dfa_, size_);
+ } while (dfa_->size () != size_);
+ }
+ }
+ }
+
+protected:
+ typedef detail::basic_charset<CharT> charset;
+ typedef detail::ptr_list<charset> charset_list;
+ typedef std::auto_ptr<charset> charset_ptr;
+ typedef detail::equivset equivset;
+ typedef detail::ptr_list<equivset> equivset_list;
+ typedef std::auto_ptr<equivset> equivset_ptr;
+ typedef typename charset::index_set index_set;
+ typedef std::vector<index_set> index_set_vector;
+ typedef detail::basic_parser<CharT> parser;
+ typedef typename parser::node_ptr_vector node_ptr_vector;
+ typedef std::set<const detail::node *> node_set;
+ typedef detail::ptr_vector<node_set> node_set_vector;
+ typedef std::vector<const detail::node *> node_vector;
+ typedef detail::ptr_vector<node_vector> node_vector_vector;
+ typedef typename parser::string string;
+ typedef std::pair<string, string> string_pair;
+ typedef typename parser::tokeniser::string_token string_token;
+ typedef std::deque<string_pair> macro_deque;
+ typedef std::pair<string, const detail::node *> macro_pair;
+ typedef typename parser::macro_map::iterator macro_iter;
+ typedef std::pair<macro_iter, bool> macro_iter_pair;
+ typedef typename parser::tokeniser::token_map token_map;
+
+ static detail::node *build_tree (const rules &rules_,
+ const std::size_t state_, node_ptr_vector &node_ptr_vector_,
+ detail::internals &internals_, index_set_vector &set_mapping_)
+ {
+ size_t_vector *lookup_ = internals_._lookup[state_];
+ const typename rules::string_deque_deque &regexes_ =
+ rules_.regexes ();
+ const typename rules::id_vector_deque &ids_ = rules_.ids ();
+ const typename rules::id_vector_deque &unique_ids_ =
+ rules_.unique_ids ();
+ const typename rules::id_vector_deque &states_ = rules_.states ();
+ typename rules::string_deque::const_iterator regex_iter_ =
+ regexes_[state_].begin ();
+ typename rules::string_deque::const_iterator regex_iter_end_ =
+ regexes_[state_].end ();
+ typename rules::id_vector::const_iterator ids_iter_ =
+ ids_[state_].begin ();
+ typename rules::id_vector::const_iterator unique_ids_iter_ =
+ unique_ids_[state_].begin ();
+ typename rules::id_vector::const_iterator states_iter_ =
+ states_[state_].begin ();
+ const typename rules::string &regex_ = *regex_iter_;
+ // map of regex charset tokens (strings) to index
+ token_map token_map_;
+ const typename rules::string_pair_deque &macrodeque_ =
+ rules_.macrodeque ();
+ typename parser::macro_map macromap_;
+ typename detail::node::node_vector tree_vector_;
+
+ build_macros (token_map_, macrodeque_, macromap_,
+ rules_.flags (), rules_.locale (), node_ptr_vector_,
+ internals_._seen_BOL_assertion, internals_._seen_EOL_assertion);
+
+ detail::node *root_ = parser::parse (regex_.c_str (),
+ regex_.c_str () + regex_.size (), *ids_iter_, *unique_ids_iter_,
+ *states_iter_, rules_.flags (), rules_.locale (), node_ptr_vector_,
+ macromap_, token_map_, internals_._seen_BOL_assertion,
+ internals_._seen_EOL_assertion);
+
+ ++regex_iter_;
+ ++ids_iter_;
+ ++unique_ids_iter_;
+ ++states_iter_;
+ tree_vector_.push_back (root_);
+
+ // build syntax trees
+ while (regex_iter_ != regex_iter_end_)
+ {
+ // re-declare var, otherwise we perform an assignment..!
+ const typename rules::string &regex_ = *regex_iter_;
+
+ root_ = parser::parse (regex_.c_str (),
+ regex_.c_str () + regex_.size (), *ids_iter_,
+ *unique_ids_iter_, *states_iter_, rules_.flags (),
+ rules_.locale (), node_ptr_vector_, macromap_, token_map_,
+ internals_._seen_BOL_assertion,
+ internals_._seen_EOL_assertion);
+ tree_vector_.push_back (root_);
+ ++regex_iter_;
+ ++ids_iter_;
+ ++unique_ids_iter_;
+ ++states_iter_;
+ }
+
+ if (internals_._seen_BOL_assertion)
+ {
+ // Fixup BOLs
+ typename detail::node::node_vector::iterator iter_ =
+ tree_vector_.begin ();
+ typename detail::node::node_vector::iterator end_ =
+ tree_vector_.end ();
+
+ for (; iter_ != end_; ++iter_)
+ {
+ fixup_bol (*iter_, node_ptr_vector_);
+ }
+ }
+
+ // join trees
+ {
+ typename detail::node::node_vector::iterator iter_ =
+ tree_vector_.begin ();
+ typename detail::node::node_vector::iterator end_ =
+ tree_vector_.end ();
+
+ if (iter_ != end_)
+ {
+ root_ = *iter_;
+ ++iter_;
+ }
+
+ for (; iter_ != end_; ++iter_)
+ {
+ node_ptr_vector_->push_back (static_cast<detail::selection_node *>(0));
+ node_ptr_vector_->back () = new detail::selection_node
+ (root_, *iter_);
+ root_ = node_ptr_vector_->back ();
+ }
+ }
+
+ // partitioned token list
+ charset_list token_list_;
+
+ set_mapping_.resize (token_map_.size ());
+ partition_tokens (token_map_, token_list_);
+
+ typename charset_list::list::const_iterator iter_ =
+ token_list_->begin ();
+ typename charset_list::list::const_iterator end_ =
+ token_list_->end ();
+ std::size_t index_ = 0;
+
+ for (; iter_ != end_; ++iter_, ++index_)
+ {
+ const charset *cs_ = *iter_;
+ typename charset::index_set::const_iterator set_iter_ =
+ cs_->_index_set.begin ();
+ typename charset::index_set::const_iterator set_end_ =
+ cs_->_index_set.end ();
+
+ fill_lookup (cs_->_token, lookup_, index_);
+
+ for (; set_iter_ != set_end_; ++set_iter_)
+ {
+ set_mapping_[*set_iter_].insert (index_);
+ }
+ }
+
+ internals_._dfa_alphabet[state_] = token_list_->size () + dfa_offset;
+ return root_;
+ }
+
+ static void build_macros (token_map &token_map_,
+ const macro_deque &macrodeque_,
+ typename parser::macro_map &macromap_, const regex_flags flags_,
+ const std::locale &locale_, node_ptr_vector &node_ptr_vector_,
+ bool &seen_BOL_assertion_, bool &seen_EOL_assertion_)
+ {
+ for (typename macro_deque::const_iterator iter_ =
+ macrodeque_.begin (), end_ = macrodeque_.end ();
+ iter_ != end_; ++iter_)
+ {
+ const typename rules::string &name_ = iter_->first;
+ const typename rules::string &regex_ = iter_->second;
+ detail::node *node_ = parser::parse (regex_.c_str (),
+ regex_.c_str () + regex_.size (), 0, 0, 0, flags_,
+ locale_, node_ptr_vector_, macromap_, token_map_,
+ seen_BOL_assertion_, seen_EOL_assertion_);
+ macro_iter_pair map_iter_ = macromap_.
+ insert (macro_pair (name_, static_cast<const detail::node *>
+ (0)));
+
+ map_iter_.first->second = node_;
+ }
+ }
+
+ static void build_dfa (detail::node *root_,
+ const index_set_vector &set_mapping_, const std::size_t dfa_alphabet_,
+ size_t_vector &dfa_)
+ {
+ typename detail::node::node_vector *followpos_ =
+ &root_->firstpos ();
+ node_set_vector seen_sets_;
+ node_vector_vector seen_vectors_;
+ size_t_vector hash_vector_;
+
+ // 'jam' state
+ dfa_.resize (dfa_alphabet_, 0);
+ closure (followpos_, seen_sets_, seen_vectors_,
+ hash_vector_, dfa_alphabet_, dfa_);
+
+ std::size_t *ptr_ = 0;
+
+ for (std::size_t index_ = 0; index_ < seen_vectors_->size (); ++index_)
+ {
+ equivset_list equiv_list_;
+
+ build_equiv_list (seen_vectors_[index_], set_mapping_, equiv_list_);
+
+ for (typename equivset_list::list::const_iterator iter_ =
+ equiv_list_->begin (), end_ = equiv_list_->end ();
+ iter_ != end_; ++iter_)
+ {
+ equivset *equivset_ = *iter_;
+ const std::size_t transition_ = closure
+ (&equivset_->_followpos, seen_sets_, seen_vectors_,
+ hash_vector_, dfa_alphabet_, dfa_);
+
+ if (transition_ != npos)
+ {
+ ptr_ = &dfa_.front () + ((index_ + 1) * dfa_alphabet_);
+
+ // Prune abstemious transitions from end states.
+ if (*ptr_ && !equivset_->_greedy) continue;
+
+ for (typename detail::equivset::index_vector::const_iterator
+ equiv_iter_ = equivset_->_index_vector.begin (),
+ equiv_end_ = equivset_->_index_vector.end ();
+ equiv_iter_ != equiv_end_; ++equiv_iter_)
+ {
+ const std::size_t index_ = *equiv_iter_;
+
+ if (index_ == bol_token)
+ {
+ if (ptr_[eol_index] == 0)
+ {
+ ptr_[bol_index] = transition_;
+ }
+ }
+ else if (index_ == eol_token)
+ {
+ if (ptr_[bol_index] == 0)
+ {
+ ptr_[eol_index] = transition_;
+ }
+ }
+ else
+ {
+ ptr_[index_ + dfa_offset] = transition_;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ static std::size_t closure (typename detail::node::node_vector *followpos_,
+ node_set_vector &seen_sets_, node_vector_vector &seen_vectors_,
+ size_t_vector &hash_vector_, const std::size_t size_,
+ size_t_vector &dfa_)
+ {
+ bool end_state_ = false;
+ std::size_t id_ = 0;
+ std::size_t unique_id_ = npos;
+ std::size_t state_ = 0;
+ std::size_t hash_ = 0;
+
+ if (followpos_->empty ()) return npos;
+
+ std::size_t index_ = 0;
+ std::auto_ptr<node_set> set_ptr_ (new node_set);
+ std::auto_ptr<node_vector> vector_ptr_ (new node_vector);
+
+ for (typename detail::node::node_vector::const_iterator iter_ =
+ followpos_->begin (), end_ = followpos_->end ();
+ iter_ != end_; ++iter_)
+ {
+ closure_ex (*iter_, end_state_, id_, unique_id_, state_,
+ set_ptr_.get (), vector_ptr_.get (), hash_);
+ }
+
+ bool found_ = false;
+ typename size_t_vector::const_iterator hash_iter_ =
+ hash_vector_.begin ();
+ typename size_t_vector::const_iterator hash_end_ =
+ hash_vector_.end ();
+ typename node_set_vector::vector::const_iterator set_iter_ =
+ seen_sets_->begin ();
+
+ for (; hash_iter_ != hash_end_; ++hash_iter_, ++set_iter_)
+ {
+ found_ = *hash_iter_ == hash_ && *(*set_iter_) == *set_ptr_;
+ ++index_;
+
+ if (found_) break;
+ }
+
+ if (!found_)
+ {
+ seen_sets_->push_back (static_cast<node_set *>(0));
+ seen_sets_->back () = set_ptr_.release ();
+ seen_vectors_->push_back (static_cast<node_vector *>(0));
+ seen_vectors_->back () = vector_ptr_.release ();
+ hash_vector_.push_back (hash_);
+ // State 0 is the jam state...
+ index_ = seen_sets_->size ();
+
+ const std::size_t old_size_ = dfa_.size ();
+
+ dfa_.resize (old_size_ + size_, 0);
+
+ if (end_state_)
+ {
+ dfa_[old_size_] |= end_state;
+ dfa_[old_size_ + id_index] = id_;
+ dfa_[old_size_ + unique_id_index] = unique_id_;
+ dfa_[old_size_ + state_index] = state_;
+ }
+ }
+
+ return index_;
+ }
+
+ static void closure_ex (detail::node *node_, bool &end_state_,
+ std::size_t &id_, std::size_t &unique_id_, std::size_t &state_,
+ node_set *set_ptr_, node_vector *vector_ptr_, std::size_t &hash_)
+ {
+ const bool temp_end_state_ = node_->end_state ();
+
+ if (temp_end_state_)
+ {
+ if (!end_state_)
+ {
+ end_state_ = true;
+ id_ = node_->id ();
+ unique_id_ = node_->unique_id ();
+ state_ = node_->lexer_state ();
+ }
+ }
+
+ if (set_ptr_->insert (node_).second)
+ {
+ vector_ptr_->push_back (node_);
+ hash_ += reinterpret_cast<std::size_t> (node_);
+ }
+ }
+
+ static void partition_tokens (const token_map &map_,
+ charset_list &lhs_)
+ {
+ charset_list rhs_;
+
+ fill_rhs_list (map_, rhs_);
+
+ if (!rhs_->empty ())
+ {
+ typename charset_list::list::iterator iter_;
+ typename charset_list::list::iterator end_;
+ charset_ptr overlap_ (new charset);
+
+ lhs_->push_back (static_cast<charset *>(0));
+ lhs_->back () = rhs_->front ();
+ rhs_->pop_front ();
+
+ while (!rhs_->empty ())
+ {
+ charset_ptr r_ (rhs_->front ());
+
+ rhs_->pop_front ();
+ iter_ = lhs_->begin ();
+ end_ = lhs_->end ();
+
+ while (!r_->empty () && iter_ != end_)
+ {
+ typename charset_list::list::iterator l_iter_ = iter_;
+
+ (*l_iter_)->intersect (*r_.get (), *overlap_.get ());
+
+ if (overlap_->empty ())
+ {
+ ++iter_;
+ }
+ else if ((*l_iter_)->empty ())
+ {
+ delete *l_iter_;
+ *l_iter_ = overlap_.release ();
+
+ // VC++ 6 Hack:
+ charset_ptr temp_overlap_ (new charset);
+
+ overlap_ = temp_overlap_;
+ ++iter_;
+ }
+ else if (r_->empty ())
+ {
+ delete r_.release ();
+ r_ = overlap_;
+
+ // VC++ 6 Hack:
+ charset_ptr temp_overlap_ (new charset);
+
+ overlap_ = temp_overlap_;
+ break;
+ }
+ else
+ {
+ iter_ = lhs_->insert (++iter_,
+ static_cast<charset *>(0));
+ *iter_ = overlap_.release ();
+
+ // VC++ 6 Hack:
+ charset_ptr temp_overlap_ (new charset);
+
+ overlap_ = temp_overlap_;
+ ++iter_;
+ end_ = lhs_->end ();
+ }
+ }
+
+ if (!r_->empty ())
+ {
+ lhs_->push_back (static_cast<charset *>(0));
+ lhs_->back () = r_.release ();
+ }
+ }
+ }
+ }
+
+ static void fill_rhs_list (const token_map &map_,
+ charset_list &list_)
+ {
+ typename parser::tokeniser::token_map::const_iterator iter_ =
+ map_.begin ();
+ typename parser::tokeniser::token_map::const_iterator end_ =
+ map_.end ();
+
+ for (; iter_ != end_; ++iter_)
+ {
+ list_->push_back (static_cast<charset *>(0));
+ list_->back () = new charset (iter_->first, iter_->second);
+ }
+ }
+
+ static void fill_lookup (const string_token &token_,
+ size_t_vector *lookup_, const std::size_t index_)
+ {
+ const CharT *curr_ = token_._charset.c_str ();
+ const CharT *chars_end_ = curr_ + token_._charset.size ();
+ std::size_t *ptr_ = &lookup_->front ();
+ const std::size_t max_ = sizeof (CharT) == 1 ?
+ num_chars : num_wchar_ts;
+
+ if (token_._negated)
+ {
+ CharT curr_char_ = sizeof (CharT) == 1 ? -128 : 0;
+ std::size_t i_ = 0;
+
+ while (curr_ < chars_end_)
+ {
+ while (*curr_ > curr_char_)
+ {
+ ptr_[static_cast<typename Traits::index_type>
+ (curr_char_)] = index_ + dfa_offset;
+ ++curr_char_;
+ ++i_;
+ }
+
+ ++curr_char_;
+ ++curr_;
+ ++i_;
+ }
+
+ for (; i_ < max_; ++i_)
+ {
+ ptr_[static_cast<typename Traits::index_type>(curr_char_)] =
+ index_ + dfa_offset;
+ ++curr_char_;
+ }
+ }
+ else
+ {
+ while (curr_ < chars_end_)
+ {
+ ptr_[static_cast<typename Traits::index_type>(*curr_)] =
+ index_ + dfa_offset;
+ ++curr_;
+ }
+ }
+ }
+
+ static void build_equiv_list (const node_vector *vector_,
+ const index_set_vector &set_mapping_, equivset_list &lhs_)
+ {
+ equivset_list rhs_;
+
+ fill_rhs_list (vector_, set_mapping_, rhs_);
+
+ if (!rhs_->empty ())
+ {
+ typename equivset_list::list::iterator iter_;
+ typename equivset_list::list::iterator end_;
+ equivset_ptr overlap_ (new equivset);
+
+ lhs_->push_back (static_cast<equivset *>(0));
+ lhs_->back () = rhs_->front ();
+ rhs_->pop_front ();
+
+ while (!rhs_->empty ())
+ {
+ equivset_ptr r_ (rhs_->front ());
+
+ rhs_->pop_front ();
+ iter_ = lhs_->begin ();
+ end_ = lhs_->end ();
+
+ while (!r_->empty () && iter_ != end_)
+ {
+ typename equivset_list::list::iterator l_iter_ = iter_;
+
+ (*l_iter_)->intersect (*r_.get (), *overlap_.get ());
+
+ if (overlap_->empty ())
+ {
+ ++iter_;
+ }
+ else if ((*l_iter_)->empty ())
+ {
+ delete *l_iter_;
+ *l_iter_ = overlap_.release ();
+
+ // VC++ 6 Hack:
+ equivset_ptr temp_overlap_ (new equivset);
+
+ overlap_ = temp_overlap_;
+ ++iter_;
+ }
+ else if (r_->empty ())
+ {
+ delete r_.release ();
+ r_ = overlap_;
+
+ // VC++ 6 Hack:
+ equivset_ptr temp_overlap_ (new equivset);
+
+ overlap_ = temp_overlap_;
+ break;
+ }
+ else
+ {
+ iter_ = lhs_->insert (++iter_,
+ static_cast<equivset *>(0));
+ *iter_ = overlap_.release ();
+
+ // VC++ 6 Hack:
+ equivset_ptr temp_overlap_ (new equivset);
+
+ overlap_ = temp_overlap_;
+ ++iter_;
+ end_ = lhs_->end ();
+ }
+ }
+
+ if (!r_->empty ())
+ {
+ lhs_->push_back (static_cast<equivset *>(0));
+ lhs_->back () = r_.release ();
+ }
+ }
+ }
+ }
+
+ static void fill_rhs_list (const node_vector *vector_,
+ const index_set_vector &set_mapping_, equivset_list &list_)
+ {
+ typename node_vector::const_iterator iter_ =
+ vector_->begin ();
+ typename node_vector::const_iterator end_ =
+ vector_->end ();
+
+ for (; iter_ != end_; ++iter_)
+ {
+ const detail::node *node_ = *iter_;
+
+ if (!node_->end_state ())
+ {
+ const std::size_t token_ = node_->token ();
+
+ if (token_ != null_token)
+ {
+ list_->push_back (static_cast<equivset *>(0));
+
+ if (token_ == bol_token || token_ == eol_token)
+ {
+ std::set<std::size_t> index_set_;
+
+ index_set_.insert (token_);
+ list_->back () = new equivset (index_set_,
+ node_->greedy (), token_, node_->followpos ());
+ }
+ else
+ {
+ list_->back () = new equivset (set_mapping_[token_],
+ node_->greedy (), token_, node_->followpos ());
+ }
+ }
+ }
+ }
+ }
+
+ static void fixup_bol (detail::node * &root_,
+ node_ptr_vector &node_ptr_vector_)
+ {
+ typename detail::node::node_vector *first_ = &root_->firstpos ();
+ bool found_ = false;
+ typename detail::node::node_vector::const_iterator iter_ =
+ first_->begin ();
+ typename detail::node::node_vector::const_iterator end_ =
+ first_->end ();
+
+ for (; iter_ != end_; ++iter_)
+ {
+ const detail::node *node_ = *iter_;
+
+ found_ = !node_->end_state () && node_->token () == bol_token;
+
+ if (found_) break;
+ }
+
+ if (!found_)
+ {
+ node_ptr_vector_->push_back (static_cast<detail::leaf_node *>(0));
+ node_ptr_vector_->back () = new detail::leaf_node
+ (bol_token, true);
+
+ detail::node *lhs_ = node_ptr_vector_->back ();
+
+ node_ptr_vector_->push_back (static_cast<detail::leaf_node *>(0));
+ node_ptr_vector_->back () = new detail::leaf_node
+ (null_token, true);
+
+ detail::node *rhs_ = node_ptr_vector_->back ();
+
+ node_ptr_vector_->push_back
+ (static_cast<detail::selection_node *>(0));
+ node_ptr_vector_->back () =
+ new detail::selection_node (lhs_, rhs_);
+ lhs_ = node_ptr_vector_->back ();
+
+ node_ptr_vector_->push_back
+ (static_cast<detail::sequence_node *>(0));
+ node_ptr_vector_->back () =
+ new detail::sequence_node (lhs_, root_);
+ root_ = node_ptr_vector_->back ();
+ }
+ }
+
+ static void minimise_dfa (const std::size_t dfa_alphabet_,
+ size_t_vector &dfa_, std::size_t size_)
+ {
+ const std::size_t *first_ = &dfa_.front ();
+ const std::size_t *second_ = 0;
+ const std::size_t *end_ = first_ + size_;
+ std::size_t index_ = 1;
+ std::size_t new_index_ = 1;
+ std::size_t curr_index_ = 0;
+ index_set index_set_;
+ size_t_vector lookup_;
+ std::size_t *lookup_ptr_ = 0;
+
+ lookup_.resize (size_ / dfa_alphabet_, null_token);
+ lookup_ptr_ = &lookup_.front ();
+ *lookup_ptr_ = 0;
+ // Only one 'jam' state, so skip it.
+ first_ += dfa_alphabet_;
+
+ for (; first_ < end_; first_ += dfa_alphabet_, ++index_)
+ {
+ for (second_ = first_ + dfa_alphabet_, curr_index_ = index_ + 1;
+ second_ < end_; second_ += dfa_alphabet_, ++curr_index_)
+ {
+ if (index_set_.find (curr_index_) != index_set_.end ())
+ {
+ continue;
+ }
+
+ // Some systems have memcmp in namespace std.
+ using namespace std;
+
+ if (memcmp (first_, second_, sizeof (std::size_t) *
+ dfa_alphabet_) == 0)
+ {
+ index_set_.insert (curr_index_);
+ lookup_ptr_[curr_index_] = new_index_;
+ }
+ }
+
+ if (lookup_ptr_[index_] == null_token)
+ {
+ lookup_ptr_[index_] = new_index_;
+ ++new_index_;
+ }
+ }
+
+ if (!index_set_.empty ())
+ {
+ const std::size_t *front_ = &dfa_.front ();
+ size_t_vector new_dfa_ (front_, front_ + dfa_alphabet_);
+ typename index_set::iterator set_end_ =
+ index_set_.end ();
+ const std::size_t *ptr_ = front_ + dfa_alphabet_;
+ std::size_t *new_ptr_ = 0;
+
+ new_dfa_.resize (size_ - index_set_.size () * dfa_alphabet_, 0);
+ new_ptr_ = &new_dfa_.front () + dfa_alphabet_;
+ size_ /= dfa_alphabet_;
+
+ for (index_ = 1; index_ < size_; ++index_)
+ {
+ if (index_set_.find (index_) != set_end_)
+ {
+ ptr_ += dfa_alphabet_;
+ continue;
+ }
+
+ new_ptr_[end_state_index] = ptr_[end_state_index];
+ new_ptr_[id_index] = ptr_[id_index];
+ new_ptr_[unique_id_index] = ptr_[unique_id_index];
+ new_ptr_[state_index] = ptr_[state_index];
+ new_ptr_[bol_index] = lookup_ptr_[ptr_[bol_index]];
+ new_ptr_[eol_index] = lookup_ptr_[ptr_[eol_index]];
+ new_ptr_ += dfa_offset;
+ ptr_ += dfa_offset;
+
+ for (std::size_t i_ = dfa_offset; i_ < dfa_alphabet_; ++i_)
+ {
+ *new_ptr_++ = lookup_ptr_[*ptr_++];
+ }
+ }
+
+ dfa_.swap (new_dfa_);
+ }
+ }
+};
+
+typedef basic_generator<char> generator;
+typedef basic_generator<wchar_t> wgenerator;
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/input.hpp b/boost/spirit/home/support/detail/lexer/input.hpp
new file mode 100644
index 0000000000..a575e6c8c8
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/input.hpp
@@ -0,0 +1,537 @@
+// input.hpp
+// Copyright (c) 2008-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_INPUT
+#define BOOST_LEXER_INPUT
+
+#include "char_traits.hpp"
+#include <boost/detail/iterator.hpp>
+#include "size_t.hpp"
+#include "state_machine.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+template<typename FwdIter, typename Traits =
+ char_traits<typename boost::detail::iterator_traits<FwdIter>::value_type> >
+class basic_input
+{
+public:
+ class iterator
+ {
+ public:
+#if defined _MSC_VER && _MSC_VER <= 1200
+ friend basic_input;
+#else
+ friend class basic_input;
+#endif
+
+ struct data
+ {
+ std::size_t id;
+ std::size_t unique_id;
+ FwdIter start;
+ FwdIter end;
+ bool bol;
+ std::size_t state;
+
+ // Construct in end() state.
+ data () :
+ id (0),
+ unique_id (npos),
+ bol (false),
+ state (npos)
+ {
+ }
+
+ bool operator == (const data &rhs_) const
+ {
+ return id == rhs_.id && unique_id == rhs_.unique_id &&
+ start == rhs_.start && end == rhs_.end &&
+ bol == rhs_.bol && state == rhs_.state;
+ }
+ };
+
+ iterator () :
+ _input (0)
+ {
+ }
+
+ bool operator == (const iterator &rhs_) const
+ {
+ return _data == rhs_._data;
+ }
+
+ bool operator != (const iterator &rhs_) const
+ {
+ return !(*this == rhs_);
+ }
+
+ data &operator * ()
+ {
+ return _data;
+ }
+
+ data *operator -> ()
+ {
+ return &_data;
+ }
+
+ // Let compiler generate operator = ().
+
+ // prefix version
+ iterator &operator ++ ()
+ {
+ next_token ();
+ return *this;
+ }
+
+ // postfix version
+ iterator operator ++ (int)
+ {
+ iterator iter_ = *this;
+
+ next_token ();
+ return iter_;
+ }
+
+ private:
+ // Not owner (obviously!)
+ const basic_input *_input;
+ data _data;
+
+ void next_token ()
+ {
+ const detail::internals &internals_ =
+ _input->_state_machine->data ();
+
+ _data.start = _data.end;
+
+ if (internals_._dfa->size () == 1)
+ {
+ if (internals_._seen_BOL_assertion ||
+ internals_._seen_EOL_assertion)
+ {
+ _data.id = next
+ (&internals_._lookup->front ()->front (),
+ internals_._dfa_alphabet.front (),
+ &internals_._dfa->front ()->front (),
+ _data.bol, _data.end, _input->_end, _data.unique_id);
+ }
+ else
+ {
+ _data.id = next (&internals_._lookup->front ()->front (),
+ internals_._dfa_alphabet.front (), &internals_.
+ _dfa->front ()->front (), _data.end, _input->_end,
+ _data.unique_id);
+ }
+ }
+ else
+ {
+ if (internals_._seen_BOL_assertion ||
+ internals_._seen_EOL_assertion)
+ {
+ _data.id = next (internals_, _data.state,
+ _data.bol, _data.end, _input->_end, _data.unique_id);
+ }
+ else
+ {
+ _data.id = next (internals_, _data.state,
+ _data.end, _input->_end, _data.unique_id);
+ }
+ }
+
+ if (_data.end == _input->_end && _data.start == _data.end)
+ {
+ // Ensure current state matches that returned by end().
+ _data.state = npos;
+ }
+ }
+
+ std::size_t next (const detail::internals &internals_,
+ std::size_t &start_state_, bool bol_,
+ FwdIter &start_token_, const FwdIter &end_,
+ std::size_t &unique_id_)
+ {
+ if (start_token_ == end_)
+ {
+ unique_id_ = npos;
+ return 0;
+ }
+
+ again:
+ const std::size_t * lookup_ = &internals_._lookup[start_state_]->
+ front ();
+ std::size_t dfa_alphabet_ = internals_._dfa_alphabet[start_state_];
+ const std::size_t *dfa_ = &internals_._dfa[start_state_]->front ();
+ const std::size_t *ptr_ = dfa_ + dfa_alphabet_;
+ FwdIter curr_ = start_token_;
+ bool end_state_ = *ptr_ != 0;
+ std::size_t id_ = *(ptr_ + id_index);
+ std::size_t uid_ = *(ptr_ + unique_id_index);
+ std::size_t end_start_state_ = start_state_;
+ bool end_bol_ = bol_;
+ FwdIter end_token_ = start_token_;
+
+ while (curr_ != end_)
+ {
+ const std::size_t BOL_state_ = ptr_[bol_index];
+ const std::size_t EOL_state_ = ptr_[eol_index];
+
+ if (BOL_state_ && bol_)
+ {
+ ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];
+ }
+ else if (EOL_state_ && *curr_ == '\n')
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+ }
+ else
+ {
+ typename Traits::char_type prev_char_ = *curr_++;
+
+ bol_ = prev_char_ == '\n';
+
+ const std::size_t state_ =
+ ptr_[lookup_[static_cast<typename Traits::index_type>
+ (prev_char_)]];
+
+ if (state_ == 0)
+ {
+ break;
+ }
+
+ ptr_ = &dfa_[state_ * dfa_alphabet_];
+ }
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ end_start_state_ = *(ptr_ + state_index);
+ end_bol_ = bol_;
+ end_token_ = curr_;
+ }
+ }
+
+ const std::size_t EOL_state_ = ptr_[eol_index];
+
+ if (EOL_state_ && curr_ == end_)
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ end_start_state_ = *(ptr_ + state_index);
+ end_bol_ = bol_;
+ end_token_ = curr_;
+ }
+ }
+
+ if (end_state_)
+ {
+ // return longest match
+ start_state_ = end_start_state_;
+ start_token_ = end_token_;
+
+ if (id_ == 0)
+ {
+ bol_ = end_bol_;
+ goto again;
+ }
+ else
+ {
+ _data.bol = end_bol_;
+ }
+ }
+ else
+ {
+ // No match causes char to be skipped
+ _data.bol = *start_token_ == '\n';
+ ++start_token_;
+ id_ = npos;
+ uid_ = npos;
+ }
+
+ unique_id_ = uid_;
+ return id_;
+ }
+
+ std::size_t next (const detail::internals &internals_,
+ std::size_t &start_state_, FwdIter &start_token_,
+ FwdIter const &end_, std::size_t &unique_id_)
+ {
+ if (start_token_ == end_)
+ {
+ unique_id_ = npos;
+ return 0;
+ }
+
+ again:
+ const std::size_t * lookup_ = &internals_._lookup[start_state_]->
+ front ();
+ std::size_t dfa_alphabet_ = internals_._dfa_alphabet[start_state_];
+ const std::size_t *dfa_ = &internals_._dfa[start_state_]->front ();
+ const std::size_t *ptr_ = dfa_ + dfa_alphabet_;
+ FwdIter curr_ = start_token_;
+ bool end_state_ = *ptr_ != 0;
+ std::size_t id_ = *(ptr_ + id_index);
+ std::size_t uid_ = *(ptr_ + unique_id_index);
+ std::size_t end_start_state_ = start_state_;
+ FwdIter end_token_ = start_token_;
+
+ while (curr_ != end_)
+ {
+ const std::size_t state_ = ptr_[lookup_[static_cast
+ <typename Traits::index_type>(*curr_++)]];
+
+ if (state_ == 0)
+ {
+ break;
+ }
+
+ ptr_ = &dfa_[state_ * dfa_alphabet_];
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ end_start_state_ = *(ptr_ + state_index);
+ end_token_ = curr_;
+ }
+ }
+
+ if (end_state_)
+ {
+ // return longest match
+ start_state_ = end_start_state_;
+ start_token_ = end_token_;
+
+ if (id_ == 0) goto again;
+ }
+ else
+ {
+ // No match causes char to be skipped
+ ++start_token_;
+ id_ = npos;
+ uid_ = npos;
+ }
+
+ unique_id_ = uid_;
+ return id_;
+ }
+
+ std::size_t next (const std::size_t * const lookup_,
+ const std::size_t dfa_alphabet_, const std::size_t * const dfa_,
+ bool bol_, FwdIter &start_token_, FwdIter const &end_,
+ std::size_t &unique_id_)
+ {
+ if (start_token_ == end_)
+ {
+ unique_id_ = npos;
+ return 0;
+ }
+
+ const std::size_t *ptr_ = dfa_ + dfa_alphabet_;
+ FwdIter curr_ = start_token_;
+ bool end_state_ = *ptr_ != 0;
+ std::size_t id_ = *(ptr_ + id_index);
+ std::size_t uid_ = *(ptr_ + unique_id_index);
+ bool end_bol_ = bol_;
+ FwdIter end_token_ = start_token_;
+
+ while (curr_ != end_)
+ {
+ const std::size_t BOL_state_ = ptr_[bol_index];
+ const std::size_t EOL_state_ = ptr_[eol_index];
+
+ if (BOL_state_ && bol_)
+ {
+ ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];
+ }
+ else if (EOL_state_ && *curr_ == '\n')
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+ }
+ else
+ {
+ typename Traits::char_type prev_char_ = *curr_++;
+
+ bol_ = prev_char_ == '\n';
+
+ const std::size_t state_ =
+ ptr_[lookup_[static_cast<typename Traits::index_type>
+ (prev_char_)]];
+
+ if (state_ == 0)
+ {
+ break;
+ }
+
+ ptr_ = &dfa_[state_ * dfa_alphabet_];
+ }
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ end_bol_ = bol_;
+ end_token_ = curr_;
+ }
+ }
+
+ const std::size_t EOL_state_ = ptr_[eol_index];
+
+ if (EOL_state_ && curr_ == end_)
+ {
+ ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ end_bol_ = bol_;
+ end_token_ = curr_;
+ }
+ }
+
+ if (end_state_)
+ {
+ // return longest match
+ _data.bol = end_bol_;
+ start_token_ = end_token_;
+ }
+ else
+ {
+ // No match causes char to be skipped
+ _data.bol = *start_token_ == '\n';
+ ++start_token_;
+ id_ = npos;
+ uid_ = npos;
+ }
+
+ unique_id_ = uid_;
+ return id_;
+ }
+
+ std::size_t next (const std::size_t * const lookup_,
+ const std::size_t dfa_alphabet_, const std::size_t * const dfa_,
+ FwdIter &start_token_, FwdIter const &end_,
+ std::size_t &unique_id_)
+ {
+ if (start_token_ == end_)
+ {
+ unique_id_ = npos;
+ return 0;
+ }
+
+ const std::size_t *ptr_ = dfa_ + dfa_alphabet_;
+ FwdIter curr_ = start_token_;
+ bool end_state_ = *ptr_ != 0;
+ std::size_t id_ = *(ptr_ + id_index);
+ std::size_t uid_ = *(ptr_ + unique_id_index);
+ FwdIter end_token_ = start_token_;
+
+ while (curr_ != end_)
+ {
+ const std::size_t state_ = ptr_[lookup_[static_cast
+ <typename Traits::index_type>(*curr_++)]];
+
+ if (state_ == 0)
+ {
+ break;
+ }
+
+ ptr_ = &dfa_[state_ * dfa_alphabet_];
+
+ if (*ptr_)
+ {
+ end_state_ = true;
+ id_ = *(ptr_ + id_index);
+ uid_ = *(ptr_ + unique_id_index);
+ end_token_ = curr_;
+ }
+ }
+
+ if (end_state_)
+ {
+ // return longest match
+ start_token_ = end_token_;
+ }
+ else
+ {
+ // No match causes char to be skipped
+ ++start_token_;
+ id_ = npos;
+ uid_ = npos;
+ }
+
+ unique_id_ = uid_;
+ return id_;
+ }
+ };
+
+#if defined _MSC_VER && _MSC_VER <= 1200
+ friend iterator;
+#else
+ friend class iterator;
+#endif
+
+ // Make it explict that we are NOT taking a copy of state_machine_!
+ basic_input (const basic_state_machine<typename Traits::char_type>
+ *state_machine_, const FwdIter &begin_, const FwdIter &end_) :
+ _state_machine (state_machine_),
+ _begin (begin_),
+ _end (end_)
+ {
+ }
+
+ iterator begin () const
+ {
+ iterator iter_;
+
+ iter_._input = this;
+ // Over-ride default of 0 (EOI)
+ iter_._data.id = npos;
+ iter_._data.start = _begin;
+ iter_._data.end = _begin;
+ iter_._data.bol = _state_machine->data ()._seen_BOL_assertion;
+ iter_._data.state = 0;
+ ++iter_;
+ return iter_;
+ }
+
+ iterator end () const
+ {
+ iterator iter_;
+
+ iter_._input = this;
+ iter_._data.start = _end;
+ iter_._data.end = _end;
+ return iter_;
+ }
+
+private:
+ const basic_state_machine<typename Traits::char_type> *_state_machine;
+ FwdIter _begin;
+ FwdIter _end;
+};
+
+typedef basic_input<std::string::iterator> iter_input;
+typedef basic_input<std::basic_string<wchar_t>::iterator> iter_winput;
+typedef basic_input<const char *> ptr_input;
+typedef basic_input<const wchar_t *> ptr_winput;
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/internals.hpp b/boost/spirit/home/support/detail/lexer/internals.hpp
new file mode 100644
index 0000000000..5f3a026cc9
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/internals.hpp
@@ -0,0 +1,60 @@
+// internals.hpp
+// Copyright (c) 2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_INTERNALS_HPP
+#define BOOST_LEXER_INTERNALS_HPP
+
+#include "containers/ptr_vector.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+struct internals
+{
+ typedef std::vector<std::size_t> size_t_vector;
+ typedef ptr_vector<size_t_vector> size_t_vector_vector;
+
+ size_t_vector_vector _lookup;
+ size_t_vector _dfa_alphabet;
+ size_t_vector_vector _dfa;
+ bool _seen_BOL_assertion;
+ bool _seen_EOL_assertion;
+
+ internals () :
+ _seen_BOL_assertion (false),
+ _seen_EOL_assertion (false)
+ {
+ }
+
+ void clear ()
+ {
+ _lookup.clear ();
+ _dfa_alphabet.clear ();
+ _dfa.clear ();
+ _seen_BOL_assertion = false;
+ _seen_EOL_assertion = false;
+ }
+
+ void swap (internals &internals_)
+ {
+ _lookup->swap (*internals_._lookup);
+ _dfa_alphabet.swap (internals_._dfa_alphabet);
+ _dfa->swap (*internals_._dfa);
+ std::swap (_seen_BOL_assertion, internals_._seen_BOL_assertion);
+ std::swap (_seen_EOL_assertion, internals_._seen_EOL_assertion);
+ }
+
+private:
+ internals (const internals &); // No copy construction.
+ internals &operator = (const internals &); // No assignment.
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/parser.hpp b/boost/spirit/home/support/detail/lexer/parser/parser.hpp
new file mode 100644
index 0000000000..9000e5e36e
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/parser.hpp
@@ -0,0 +1,511 @@
+// parser.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_PARSER_HPP
+#define BOOST_LEXER_PARSER_HPP
+
+#include <boost/assert.hpp>
+#include "tree/end_node.hpp"
+#include "tree/iteration_node.hpp"
+#include "tree/leaf_node.hpp"
+#include "../runtime_error.hpp"
+#include "tree/selection_node.hpp"
+#include "tree/sequence_node.hpp"
+#include "../size_t.hpp"
+#include "tokeniser/re_tokeniser.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename CharT>
+class basic_parser
+{
+public:
+ typedef basic_re_tokeniser<CharT> tokeniser;
+ typedef typename tokeniser::string string;
+ typedef std::map<string, const node *> macro_map;
+ typedef node::node_ptr_vector node_ptr_vector;
+ typedef typename tokeniser::num_token token;
+
+/*
+ General principles of regex parsing:
+ - Every regex is a sequence of sub-regexes.
+ - Regexes consist of operands and operators
+ - All operators decompose to sequence, selection ('|') and iteration ('*')
+ - Regex tokens are stored on the stack.
+ - When a complete sequence of regex tokens is on the stack it is processed.
+
+Grammar:
+
+<REGEX> -> <OREXP>
+<OREXP> -> <SEQUENCE> | <OREXP>'|'<SEQUENCE>
+<SEQUENCE> -> <SUB>
+<SUB> -> <EXPRESSION> | <SUB><EXPRESSION>
+<EXPRESSION> -> <REPEAT>
+<REPEAT> -> charset | macro | '('<REGEX>')' | <REPEAT><DUPLICATE>
+<DUPLICATE> -> '?' | '*' | '+' | '{n[,[m]]}'
+*/
+ static node *parse (const CharT *start_, const CharT * const end_,
+ const std::size_t id_, const std::size_t unique_id_,
+ const std::size_t dfa_state_, const regex_flags flags_,
+ const std::locale &locale_, node_ptr_vector &node_ptr_vector_,
+ const macro_map &macromap_, typename tokeniser::token_map &map_,
+ bool &seen_BOL_assertion_, bool &seen_EOL_assertion_)
+ {
+ node *root_ = 0;
+ state state_ (start_, end_, flags_, locale_);
+ token lhs_token_;
+ token rhs_token_;
+ token_stack token_stack_;
+ tree_node_stack tree_node_stack_;
+ char action_ = 0;
+
+ token_stack_.push (rhs_token_);
+ tokeniser::next (state_, map_, rhs_token_);
+
+ do
+ {
+ lhs_token_ = token_stack_.top ();
+ action_ = lhs_token_.precedence (rhs_token_._type);
+
+ switch (action_)
+ {
+ case '<':
+ case '=':
+ token_stack_.push (rhs_token_);
+ tokeniser::next (state_, map_, rhs_token_);
+ break;
+ case '>':
+ reduce (token_stack_, macromap_, node_ptr_vector_,
+ tree_node_stack_);
+ break;
+ default:
+ std::ostringstream ss_;
+
+ ss_ << "A syntax error occured: '" <<
+ lhs_token_.precedence_string () <<
+ "' against '" << rhs_token_.precedence_string () <<
+ "' at index " << state_.index () << ".";
+ throw runtime_error (ss_.str ().c_str ());
+ break;
+ }
+ } while (!token_stack_.empty ());
+
+ if (tree_node_stack_.empty ())
+ {
+ throw runtime_error ("Empty rules are not allowed.");
+ }
+
+ BOOST_ASSERT(tree_node_stack_.size () == 1);
+
+ node *lhs_node_ = tree_node_stack_.top ();
+
+ tree_node_stack_.pop ();
+
+ if (id_ == 0)
+ {
+ // Macros have no end state...
+ root_ = lhs_node_;
+ }
+ else
+ {
+ node_ptr_vector_->push_back (static_cast<end_node *>(0));
+
+ node *rhs_node_ = new end_node (id_, unique_id_, dfa_state_);
+
+ node_ptr_vector_->back () = rhs_node_;
+ node_ptr_vector_->push_back (static_cast<sequence_node *>(0));
+ node_ptr_vector_->back () = new sequence_node
+ (lhs_node_, rhs_node_);
+ root_ = node_ptr_vector_->back ();
+ }
+
+ // Done this way as bug in VC++ 6 prevents |= operator working
+ // properly!
+ if (state_._seen_BOL_assertion) seen_BOL_assertion_ = true;
+
+ if (state_._seen_EOL_assertion) seen_EOL_assertion_ = true;
+
+ return root_;
+ }
+
+private:
+ typedef typename tokeniser::state state;
+ typedef std::stack<token> token_stack;
+ typedef node::node_stack tree_node_stack;
+
+ static void reduce (token_stack &token_stack_,
+ const macro_map &macromap_, node_ptr_vector &node_vector_ptr_,
+ tree_node_stack &tree_node_stack_)
+ {
+ typename tokeniser::num_token lhs_;
+ typename tokeniser::num_token rhs_;
+ token_stack handle_;
+ char action_ = 0;
+
+ do
+ {
+ rhs_ = token_stack_.top ();
+ token_stack_.pop ();
+ handle_.push (rhs_);
+
+ if (!token_stack_.empty ())
+ {
+ lhs_ = token_stack_.top ();
+ action_ = lhs_.precedence (rhs_._type);
+ }
+ } while (!token_stack_.empty () && action_ == '=');
+
+ BOOST_ASSERT(token_stack_.empty () || action_ == '<');
+
+ switch (rhs_._type)
+ {
+ case token::BEGIN:
+ // finished processing so exit
+ break;
+ case token::REGEX:
+ // finished parsing, nothing to do
+ break;
+ case token::OREXP:
+ orexp (handle_, token_stack_, node_vector_ptr_, tree_node_stack_);
+ break;
+ case token::SEQUENCE:
+ token_stack_.push (token::OREXP);
+ break;
+ case token::SUB:
+ sub (handle_, token_stack_, node_vector_ptr_, tree_node_stack_);
+ break;
+ case token::EXPRESSION:
+ token_stack_.push (token::SUB);
+ break;
+ case token::REPEAT:
+ repeat (handle_, token_stack_);
+ break;
+ case token::CHARSET:
+ charset (handle_, token_stack_, node_vector_ptr_,
+ tree_node_stack_);
+ break;
+ case token::MACRO:
+ macro (handle_, token_stack_, macromap_, node_vector_ptr_,
+ tree_node_stack_);
+ break;
+ case token::OPENPAREN:
+ openparen (handle_, token_stack_);
+ break;
+ case token::OPT:
+ case token::AOPT:
+ optional (rhs_._type == token::OPT, node_vector_ptr_,
+ tree_node_stack_);
+ token_stack_.push (token::DUP);
+ break;
+ case token::ZEROORMORE:
+ case token::AZEROORMORE:
+ zero_or_more (rhs_._type == token::ZEROORMORE, node_vector_ptr_,
+ tree_node_stack_);
+ token_stack_.push (token::DUP);
+ break;
+ case token::ONEORMORE:
+ case token::AONEORMORE:
+ one_or_more (rhs_._type == token::ONEORMORE, node_vector_ptr_,
+ tree_node_stack_);
+ token_stack_.push (token::DUP);
+ break;
+ case token::REPEATN:
+ case token::AREPEATN:
+ repeatn (rhs_._type == token::REPEATN, handle_.top (),
+ node_vector_ptr_, tree_node_stack_);
+ token_stack_.push (token::DUP);
+ break;
+ default:
+ throw runtime_error
+ ("Internal error regex_parser::reduce");
+ break;
+ }
+ }
+
+ static void orexp (token_stack &handle_, token_stack &token_stack_,
+ node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)
+ {
+ BOOST_ASSERT(handle_.top ()._type == token::OREXP &&
+ (handle_.size () == 1 || handle_.size () == 3));
+
+ if (handle_.size () == 1)
+ {
+ token_stack_.push (token::REGEX);
+ }
+ else
+ {
+ handle_.pop ();
+ BOOST_ASSERT(handle_.top ()._type == token::OR);
+ handle_.pop ();
+ BOOST_ASSERT(handle_.top ()._type == token::SEQUENCE);
+ perform_or (node_ptr_vector_, tree_node_stack_);
+ token_stack_.push (token::OREXP);
+ }
+ }
+
+ static void sub (token_stack &handle_, token_stack &token_stack_,
+ node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)
+ {
+ BOOST_ASSERT(handle_.top ()._type == token::SUB &&
+ (handle_.size () == 1 || handle_.size () == 2));
+
+ if (handle_.size () == 1)
+ {
+ token_stack_.push (token::SEQUENCE);
+ }
+ else
+ {
+ handle_.pop ();
+ BOOST_ASSERT(handle_.top ()._type == token::EXPRESSION);
+ // perform join
+ sequence (node_ptr_vector_, tree_node_stack_);
+ token_stack_.push (token::SUB);
+ }
+ }
+
+ static void repeat (token_stack &handle_, token_stack &token_stack_)
+ {
+ BOOST_ASSERT(handle_.top ()._type == token::REPEAT &&
+ handle_.size () >= 1 && handle_.size () <= 3);
+
+ if (handle_.size () == 1)
+ {
+ token_stack_.push (token::EXPRESSION);
+ }
+ else
+ {
+ handle_.pop ();
+ BOOST_ASSERT(handle_.top ()._type == token::DUP);
+ token_stack_.push (token::REPEAT);
+ }
+ }
+
+ static void charset (token_stack &handle_, token_stack &token_stack_,
+ node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)
+ {
+ BOOST_ASSERT(handle_.top ()._type == token::CHARSET &&
+ handle_.size () == 1);
+ // store charset
+ node_ptr_vector_->push_back (static_cast<leaf_node *>(0));
+
+ const size_t id_ = handle_.top ()._id;
+
+ node_ptr_vector_->back () = new leaf_node (id_, true);
+ tree_node_stack_.push (node_ptr_vector_->back ());
+ token_stack_.push (token::REPEAT);
+ }
+
+ static void macro (token_stack &handle_, token_stack &token_stack_,
+ const macro_map &macromap_, node_ptr_vector &node_ptr_vector_,
+ tree_node_stack &tree_node_stack_)
+ {
+ token &top_ = handle_.top ();
+
+ BOOST_ASSERT(top_._type == token::MACRO && handle_.size () == 1);
+
+ typename macro_map::const_iterator iter_ =
+ macromap_.find (top_._macro);
+
+ if (iter_ == macromap_.end ())
+ {
+ const CharT *name_ = top_._macro;
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "Unknown MACRO name '";
+
+ while (*name_)
+ {
+ os_ << ss_.narrow (*name_++, ' ');
+ }
+
+ os_ << "'.";
+ throw runtime_error (os_.str ());
+ }
+
+ tree_node_stack_.push (iter_->second->copy (node_ptr_vector_));
+ token_stack_.push (token::REPEAT);
+ }
+
+ static void openparen (token_stack &handle_, token_stack &token_stack_)
+ {
+ BOOST_ASSERT(handle_.top ()._type == token::OPENPAREN &&
+ handle_.size () == 3);
+ handle_.pop ();
+ BOOST_ASSERT(handle_.top ()._type == token::REGEX);
+ handle_.pop ();
+ BOOST_ASSERT(handle_.top ()._type == token::CLOSEPAREN);
+ token_stack_.push (token::REPEAT);
+ }
+
+ static void perform_or (node_ptr_vector &node_ptr_vector_,
+ tree_node_stack &tree_node_stack_)
+ {
+ // perform or
+ node *rhs_ = tree_node_stack_.top ();
+
+ tree_node_stack_.pop ();
+
+ node *lhs_ = tree_node_stack_.top ();
+
+ node_ptr_vector_->push_back (static_cast<selection_node *>(0));
+ node_ptr_vector_->back () = new selection_node (lhs_, rhs_);
+ tree_node_stack_.top () = node_ptr_vector_->back ();
+ }
+
+ static void sequence (node_ptr_vector &node_ptr_vector_,
+ tree_node_stack &tree_node_stack_)
+ {
+ node *rhs_ = tree_node_stack_.top ();
+
+ tree_node_stack_.pop ();
+
+ node *lhs_ = tree_node_stack_.top ();
+
+ node_ptr_vector_->push_back (static_cast<sequence_node *>(0));
+ node_ptr_vector_->back () = new sequence_node (lhs_, rhs_);
+ tree_node_stack_.top () = node_ptr_vector_->back ();
+ }
+
+ static void optional (const bool greedy_,
+ node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)
+ {
+ // perform ?
+ node *lhs_ = tree_node_stack_.top ();
+ // You don't know if lhs_ is a leaf_node, so get firstpos.
+ node::node_vector &firstpos_ = lhs_->firstpos ();
+
+ for (node::node_vector::iterator iter_ = firstpos_.begin (),
+ end_ = firstpos_.end (); iter_ != end_; ++iter_)
+ {
+ // These are leaf_nodes!
+ (*iter_)->greedy (greedy_);
+ }
+
+ node_ptr_vector_->push_back (static_cast<leaf_node *>(0));
+
+ node *rhs_ = new leaf_node (null_token, greedy_);
+
+ node_ptr_vector_->back () = rhs_;
+ node_ptr_vector_->push_back (static_cast<selection_node *>(0));
+ node_ptr_vector_->back () = new selection_node (lhs_, rhs_);
+ tree_node_stack_.top () = node_ptr_vector_->back ();
+ }
+
+ static void zero_or_more (const bool greedy_,
+ node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)
+ {
+ // perform *
+ node *ptr_ = tree_node_stack_.top ();
+
+ node_ptr_vector_->push_back (static_cast<iteration_node *>(0));
+ node_ptr_vector_->back () = new iteration_node (ptr_, greedy_);
+ tree_node_stack_.top () = node_ptr_vector_->back ();
+ }
+
+ static void one_or_more (const bool greedy_,
+ node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)
+ {
+ // perform +
+ node *lhs_ = tree_node_stack_.top ();
+ node *copy_ = lhs_->copy (node_ptr_vector_);
+
+ node_ptr_vector_->push_back (static_cast<iteration_node *>(0));
+
+ node *rhs_ = new iteration_node (copy_, greedy_);
+
+ node_ptr_vector_->back () = rhs_;
+ node_ptr_vector_->push_back (static_cast<sequence_node *>(0));
+ node_ptr_vector_->back () = new sequence_node (lhs_, rhs_);
+ tree_node_stack_.top () = node_ptr_vector_->back ();
+ }
+
+ // This is one of the most mind bending routines in this code...
+ static void repeatn (const bool greedy_, const token &token_,
+ node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)
+ {
+ // perform {n[,[m]]}
+ // Semantic checks have already been performed.
+ // {0,} = *
+ // {0,1} = ?
+ // {1,} = +
+ // therefore we do not check for these cases.
+ if (!(token_._min == 1 && !token_._comma))
+ {
+ const std::size_t top_ = token_._min > 0 ?
+ token_._min : token_._max;
+
+ if (token_._min == 0)
+ {
+ optional (greedy_, node_ptr_vector_, tree_node_stack_);
+ }
+
+ node *prev_ = tree_node_stack_.top ()->copy (node_ptr_vector_);
+ node *curr_ = 0;
+
+ for (std::size_t i_ = 2; i_ < top_; ++i_)
+ {
+ curr_ = prev_->copy (node_ptr_vector_);
+ tree_node_stack_.push (static_cast<node *>(0));
+ tree_node_stack_.top () = prev_;
+ sequence (node_ptr_vector_, tree_node_stack_);
+ prev_ = curr_;
+ }
+
+ if (token_._comma && token_._min > 0)
+ {
+ if (token_._min > 1)
+ {
+ curr_ = prev_->copy (node_ptr_vector_);
+ tree_node_stack_.push (static_cast<node *>(0));
+ tree_node_stack_.top () = prev_;
+ sequence (node_ptr_vector_, tree_node_stack_);
+ prev_ = curr_;
+ }
+
+ if (token_._comma && token_._max)
+ {
+ tree_node_stack_.push (static_cast<node *>(0));
+ tree_node_stack_.top () = prev_;
+ optional (greedy_, node_ptr_vector_, tree_node_stack_);
+ prev_ = tree_node_stack_.top ();
+ tree_node_stack_.pop ();
+
+ const std::size_t count_ = token_._max - token_._min;
+
+ for (std::size_t i_ = 1; i_ < count_; ++i_)
+ {
+ curr_ = prev_->copy (node_ptr_vector_);
+ tree_node_stack_.push (static_cast<node *>(0));
+ tree_node_stack_.top () = prev_;
+ sequence (node_ptr_vector_, tree_node_stack_);
+ prev_ = curr_;
+ }
+ }
+ else
+ {
+ tree_node_stack_.push (static_cast<node *>(0));
+ tree_node_stack_.top () = prev_;
+ zero_or_more (greedy_, node_ptr_vector_, tree_node_stack_);
+ prev_ = tree_node_stack_.top ();
+ tree_node_stack_.pop ();
+ }
+ }
+
+ tree_node_stack_.push (static_cast<node *>(0));
+ tree_node_stack_.top () = prev_;
+ sequence (node_ptr_vector_, tree_node_stack_);
+ }
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tokeniser/num_token.hpp b/boost/spirit/home/support/detail/lexer/parser/tokeniser/num_token.hpp
new file mode 100644
index 0000000000..dc1c6bd865
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tokeniser/num_token.hpp
@@ -0,0 +1,146 @@
+// num_token.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_NUM_TOKEN_HPP
+#define BOOST_LEXER_NUM_TOKEN_HPP
+
+#include <boost/config.hpp>
+#include "../../consts.hpp" // null_token
+#include "../../size_t.hpp"
+#include <boost/detail/workaround.hpp>
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename CharT>
+struct basic_num_token
+{
+ enum type {BEGIN, REGEX, OREXP, SEQUENCE, SUB, EXPRESSION, REPEAT,
+ DUP, OR, CHARSET, MACRO, OPENPAREN, CLOSEPAREN, OPT, AOPT,
+ ZEROORMORE, AZEROORMORE, ONEORMORE, AONEORMORE, REPEATN, AREPEATN,
+ END};
+
+ type _type;
+ std::size_t _id;
+ std::size_t _min;
+ bool _comma;
+ std::size_t _max;
+ CharT _macro[max_macro_len + 1];
+ static const char _precedence_table[END + 1][END + 1];
+ static const char *_precedence_strings[END + 1];
+
+ basic_num_token (const type type_ = BEGIN,
+ const std::size_t id_ = null_token) :
+ _type (type_),
+ _id (id_),
+ _min (0),
+ _comma (false),
+ _max (0)
+ {
+ *_macro = 0;
+ }
+
+ basic_num_token &operator = (const basic_num_token &rhs_)
+ {
+ _type = rhs_._type;
+ _id = rhs_._id;
+ _min = rhs_._min;
+ _comma = rhs_._comma;
+ _max = rhs_._max;
+
+ if (_type == MACRO)
+ {
+ const CharT *read_ = rhs_._macro;
+ CharT *write_ = _macro;
+
+ while (*read_)
+ {
+ *write_++ = *read_++;
+ }
+
+ *write_ = 0;
+ }
+
+ return *this;
+ }
+
+ void set (const type type_)
+ {
+ _type = type_;
+ _id = null_token;
+ }
+
+ void set (const type type_, const std::size_t id_)
+ {
+ _type = type_;
+ _id = id_;
+ }
+
+ void min_max (const std::size_t min_, const bool comma_,
+ const std::size_t max_)
+ {
+ _min = min_;
+ _comma = comma_;
+ _max = max_;
+ }
+
+ char precedence (const type type_) const
+ {
+ return _precedence_table[_type][type_];
+ }
+
+ const char *precedence_string () const
+ {
+ return _precedence_strings[_type];
+ }
+};
+
+template<typename CharT>
+const char basic_num_token<CharT>::_precedence_table[END + 1][END + 1] = {
+// BEG, REG, ORE, SEQ, SUB, EXP, RPT, DUP, | , CHR, MCR, ( , ) , ? , ?? , * , *? , + , +?, {n}?, {n}, END
+/*BEGIN*/{' ', '<', '<', '<', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/*REGEX*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/*OREXP*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', '>', '>', ' ', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* SEQ */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', ' ', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* SUB */{' ', ' ', ' ', ' ', ' ', '=', '<', ' ', '>', '<', '<', '<', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/*EXPRE*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* RPT */{' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', '>', '>', '>', '>', '>', '<', '<', '<', '<', '<', '<', '<', '<', '>'},
+/*DUPLI*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* | */{' ', ' ', ' ', '=', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
+/*CHARA*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'},
+/*MACRO*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'},
+/* ( */{' ', '=', '<', '<', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
+/* ) */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'},
+/* ? */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* ?? */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* * */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* *? */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* + */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* +? */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/*{n,m}*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/*{nm}?*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
+/* END */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}
+};
+
+template<typename CharT>
+const char *basic_num_token<CharT>::_precedence_strings[END + 1] =
+#if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(910))
+{{"BEGIN"}, {"REGEX"}, {"OREXP"}, {"SEQUENCE"}, {"SUB"}, {"EXPRESSION"},
+ {"REPEAT"}, {"DUPLICATE"}, {"|"}, {"CHARSET"}, {"MACRO"},
+ {"("}, {")"}, {"?"}, {"??"}, {"*"}, {"*?"}, {"+"}, {"+?"}, {"{n[,[m]]}"},
+ {"{n[,[m]]}?"}, {"END"}};
+#else
+{"BEGIN", "REGEX", "OREXP", "SEQUENCE", "SUB", "EXPRESSION", "REPEAT",
+ "DUPLICATE", "|", "CHARSET", "MACRO", "(", ")", "?", "??", "*", "*?",
+ "+", "+?", "{n[,[m]]}", "{n[,[m]]}?", "END"};
+#endif
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser.hpp b/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser.hpp
new file mode 100644
index 0000000000..7bdeb80403
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser.hpp
@@ -0,0 +1,574 @@
+// tokeniser.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_RE_TOKENISER_HPP
+#define BOOST_LEXER_RE_TOKENISER_HPP
+
+// memcpy()
+#include <cstring>
+#include <map>
+#include "num_token.hpp"
+#include "../../runtime_error.hpp"
+#include "../../size_t.hpp"
+#include <sstream>
+#include "../../string_token.hpp"
+#include "re_tokeniser_helper.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename CharT>
+class basic_re_tokeniser
+{
+public:
+ typedef basic_num_token<CharT> num_token;
+ typedef basic_re_tokeniser_state<CharT> state;
+ typedef basic_string_token<CharT> string_token;
+ typedef typename string_token::string string;
+ typedef std::map<string_token, std::size_t> token_map;
+ typedef std::pair<string_token, std::size_t> token_pair;
+
+ static void next (state &state_, token_map &map_, num_token &token_)
+ {
+ CharT ch_ = 0;
+ bool eos_ = state_.next (ch_);
+
+ token_.min_max (0, false, 0);
+
+ while (!eos_ && ch_ == '"')
+ {
+ state_._in_string ^= 1;
+ eos_ = state_.next (ch_);
+ }
+
+ if (eos_)
+ {
+ if (state_._in_string)
+ {
+ throw runtime_error ("Unexpected end of regex "
+ "(missing '\"').");
+ }
+
+ if (state_._paren_count)
+ {
+ throw runtime_error ("Unexpected end of regex "
+ "(missing ')').");
+ }
+
+ token_.set (num_token::END, null_token);
+ }
+ else
+ {
+ if (ch_ == '\\')
+ {
+ // Even if we are in a string, respect escape sequences...
+ escape (state_, map_, token_);
+ }
+ else if (state_._in_string)
+ {
+ // All other meta characters lose their special meaning
+ // inside a string.
+ create_charset_token (string (1, ch_), false, map_, token_);
+ }
+ else
+ {
+ // Not an escape sequence and not inside a string, so
+ // check for meta characters.
+ switch (ch_)
+ {
+ case '(':
+ token_.set (num_token::OPENPAREN, null_token);
+ ++state_._paren_count;
+ read_options (state_);
+ break;
+ case ')':
+ --state_._paren_count;
+
+ if (state_._paren_count < 0)
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Number of open parenthesis < 0 at index " <<
+ state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ token_.set (num_token::CLOSEPAREN, null_token);
+
+ if (!state_._flags_stack.empty ())
+ {
+ state_._flags = state_._flags_stack.top ();
+ state_._flags_stack.pop ();
+ }
+ break;
+ case '?':
+ if (!state_.eos () && *state_._curr == '?')
+ {
+ token_.set (num_token::AOPT, null_token);
+ state_.increment ();
+ }
+ else
+ {
+ token_.set (num_token::OPT, null_token);
+ }
+
+ break;
+ case '*':
+ if (!state_.eos () && *state_._curr == '?')
+ {
+ token_.set (num_token::AZEROORMORE, null_token);
+ state_.increment ();
+ }
+ else
+ {
+ token_.set (num_token::ZEROORMORE, null_token);
+ }
+
+ break;
+ case '+':
+ if (!state_.eos () && *state_._curr == '?')
+ {
+ token_.set (num_token::AONEORMORE, null_token);
+ state_.increment ();
+ }
+ else
+ {
+ token_.set (num_token::ONEORMORE, null_token);
+ }
+
+ break;
+ case '{':
+ open_curly (state_, token_);
+ break;
+ case '|':
+ token_.set (num_token::OR, null_token);
+ break;
+ case '^':
+ if (state_._curr - 1 == state_._start)
+ {
+ token_.set (num_token::CHARSET, bol_token);
+ state_._seen_BOL_assertion = true;
+ }
+ else
+ {
+ create_charset_token (string (1, ch_), false,
+ map_, token_);
+ }
+
+ break;
+ case '$':
+ if (state_._curr == state_._end)
+ {
+ token_.set (num_token::CHARSET, eol_token);
+ state_._seen_EOL_assertion = true;
+ }
+ else
+ {
+ create_charset_token (string (1, ch_), false,
+ map_, token_);
+ }
+
+ break;
+ case '.':
+ {
+ string dot_;
+
+ if (state_._flags & dot_not_newline)
+ {
+ dot_ = '\n';
+ }
+
+ create_charset_token (dot_, true, map_, token_);
+ break;
+ }
+ case '[':
+ {
+ charset (state_, map_, token_);
+ break;
+ }
+ case '/':
+ throw runtime_error("Lookahead ('/') is not supported yet.");
+ break;
+ default:
+ if ((state_._flags & icase) &&
+ (std::isupper (ch_, state_._locale) ||
+ std::islower (ch_, state_._locale)))
+ {
+ CharT upper_ = std::toupper (ch_, state_._locale);
+ CharT lower_ = std::tolower (ch_, state_._locale);
+
+ string str_ (1, upper_);
+
+ str_ += lower_;
+ create_charset_token (str_, false, map_, token_);
+ }
+ else
+ {
+ create_charset_token (string (1, ch_), false,
+ map_, token_);
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+private:
+ typedef basic_re_tokeniser_helper<CharT> tokeniser_helper;
+
+ static void read_options (state &state_)
+ {
+ if (!state_.eos () && *state_._curr == '?')
+ {
+ CharT ch_ = 0;
+ bool eos_ = false;
+ bool negate_ = false;
+
+ state_.increment ();
+ eos_ = state_.next (ch_);
+ state_._flags_stack.push (state_._flags);
+
+ while (!eos_ && ch_ != ':')
+ {
+ switch (ch_)
+ {
+ case '-':
+ negate_ ^= 1;
+ break;
+ case 'i':
+ if (negate_)
+ {
+ state_._flags = static_cast<regex_flags>
+ (state_._flags & ~icase);
+ }
+ else
+ {
+ state_._flags = static_cast<regex_flags>
+ (state_._flags | icase);
+ }
+
+ negate_ = false;
+ break;
+ case 's':
+ if (negate_)
+ {
+ state_._flags = static_cast<regex_flags>
+ (state_._flags | dot_not_newline);
+ }
+ else
+ {
+ state_._flags = static_cast<regex_flags>
+ (state_._flags & ~dot_not_newline);
+ }
+
+ negate_ = false;
+ break;
+ default:
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Unknown option at index " <<
+ state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+ }
+
+ eos_ = state_.next (ch_);
+ }
+
+ // End of string handler will handle early termination
+ }
+ else if (!state_._flags_stack.empty ())
+ {
+ state_._flags_stack.push (state_._flags);
+ }
+ }
+
+ static void escape (state &state_, token_map &map_, num_token &token_)
+ {
+ CharT ch_ = 0;
+ std::size_t str_len_ = 0;
+ const CharT *str_ = tokeniser_helper::escape_sequence (state_,
+ ch_, str_len_);
+
+ if (str_)
+ {
+ state state2_ (str_ + 1, str_ + str_len_, state_._flags,
+ state_._locale);
+
+ charset (state2_, map_, token_);
+ }
+ else
+ {
+ create_charset_token (string (1, ch_), false, map_, token_);
+ }
+ }
+
+ static void charset (state &state_, token_map &map_, num_token &token_)
+ {
+ string chars_;
+ bool negated_ = false;
+
+ tokeniser_helper::charset (state_, chars_, negated_);
+ create_charset_token (chars_, negated_, map_, token_);
+ }
+
+ static void create_charset_token (const string &charset_,
+ const bool negated_, token_map &map_, num_token &token_)
+ {
+ std::size_t id_ = null_token;
+ string_token stok_ (negated_, charset_);
+
+ stok_.remove_duplicates ();
+ stok_.normalise ();
+
+ typename token_map::const_iterator iter_ = map_.find (stok_);
+
+ if (iter_ == map_.end ())
+ {
+ id_ = map_.size ();
+ map_.insert (token_pair (stok_, id_));
+ }
+ else
+ {
+ id_ = iter_->second;
+ }
+
+ token_.set (num_token::CHARSET, id_);
+ }
+
+ static void open_curly (state &state_, num_token &token_)
+ {
+ if (state_.eos ())
+ {
+ throw runtime_error ("Unexpected end of regex "
+ "(missing '}').");
+ }
+ else if (*state_._curr >= '0' && *state_._curr <= '9')
+ {
+ repeat_n (state_, token_);
+
+ if (!state_.eos () && *state_._curr == '?')
+ {
+ token_._type = num_token::AREPEATN;
+ state_.increment ();
+ }
+ }
+ else
+ {
+ macro (state_, token_);
+ }
+ }
+
+ // SYNTAX:
+ // {n[,[n]]}
+ // SEMANTIC RULES:
+ // {0} - INVALID (throw exception)
+ // {0,} = *
+ // {0,0} - INVALID (throw exception)
+ // {0,1} = ?
+ // {1,} = +
+ // {min,max} where min == max - {min}
+ // {min,max} where max < min - INVALID (throw exception)
+ static void repeat_n (state &state_, num_token &token_)
+ {
+ CharT ch_ = 0;
+ bool eos_ = state_.next (ch_);
+
+ while (!eos_ && ch_ >= '0' && ch_ <= '9')
+ {
+ token_._min *= 10;
+ token_._min += ch_ - '0';
+ eos_ = state_.next (ch_);
+ }
+
+ if (eos_)
+ {
+ throw runtime_error ("Unexpected end of regex "
+ "(missing '}').");
+ }
+
+ bool min_max_ = false;
+ bool repeatn_ = true;
+
+ token_._comma = ch_ == ',';
+
+ if (token_._comma)
+ {
+ eos_ = state_.next (ch_);
+
+ if (eos_)
+ {
+ throw runtime_error ("Unexpected end of regex "
+ "(missing '}').");
+ }
+
+ if (ch_ == '}')
+ {
+ // Small optimisation: Check for '*' equivalency.
+ if (token_._min == 0)
+ {
+ token_.set (num_token::ZEROORMORE, null_token);
+ repeatn_ = false;
+ }
+ // Small optimisation: Check for '+' equivalency.
+ else if (token_._min == 1)
+ {
+ token_.set (num_token::ONEORMORE, null_token);
+ repeatn_ = false;
+ }
+ }
+ else
+ {
+ if (ch_ < '0' || ch_ > '9')
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Missing '}' at index " <<
+ state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ min_max_ = true;
+
+ do
+ {
+ token_._max *= 10;
+ token_._max += ch_ - '0';
+ eos_ = state_.next (ch_);
+ } while (!eos_ && ch_ >= '0' && ch_ <= '9');
+
+ if (eos_)
+ {
+ throw runtime_error ("Unexpected end of regex "
+ "(missing '}').");
+ }
+
+ // Small optimisation: Check for '?' equivalency.
+ if (token_._min == 0 && token_._max == 1)
+ {
+ token_.set (num_token::OPT, null_token);
+ repeatn_ = false;
+ }
+ // Small optimisation: if min == max, then min.
+ else if (token_._min == token_._max)
+ {
+ token_._comma = false;
+ min_max_ = false;
+ token_._max = 0;
+ }
+ }
+ }
+
+ if (ch_ != '}')
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Missing '}' at index " << state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ if (repeatn_)
+ {
+ // SEMANTIC VALIDATION follows:
+ // NOTE: {0,} has already become *
+ // therefore we don't check for a comma.
+ if (token_._min == 0 && token_._max == 0)
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Cannot have exactly zero repeats preceding index " <<
+ state_.index () << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ if (min_max_ && token_._max < token_._min)
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Max less than min preceding index " <<
+ state_.index () << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ token_.set (num_token::REPEATN, null_token);
+ }
+ }
+
+ static void macro (state &state_, num_token &token_)
+ {
+ CharT ch_ = 0;
+ bool eos_ = false;
+ const CharT *start_ = state_._curr;
+
+ state_.next (ch_);
+
+ if (ch_ != '_' && !(ch_ >= 'A' && ch_ <= 'Z') &&
+ !(ch_ >= 'a' && ch_ <= 'z'))
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Invalid MACRO name at index " <<
+ state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ do
+ {
+ eos_ = state_.next (ch_);
+
+ if (eos_)
+ {
+ throw runtime_error ("Unexpected end of regex "
+ "(missing '}').");
+ }
+ } while (ch_ == '_' || ch_ == '-' || (ch_ >= 'A' && ch_ <= 'Z') ||
+ (ch_ >= 'a' && ch_ <= 'z') || (ch_ >= '0' && ch_ <= '9'));
+
+ if (ch_ != '}')
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Missing '}' at index " << state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ std::size_t len_ = state_._curr - 1 - start_;
+
+ if (len_ > max_macro_len)
+ {
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "MACRO name '";
+
+ while (len_)
+ {
+ os_ << ss_.narrow (*start_++, ' ');
+ --len_;
+ }
+
+ os_ << "' too long.";
+ throw runtime_error (os_.str ());
+ }
+
+ token_.set (num_token::MACRO, null_token);
+
+ // Some systems have memcpy in namespace std.
+ using namespace std;
+
+ memcpy (token_._macro, start_, len_ * sizeof (CharT));
+ token_._macro[len_] = 0;
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_helper.hpp b/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_helper.hpp
new file mode 100644
index 0000000000..6e0791e7f8
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_helper.hpp
@@ -0,0 +1,549 @@
+// tokeniser_helper.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_RE_TOKENISER_HELPER_H
+#define BOOST_LEXER_RE_TOKENISER_HELPER_H
+
+#include "../../char_traits.hpp"
+// strlen()
+#include <cstring>
+#include "../../size_t.hpp"
+#include "re_tokeniser_state.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename CharT, typename Traits = char_traits<CharT> >
+class basic_re_tokeniser_helper
+{
+public:
+ typedef basic_re_tokeniser_state<CharT> state;
+ typedef std::basic_string<CharT> string;
+
+ static const CharT *escape_sequence (state &state_, CharT &ch_,
+ std::size_t &str_len_)
+ {
+ bool eos_ = state_.eos ();
+
+ if (eos_)
+ {
+ throw runtime_error ("Unexpected end of regex "
+ "following '\\'.");
+ }
+
+ const CharT *str_ = charset_shortcut (*state_._curr, str_len_);
+
+ if (str_)
+ {
+ state_.increment ();
+ }
+ else
+ {
+ ch_ = chr (state_);
+ }
+
+ return str_;
+ }
+
+ // This function can call itself.
+ static void charset (state &state_, string &chars_, bool &negated_)
+ {
+ CharT ch_ = 0;
+ bool eos_ = state_.next (ch_);
+
+ if (eos_)
+ {
+ // Pointless returning index if at end of string
+ throw runtime_error ("Unexpected end of regex "
+ "following '['.");
+ }
+
+ negated_ = ch_ == '^';
+
+ if (negated_)
+ {
+ eos_ = state_.next (ch_);
+
+ if (eos_)
+ {
+ // Pointless returning index if at end of string
+ throw runtime_error ("Unexpected end of regex "
+ "following '^'.");
+ }
+ }
+
+ bool chset_ = false;
+ CharT prev_ = 0;
+
+ while (ch_ != ']')
+ {
+ if (ch_ == '\\')
+ {
+ std::size_t str_len_ = 0;
+ const CharT *str_ = escape_sequence (state_, prev_, str_len_);
+
+ chset_ = str_ != 0;
+
+ if (chset_)
+ {
+ state temp_state_ (str_ + 1, str_ + str_len_,
+ state_._flags, state_._locale);
+ string temp_chars_;
+ bool temp_negated_ = false;
+
+ charset (temp_state_, temp_chars_, temp_negated_);
+
+ if (negated_ != temp_negated_)
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Mismatch in charset negation preceding "
+ "index " << state_.index () << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ chars_ += temp_chars_;
+ }
+ }
+/*
+ else if (ch_ == '[' && !state_.eos () && *state_._curr == ':')
+ {
+ // TODO: POSIX charsets
+ }
+*/
+ else
+ {
+ chset_ = false;
+ prev_ = ch_;
+ }
+
+ eos_ = state_.next (ch_);
+
+ // Covers preceding if, else if and else
+ if (eos_)
+ {
+ // Pointless returning index if at end of string
+ throw runtime_error ("Unexpected end of regex "
+ "(missing ']').");
+ }
+
+ if (ch_ == '-')
+ {
+ charset_range (chset_, state_, eos_, ch_, prev_, chars_);
+ }
+ else if (!chset_)
+ {
+ if ((state_._flags & icase) &&
+ (std::isupper (prev_, state_._locale) ||
+ std::islower (prev_, state_._locale)))
+ {
+ CharT upper_ = std::toupper (prev_, state_._locale);
+ CharT lower_ = std::tolower (prev_, state_._locale);
+
+ chars_ += upper_;
+ chars_ += lower_;
+ }
+ else
+ {
+ chars_ += prev_;
+ }
+ }
+ }
+
+ if (!negated_ && chars_.empty ())
+ {
+ throw runtime_error ("Empty charsets not allowed.");
+ }
+ }
+
+ static CharT chr (state &state_)
+ {
+ CharT ch_ = 0;
+
+ // eos_ has already been checked for.
+ switch (*state_._curr)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ ch_ = decode_octal (state_);
+ break;
+ case 'a':
+ ch_ = '\a';
+ state_.increment ();
+ break;
+ case 'b':
+ ch_ = '\b';
+ state_.increment ();
+ break;
+ case 'c':
+ ch_ = decode_control_char (state_);
+ break;
+ case 'e':
+ ch_ = 27; // '\e' not recognised by compiler
+ state_.increment ();
+ break;
+ case 'f':
+ ch_ = '\f';
+ state_.increment ();
+ break;
+ case 'n':
+ ch_ = '\n';
+ state_.increment ();
+ break;
+ case 'r':
+ ch_ = '\r';
+ state_.increment ();
+ break;
+ case 't':
+ ch_ = '\t';
+ state_.increment ();
+ break;
+ case 'v':
+ ch_ = '\v';
+ state_.increment ();
+ break;
+ case 'x':
+ ch_ = decode_hex (state_);
+ break;
+ default:
+ ch_ = *state_._curr;
+ state_.increment ();
+ break;
+ }
+
+ return ch_;
+ }
+
+private:
+ static const char *charset_shortcut (const char ch_,
+ std::size_t &str_len_)
+ {
+ const char *str_ = 0;
+
+ switch (ch_)
+ {
+ case 'd':
+ str_ = "[0-9]";
+ break;
+ case 'D':
+ str_ = "[^0-9]";
+ break;
+ case 's':
+ str_ = "[ \t\n\r\f\v]";
+ break;
+ case 'S':
+ str_ = "[^ \t\n\r\f\v]";
+ break;
+ case 'w':
+ str_ = "[_0-9A-Za-z]";
+ break;
+ case 'W':
+ str_ = "[^_0-9A-Za-z]";
+ break;
+ }
+
+ if (str_)
+ {
+ // Some systems have strlen in namespace std.
+ using namespace std;
+
+ str_len_ = strlen (str_);
+ }
+ else
+ {
+ str_len_ = 0;
+ }
+
+ return str_;
+ }
+
+ static const wchar_t *charset_shortcut (const wchar_t ch_,
+ std::size_t &str_len_)
+ {
+ const wchar_t *str_ = 0;
+
+ switch (ch_)
+ {
+ case 'd':
+ str_ = L"[0-9]";
+ break;
+ case 'D':
+ str_ = L"[^0-9]";
+ break;
+ case 's':
+ str_ = L"[ \t\n\r\f\v]";
+ break;
+ case 'S':
+ str_ = L"[^ \t\n\r\f\v]";
+ break;
+ case 'w':
+ str_ = L"[_0-9A-Za-z]";
+ break;
+ case 'W':
+ str_ = L"[^_0-9A-Za-z]";
+ break;
+ }
+
+ if (str_)
+ {
+ // Some systems have wcslen in namespace std.
+ using namespace std;
+
+ str_len_ = wcslen (str_);
+ }
+ else
+ {
+ str_len_ = 0;
+ }
+
+ return str_;
+ }
+
+ static CharT decode_octal (state &state_)
+ {
+ std::size_t accumulator_ = 0;
+ CharT ch_ = *state_._curr;
+ unsigned short count_ = 3;
+ bool eos_ = false;
+
+ for (;;)
+ {
+ accumulator_ *= 8;
+ accumulator_ += ch_ - '0';
+ --count_;
+ state_.increment ();
+ eos_ = state_.eos ();
+
+ if (!count_ || eos_) break;
+
+ ch_ = *state_._curr;
+
+ // Don't consume invalid chars!
+ if (ch_ < '0' || ch_ > '7')
+ {
+ break;
+ }
+ }
+
+ return static_cast<CharT> (accumulator_);
+ }
+
+ static CharT decode_control_char (state &state_)
+ {
+ // Skip over 'c'
+ state_.increment ();
+
+ CharT ch_ = 0;
+ bool eos_ = state_.next (ch_);
+
+ if (eos_)
+ {
+ // Pointless returning index if at end of string
+ throw runtime_error ("Unexpected end of regex following \\c.");
+ }
+ else
+ {
+ if (ch_ >= 'a' && ch_ <= 'z')
+ {
+ ch_ -= 'a' - 1;
+ }
+ else if (ch_ >= 'A' && ch_ <= 'Z')
+ {
+ ch_ -= 'A' - 1;
+ }
+ else if (ch_ == '@')
+ {
+ // Apparently...
+ ch_ = 0;
+ }
+ else
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Invalid control char at index " <<
+ state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+ }
+
+ return ch_;
+ }
+
+ static CharT decode_hex (state &state_)
+ {
+ // Skip over 'x'
+ state_.increment ();
+
+ CharT ch_ = 0;
+ bool eos_ = state_.next (ch_);
+
+ if (eos_)
+ {
+ // Pointless returning index if at end of string
+ throw runtime_error ("Unexpected end of regex following \\x.");
+ }
+
+ if (!((ch_ >= '0' && ch_ <= '9') || (ch_ >= 'a' && ch_ <= 'f') ||
+ (ch_ >= 'A' && ch_ <= 'F')))
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Illegal char following \\x at index " <<
+ state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ std::size_t hex_ = 0;
+
+ do
+ {
+ hex_ *= 16;
+
+ if (ch_ >= '0' && ch_ <= '9')
+ {
+ hex_ += ch_ - '0';
+ }
+ else if (ch_ >= 'a' && ch_ <= 'f')
+ {
+ hex_ += 10 + (ch_ - 'a');
+ }
+ else
+ {
+ hex_ += 10 + (ch_ - 'A');
+ }
+
+ eos_ = state_.eos ();
+
+ if (!eos_)
+ {
+ ch_ = *state_._curr;
+
+ // Don't consume invalid chars!
+ if (((ch_ >= '0' && ch_ <= '9') ||
+ (ch_ >= 'a' && ch_ <= 'f') || (ch_ >= 'A' && ch_ <= 'F')))
+ {
+ state_.increment ();
+ }
+ else
+ {
+ eos_ = true;
+ }
+ }
+ } while (!eos_);
+
+ return static_cast<CharT> (hex_);
+ }
+
+ static void charset_range (const bool chset_, state &state_, bool &eos_,
+ CharT &ch_, const CharT prev_, string &chars_)
+ {
+ if (chset_)
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Charset cannot form start of range preceding "
+ "index " << state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ eos_ = state_.next (ch_);
+
+ if (eos_)
+ {
+ // Pointless returning index if at end of string
+ throw runtime_error ("Unexpected end of regex "
+ "following '-'.");
+ }
+
+ CharT curr_ = 0;
+
+ if (ch_ == '\\')
+ {
+ std::size_t str_len_ = 0;
+
+ if (escape_sequence (state_, curr_, str_len_))
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Charset cannot form end of range preceding index "
+ << state_.index () << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+ }
+/*
+ else if (ch_ == '[' && !state_.eos () && *state_._curr == ':')
+ {
+ std::ostringstream ss_;
+
+ ss_ << "POSIX char class cannot form end of range at "
+ "index " << state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+*/
+ else
+ {
+ curr_ = ch_;
+ }
+
+ eos_ = state_.next (ch_);
+
+ // Covers preceding if and else
+ if (eos_)
+ {
+ // Pointless returning index if at end of string
+ throw runtime_error ("Unexpected end of regex "
+ "(missing ']').");
+ }
+
+ std::size_t start_ = static_cast<typename Traits::index_type> (prev_);
+ std::size_t end_ = static_cast<typename Traits::index_type> (curr_);
+
+ // Semanic check
+ if (end_ < start_)
+ {
+ std::ostringstream ss_;
+
+ ss_ << "Invalid range in charset preceding index " <<
+ state_.index () - 1 << '.';
+ throw runtime_error (ss_.str ().c_str ());
+ }
+
+ chars_.reserve (chars_.size () + (end_ + 1 - start_));
+
+ for (; start_ <= end_; ++start_)
+ {
+ CharT ch_ = static_cast<CharT> (start_);
+
+ if ((state_._flags & icase) &&
+ (std::isupper (ch_, state_._locale) ||
+ std::islower (ch_, state_._locale)))
+ {
+ CharT upper_ = std::toupper (ch_, state_._locale);
+ CharT lower_ = std::tolower (ch_, state_._locale);
+
+ chars_ += (upper_);
+ chars_ += (lower_);
+ }
+ else
+ {
+ chars_ += (ch_);
+ }
+ }
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_state.hpp b/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_state.hpp
new file mode 100644
index 0000000000..35995adbb3
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_state.hpp
@@ -0,0 +1,98 @@
+// tokeniser_state.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_RE_TOKENISER_STATE_HPP
+#define BOOST_LEXER_RE_TOKENISER_STATE_HPP
+
+#include "../../consts.hpp"
+#include <locale>
+#include "../../size_t.hpp"
+#include <stack>
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename CharT>
+struct basic_re_tokeniser_state
+{
+ const CharT * const _start;
+ const CharT * const _end;
+ const CharT *_curr;
+ regex_flags _flags;
+ std::stack<regex_flags> _flags_stack;
+ std::locale _locale;
+ long _paren_count;
+ bool _in_string;
+ bool _seen_BOL_assertion;
+ bool _seen_EOL_assertion;
+
+ basic_re_tokeniser_state (const CharT *start_, const CharT * const end_,
+ const regex_flags flags_, const std::locale locale_) :
+ _start (start_),
+ _end (end_),
+ _curr (start_),
+ _flags (flags_),
+ _locale (locale_),
+ _paren_count (0),
+ _in_string (false),
+ _seen_BOL_assertion (false),
+ _seen_EOL_assertion (false)
+ {
+ }
+
+ // prevent VC++ 7.1 warning:
+ const basic_re_tokeniser_state &operator =
+ (const basic_re_tokeniser_state &rhs_)
+ {
+ _start = rhs_._start;
+ _end = rhs_._end;
+ _curr = rhs_._curr;
+ _flags = rhs_._flags;
+ _locale = rhs_._locale;
+ _paren_count = rhs_._paren_count;
+ _in_string = rhs_._in_string;
+ _seen_BOL_assertion = rhs_._seen_BOL_assertion;
+ _seen_EOL_assertion = rhs_._seen_EOL_assertion;
+ return this;
+ }
+
+ inline bool next (CharT &ch_)
+ {
+ if (_curr >= _end)
+ {
+ ch_ = 0;
+ return true;
+ }
+ else
+ {
+ ch_ = *_curr;
+ increment ();
+ return false;
+ }
+ }
+
+ inline void increment ()
+ {
+ ++_curr;
+ }
+
+ inline std::size_t index ()
+ {
+ return _curr - _start;
+ }
+
+ inline bool eos ()
+ {
+ return _curr >= _end;
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tree/end_node.hpp b/boost/spirit/home/support/detail/lexer/parser/tree/end_node.hpp
new file mode 100644
index 0000000000..c613e6a4e9
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tree/end_node.hpp
@@ -0,0 +1,90 @@
+// end_node.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_END_NODE_HPP
+#define BOOST_LEXER_END_NODE_HPP
+
+#include "node.hpp"
+#include "../../size_t.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+class end_node : public node
+{
+public:
+ end_node (const std::size_t id_, const std::size_t unique_id_,
+ const std::size_t lexer_state_) :
+ node (false),
+ _id (id_),
+ _unique_id (unique_id_),
+ _lexer_state (lexer_state_)
+ {
+ node::_firstpos.push_back (this);
+ node::_lastpos.push_back (this);
+ }
+
+ virtual ~end_node ()
+ {
+ }
+
+ virtual type what_type () const
+ {
+ return END;
+ }
+
+ virtual bool traverse (const_node_stack &/*node_stack_*/,
+ bool_stack &/*perform_op_stack_*/) const
+ {
+ return false;
+ }
+
+ virtual const node_vector &followpos () const
+ {
+ // _followpos is always empty..!
+ return _followpos;
+ }
+
+ virtual bool end_state () const
+ {
+ return true;
+ }
+
+ virtual std::size_t id () const
+ {
+ return _id;
+ }
+
+ virtual std::size_t unique_id () const
+ {
+ return _unique_id;
+ }
+
+ virtual std::size_t lexer_state () const
+ {
+ return _lexer_state;
+ }
+
+private:
+ std::size_t _id;
+ std::size_t _unique_id;
+ std::size_t _lexer_state;
+ node_vector _followpos;
+
+ virtual void copy_node (node_ptr_vector &/*node_ptr_vector_*/,
+ node_stack &/*new_node_stack_*/, bool_stack &/*perform_op_stack_*/,
+ bool &/*down_*/) const
+ {
+ // Nothing to do, as end_nodes are not copied.
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tree/iteration_node.hpp b/boost/spirit/home/support/detail/lexer/parser/tree/iteration_node.hpp
new file mode 100644
index 0000000000..6b394622e7
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tree/iteration_node.hpp
@@ -0,0 +1,90 @@
+// iteration_node.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_ITERATION_NODE_HPP
+#define BOOST_LEXER_ITERATION_NODE_HPP
+
+#include "node.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+class iteration_node : public node
+{
+public:
+ iteration_node (node *next_, const bool greedy_) :
+ node (true),
+ _next (next_),
+ _greedy (greedy_)
+ {
+ node_vector::iterator iter_;
+ node_vector::iterator end_;
+
+ _next->append_firstpos (_firstpos);
+ _next->append_lastpos (_lastpos);
+
+ for (iter_ = _lastpos.begin (), end_ = _lastpos.end ();
+ iter_ != end_; ++iter_)
+ {
+ (*iter_)->append_followpos (_firstpos);
+ }
+
+ for (iter_ = _firstpos.begin (), end_ = _firstpos.end ();
+ iter_ != end_; ++iter_)
+ {
+ (*iter_)->greedy (greedy_);
+ }
+ }
+
+ virtual ~iteration_node ()
+ {
+ }
+
+ virtual type what_type () const
+ {
+ return ITERATION;
+ }
+
+ virtual bool traverse (const_node_stack &node_stack_,
+ bool_stack &perform_op_stack_) const
+ {
+ perform_op_stack_.push (true);
+ node_stack_.push (_next);
+ return true;
+ }
+
+private:
+ // Not owner of this pointer...
+ node *_next;
+ bool _greedy;
+
+ virtual void copy_node (node_ptr_vector &node_ptr_vector_,
+ node_stack &new_node_stack_, bool_stack &perform_op_stack_,
+ bool &down_) const
+ {
+ if (perform_op_stack_.top ())
+ {
+ node *ptr_ = new_node_stack_.top ();
+
+ node_ptr_vector_->push_back (static_cast<iteration_node *>(0));
+ node_ptr_vector_->back () = new iteration_node (ptr_, _greedy);
+ new_node_stack_.top () = node_ptr_vector_->back ();
+ }
+ else
+ {
+ down_ = true;
+ }
+
+ perform_op_stack_.pop ();
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tree/leaf_node.hpp b/boost/spirit/home/support/detail/lexer/parser/tree/leaf_node.hpp
new file mode 100644
index 0000000000..39ed98d27a
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tree/leaf_node.hpp
@@ -0,0 +1,107 @@
+// leaf_node.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_LEAF_NODE_HPP
+#define BOOST_LEXER_LEAF_NODE_HPP
+
+#include "../../consts.hpp" // null_token
+#include "node.hpp"
+#include "../../size_t.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+class leaf_node : public node
+{
+public:
+ leaf_node (const std::size_t token_, const bool greedy_) :
+ node (token_ == null_token),
+ _token (token_),
+ _set_greedy (!greedy_),
+ _greedy (greedy_)
+ {
+ if (!_nullable)
+ {
+ _firstpos.push_back (this);
+ _lastpos.push_back (this);
+ }
+ }
+
+ virtual ~leaf_node ()
+ {
+ }
+
+ virtual void append_followpos (const node_vector &followpos_)
+ {
+ for (node_vector::const_iterator iter_ = followpos_.begin (),
+ end_ = followpos_.end (); iter_ != end_; ++iter_)
+ {
+ _followpos.push_back (*iter_);
+ }
+ }
+
+ virtual type what_type () const
+ {
+ return LEAF;
+ }
+
+ virtual bool traverse (const_node_stack &/*node_stack_*/,
+ bool_stack &/*perform_op_stack_*/) const
+ {
+ return false;
+ }
+
+ virtual std::size_t token () const
+ {
+ return _token;
+ }
+
+ virtual void greedy (const bool greedy_)
+ {
+ if (!_set_greedy)
+ {
+ _greedy = greedy_;
+ _set_greedy = true;
+ }
+ }
+
+ virtual bool greedy () const
+ {
+ return _greedy;
+ }
+
+ virtual const node_vector &followpos () const
+ {
+ return _followpos;
+ }
+
+ virtual node_vector &followpos ()
+ {
+ return _followpos;
+ }
+
+private:
+ std::size_t _token;
+ bool _set_greedy;
+ bool _greedy;
+ node_vector _followpos;
+
+ virtual void copy_node (node_ptr_vector &node_ptr_vector_,
+ node_stack &new_node_stack_, bool_stack &/*perform_op_stack_*/,
+ bool &/*down_*/) const
+ {
+ node_ptr_vector_->push_back (static_cast<leaf_node *>(0));
+ node_ptr_vector_->back () = new leaf_node (_token, _greedy);
+ new_node_stack_.push (node_ptr_vector_->back ());
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tree/node.hpp b/boost/spirit/home/support/detail/lexer/parser/tree/node.hpp
new file mode 100644
index 0000000000..1e36ccb6e3
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tree/node.hpp
@@ -0,0 +1,188 @@
+// node.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_NODE_HPP
+#define BOOST_LEXER_NODE_HPP
+
+#include <boost/assert.hpp>
+#include "../../containers/ptr_vector.hpp"
+#include "../../runtime_error.hpp"
+#include "../../size_t.hpp"
+#include <stack>
+#include <vector>
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+class node
+{
+public:
+ enum type {LEAF, SEQUENCE, SELECTION, ITERATION, END};
+
+ typedef std::stack<bool> bool_stack;
+ typedef std::stack<node *> node_stack;
+ // stack and vector not owner of node pointers
+ typedef std::stack<const node *> const_node_stack;
+ typedef std::vector<node *> node_vector;
+ typedef ptr_vector<node> node_ptr_vector;
+
+ node () :
+ _nullable (false)
+ {
+ }
+
+ node (const bool nullable_) :
+ _nullable (nullable_)
+ {
+ }
+
+ virtual ~node ()
+ {
+ }
+
+ bool nullable () const
+ {
+ return _nullable;
+ }
+
+ void append_firstpos (node_vector &firstpos_) const
+ {
+ firstpos_.insert (firstpos_.end (),
+ _firstpos.begin (), _firstpos.end ());
+ }
+
+ void append_lastpos (node_vector &lastpos_) const
+ {
+ lastpos_.insert (lastpos_.end (),
+ _lastpos.begin (), _lastpos.end ());
+ }
+
+ virtual void append_followpos (const node_vector &/*followpos_*/)
+ {
+ throw runtime_error ("Internal error node::append_followpos()");
+ }
+
+ node *copy (node_ptr_vector &node_ptr_vector_) const
+ {
+ node *new_root_ = 0;
+ const_node_stack node_stack_;
+ bool_stack perform_op_stack_;
+ bool down_ = true;
+ node_stack new_node_stack_;
+
+ node_stack_.push (this);
+
+ while (!node_stack_.empty ())
+ {
+ while (down_)
+ {
+ down_ = node_stack_.top ()->traverse (node_stack_,
+ perform_op_stack_);
+ }
+
+ while (!down_ && !node_stack_.empty ())
+ {
+ const node *top_ = node_stack_.top ();
+
+ top_->copy_node (node_ptr_vector_, new_node_stack_,
+ perform_op_stack_, down_);
+
+ if (!down_) node_stack_.pop ();
+ }
+ }
+
+ BOOST_ASSERT(new_node_stack_.size () == 1);
+ new_root_ = new_node_stack_.top ();
+ new_node_stack_.pop ();
+ return new_root_;
+ }
+
+ virtual type what_type () const = 0;
+
+ virtual bool traverse (const_node_stack &node_stack_,
+ bool_stack &perform_op_stack_) const = 0;
+
+ node_vector &firstpos ()
+ {
+ return _firstpos;
+ }
+
+ const node_vector &firstpos () const
+ {
+ return _firstpos;
+ }
+
+ // _lastpos modified externally, so not const &
+ node_vector &lastpos ()
+ {
+ return _lastpos;
+ }
+
+ virtual bool end_state () const
+ {
+ return false;
+ }
+
+ virtual std::size_t id () const
+ {
+ throw runtime_error ("Internal error node::id()");
+ }
+
+ virtual std::size_t unique_id () const
+ {
+ throw runtime_error ("Internal error node::unique_id()");
+ }
+
+ virtual std::size_t lexer_state () const
+ {
+ throw runtime_error ("Internal error node::state()");
+ }
+
+ virtual std::size_t token () const
+ {
+ throw runtime_error ("Internal error node::token()");
+ }
+
+ virtual void greedy (const bool /*greedy_*/)
+ {
+ throw runtime_error ("Internal error node::token(bool)");
+ }
+
+ virtual bool greedy () const
+ {
+ throw runtime_error ("Internal error node::token()");
+ }
+
+ virtual const node_vector &followpos () const
+ {
+ throw runtime_error ("Internal error node::followpos()");
+ }
+
+ virtual node_vector &followpos ()
+ {
+ throw runtime_error ("Internal error node::followpos()");
+ }
+
+protected:
+ const bool _nullable;
+ node_vector _firstpos;
+ node_vector _lastpos;
+
+ virtual void copy_node (node_ptr_vector &node_ptr_vector_,
+ node_stack &new_node_stack_, bool_stack &perform_op_stack_,
+ bool &down_) const = 0;
+
+private:
+ node (node const &); // No copy construction.
+ node &operator = (node const &); // No assignment.
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tree/selection_node.hpp b/boost/spirit/home/support/detail/lexer/parser/tree/selection_node.hpp
new file mode 100644
index 0000000000..67e5ea0140
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tree/selection_node.hpp
@@ -0,0 +1,94 @@
+// selection_node.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_SELECTION_NODE_HPP
+#define BOOST_LEXER_SELECTION_NODE_HPP
+
+#include "node.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+class selection_node : public node
+{
+public:
+ selection_node (node *left_, node *right_) :
+ node (left_->nullable () || right_->nullable ()),
+ _left (left_),
+ _right (right_)
+ {
+ _left->append_firstpos (_firstpos);
+ _right->append_firstpos (_firstpos);
+ _left->append_lastpos (_lastpos);
+ _right->append_lastpos (_lastpos);
+ }
+
+ virtual ~selection_node ()
+ {
+ }
+
+ virtual type what_type () const
+ {
+ return SELECTION;
+ }
+
+ virtual bool traverse (const_node_stack &node_stack_,
+ bool_stack &perform_op_stack_) const
+ {
+ perform_op_stack_.push (true);
+
+ switch (_right->what_type ())
+ {
+ case SEQUENCE:
+ case SELECTION:
+ case ITERATION:
+ perform_op_stack_.push (false);
+ break;
+ default:
+ break;
+ }
+
+ node_stack_.push (_right);
+ node_stack_.push (_left);
+ return true;
+ }
+
+private:
+ // Not owner of these pointers...
+ node *_left;
+ node *_right;
+
+ virtual void copy_node (node_ptr_vector &node_ptr_vector_,
+ node_stack &new_node_stack_, bool_stack &perform_op_stack_,
+ bool &down_) const
+ {
+ if (perform_op_stack_.top ())
+ {
+ node *rhs_ = new_node_stack_.top ();
+
+ new_node_stack_.pop ();
+
+ node *lhs_ = new_node_stack_.top ();
+
+ node_ptr_vector_->push_back (static_cast<selection_node *>(0));
+ node_ptr_vector_->back () = new selection_node (lhs_, rhs_);
+ new_node_stack_.top () = node_ptr_vector_->back ();
+ }
+ else
+ {
+ down_ = true;
+ }
+
+ perform_op_stack_.pop ();
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/parser/tree/sequence_node.hpp b/boost/spirit/home/support/detail/lexer/parser/tree/sequence_node.hpp
new file mode 100644
index 0000000000..471fa68d7e
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/parser/tree/sequence_node.hpp
@@ -0,0 +1,112 @@
+// sequence_node.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_SEQUENCE_NODE_HPP
+#define BOOST_LEXER_SEQUENCE_NODE_HPP
+
+#include "node.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+class sequence_node : public node
+{
+public:
+ sequence_node (node *left_, node *right_) :
+ node (left_->nullable () && right_->nullable ()),
+ _left (left_),
+ _right (right_)
+ {
+ _left->append_firstpos (_firstpos);
+
+ if (_left->nullable ())
+ {
+ _right->append_firstpos (_firstpos);
+ }
+
+ if (_right->nullable ())
+ {
+ _left->append_lastpos (_lastpos);
+ }
+
+ _right->append_lastpos (_lastpos);
+
+ node_vector &lastpos_ = _left->lastpos ();
+ const node_vector &firstpos_ = _right->firstpos ();
+
+ for (node_vector::iterator iter_ = lastpos_.begin (),
+ end_ = lastpos_.end (); iter_ != end_; ++iter_)
+ {
+ (*iter_)->append_followpos (firstpos_);
+ }
+ }
+
+ virtual ~sequence_node ()
+ {
+ }
+
+ virtual type what_type () const
+ {
+ return SEQUENCE;
+ }
+
+ virtual bool traverse (const_node_stack &node_stack_,
+ bool_stack &perform_op_stack_) const
+ {
+ perform_op_stack_.push (true);
+
+ switch (_right->what_type ())
+ {
+ case SEQUENCE:
+ case SELECTION:
+ case ITERATION:
+ perform_op_stack_.push (false);
+ break;
+ default:
+ break;
+ }
+
+ node_stack_.push (_right);
+ node_stack_.push (_left);
+ return true;
+ }
+
+private:
+ // Not owner of these pointers...
+ node *_left;
+ node *_right;
+
+ virtual void copy_node (node_ptr_vector &node_ptr_vector_,
+ node_stack &new_node_stack_, bool_stack &perform_op_stack_,
+ bool &down_) const
+ {
+ if (perform_op_stack_.top ())
+ {
+ node *rhs_ = new_node_stack_.top ();
+
+ new_node_stack_.pop ();
+
+ node *lhs_ = new_node_stack_.top ();
+
+ node_ptr_vector_->push_back (static_cast<sequence_node *>(0));
+ node_ptr_vector_->back () = new sequence_node (lhs_, rhs_);
+ new_node_stack_.top () = node_ptr_vector_->back ();
+ }
+ else
+ {
+ down_ = true;
+ }
+
+ perform_op_stack_.pop ();
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/partition/charset.hpp b/boost/spirit/home/support/detail/lexer/partition/charset.hpp
new file mode 100644
index 0000000000..c74dd365c9
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/partition/charset.hpp
@@ -0,0 +1,81 @@
+// charset.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_CHARSET_HPP
+#define BOOST_LEXER_CHARSET_HPP
+
+#include <set>
+#include "../size_t.hpp"
+#include "../string_token.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+template<typename CharT>
+struct basic_charset
+{
+ typedef basic_string_token<CharT> token;
+ typedef std::set<std::size_t> index_set;
+
+ token _token;
+ index_set _index_set;
+
+ basic_charset ()
+ {
+ }
+
+ basic_charset (const token &token_, const std::size_t index_) :
+ _token (token_)
+ {
+ _index_set.insert (index_);
+ }
+
+ bool empty () const
+ {
+ return _token.empty () && _index_set.empty ();
+ }
+
+ void intersect (basic_charset &rhs_, basic_charset &overlap_)
+ {
+ _token.intersect (rhs_._token, overlap_._token);
+
+ if (!overlap_._token.empty ())
+ {
+ typename index_set::const_iterator iter_ = _index_set.begin ();
+ typename index_set::const_iterator end_ = _index_set.end ();
+
+ for (; iter_ != end_; ++iter_)
+ {
+ overlap_._index_set.insert (*iter_);
+ }
+
+ iter_ = rhs_._index_set.begin ();
+ end_ = rhs_._index_set.end ();
+
+ for (; iter_ != end_; ++iter_)
+ {
+ overlap_._index_set.insert (*iter_);
+ }
+
+ if (_token.empty ())
+ {
+ _index_set.clear ();
+ }
+
+ if (rhs_._token.empty ())
+ {
+ rhs_._index_set.clear ();
+ }
+ }
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/partition/equivset.hpp b/boost/spirit/home/support/detail/lexer/partition/equivset.hpp
new file mode 100644
index 0000000000..b39fb15051
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/partition/equivset.hpp
@@ -0,0 +1,140 @@
+// equivset.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_EQUIVSET_HPP
+#define BOOST_LEXER_EQUIVSET_HPP
+
+#include <algorithm>
+#include "../parser/tree/node.hpp"
+#include <set>
+#include "../size_t.hpp"
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+struct equivset
+{
+ typedef std::set<std::size_t> index_set;
+ typedef std::vector<std::size_t> index_vector;
+ // Not owner of nodes:
+ typedef std::vector<node *> node_vector;
+
+ index_vector _index_vector;
+ bool _greedy;
+ std::size_t _id;
+ node_vector _followpos;
+
+ equivset () :
+ _greedy (true),
+ _id (0)
+ {
+ }
+
+ equivset (const index_set &index_set_, const bool greedy_,
+ const std::size_t id_, const node_vector &followpos_) :
+ _greedy (greedy_),
+ _id (id_),
+ _followpos (followpos_)
+ {
+ index_set::const_iterator iter_ = index_set_.begin ();
+ index_set::const_iterator end_ = index_set_.end ();
+
+ for (; iter_ != end_; ++iter_)
+ {
+ _index_vector.push_back (*iter_);
+ }
+ }
+
+ bool empty () const
+ {
+ return _index_vector.empty () && _followpos.empty ();
+ }
+
+ void intersect (equivset &rhs_, equivset &overlap_)
+ {
+ intersect_indexes (rhs_._index_vector, overlap_._index_vector);
+
+ if (!overlap_._index_vector.empty ())
+ {
+ // Note that the LHS takes priority in order to
+ // respect rule ordering priority in the lex spec.
+ overlap_._id = _id;
+ overlap_._greedy = _greedy;
+ overlap_._followpos = _followpos;
+
+ node_vector::const_iterator overlap_begin_ =
+ overlap_._followpos.begin ();
+ node_vector::const_iterator overlap_end_ =
+ overlap_._followpos.end ();
+ node_vector::const_iterator rhs_iter_ =
+ rhs_._followpos.begin ();
+ node_vector::const_iterator rhs_end_ =
+ rhs_._followpos.end ();
+
+ for (; rhs_iter_ != rhs_end_; ++rhs_iter_)
+ {
+ node *node_ = *rhs_iter_;
+
+ if (std::find (overlap_begin_, overlap_end_, node_) ==
+ overlap_end_)
+ {
+ overlap_._followpos.push_back (node_);
+ overlap_begin_ = overlap_._followpos.begin ();
+ overlap_end_ = overlap_._followpos.end ();
+ }
+ }
+
+ if (_index_vector.empty ())
+ {
+ _followpos.clear ();
+ }
+
+ if (rhs_._index_vector.empty ())
+ {
+ rhs_._followpos.clear ();
+ }
+ }
+ }
+
+private:
+ void intersect_indexes (index_vector &rhs_, index_vector &overlap_)
+ {
+ index_vector::iterator iter_ = _index_vector.begin ();
+ index_vector::iterator end_ = _index_vector.end ();
+ index_vector::iterator rhs_iter_ = rhs_.begin ();
+ index_vector::iterator rhs_end_ = rhs_.end ();
+
+ while (iter_ != end_ && rhs_iter_ != rhs_end_)
+ {
+ const std::size_t index_ = *iter_;
+ const std::size_t rhs_index_ = *rhs_iter_;
+
+ if (index_ < rhs_index_)
+ {
+ ++iter_;
+ }
+ else if (index_ > rhs_index_)
+ {
+ ++rhs_iter_;
+ }
+ else
+ {
+ overlap_.push_back (index_);
+ iter_ = _index_vector.erase (iter_);
+ end_ = _index_vector.end ();
+ rhs_iter_ = rhs_.erase (rhs_iter_);
+ rhs_end_ = rhs_.end ();
+ }
+ }
+ }
+};
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/rules.hpp b/boost/spirit/home/support/detail/lexer/rules.hpp
new file mode 100644
index 0000000000..83cc9a47db
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/rules.hpp
@@ -0,0 +1,806 @@
+// rules.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_RULES_HPP
+#define BOOST_LEXER_RULES_HPP
+
+#include "consts.hpp"
+#include <deque>
+#include <locale>
+#include <map>
+#include "runtime_error.hpp"
+#include <set>
+#include "size_t.hpp"
+#include <sstream>
+#include <string>
+#include <vector>
+
+namespace boost
+{
+namespace lexer
+{
+namespace detail
+{
+ // return name of initial state
+ template <typename CharT>
+ struct strings;
+
+ template <>
+ struct strings<char>
+ {
+ static const char *initial ()
+ {
+ return "INITIAL";
+ }
+
+ static const char *dot ()
+ {
+ return ".";
+ }
+
+ static const char *all_states ()
+ {
+ return "*";
+ }
+
+ static const char *char_name ()
+ {
+ return "char";
+ }
+
+ static const char *char_prefix ()
+ {
+ return "";
+ }
+ };
+
+ template <>
+ struct strings<wchar_t>
+ {
+ static const wchar_t *initial ()
+ {
+ return L"INITIAL";
+ }
+
+ static const wchar_t *dot ()
+ {
+ return L".";
+ }
+
+ static const wchar_t *all_states ()
+ {
+ return L"*";
+ }
+
+ static const char *char_name ()
+ {
+ return "wchar_t";
+ }
+
+ static const char *char_prefix ()
+ {
+ return "L";
+ }
+ };
+}
+
+template<typename CharT>
+class basic_rules
+{
+public:
+ typedef std::vector<std::size_t> id_vector;
+ typedef std::deque<id_vector> id_vector_deque;
+ typedef std::basic_string<CharT> string;
+ typedef std::deque<string> string_deque;
+ typedef std::deque<string_deque> string_deque_deque;
+ typedef std::set<string> string_set;
+ typedef std::pair<string, string> string_pair;
+ typedef std::deque<string_pair> string_pair_deque;
+ typedef std::map<string, std::size_t> string_size_t_map;
+ typedef std::pair<string, std::size_t> string_size_t_pair;
+
+ basic_rules (const regex_flags flags_ = dot_not_newline,
+ std::size_t (*counter_ptr_) () = 0) :
+ _flags (flags_),
+ _counter (0),
+ _counter_ptr (counter_ptr_)
+ {
+ add_state (initial ());
+ }
+
+ void clear ()
+ {
+ _statemap.clear ();
+ _macrodeque.clear ();
+ _macroset.clear ();
+ _regexes.clear ();
+ _ids.clear ();
+ _unique_ids.clear ();
+ _states.clear ();
+ _flags = dot_not_newline;
+ _locale = std::locale ();
+ add_state (initial ());
+ }
+
+ void clear (const CharT *state_name_)
+ {
+ std::size_t state_ = state (state_name_);
+
+ if (state_ != npos)
+ {
+ _regexes[state_].clear ();
+ _ids[state_].clear ();
+ _unique_ids[state_].clear ();
+ _states[state_].clear ();
+ }
+ }
+
+ void flags (const regex_flags flags_)
+ {
+ _flags = flags_;
+ }
+
+ regex_flags flags () const
+ {
+ return _flags;
+ }
+
+ std::size_t next_unique_id ()
+ {
+ return _counter_ptr ? _counter_ptr () : _counter++;
+ }
+
+ std::locale imbue (std::locale &locale_)
+ {
+ std::locale loc_ = _locale;
+
+ _locale = locale_;
+ return loc_;
+ }
+
+ const std::locale &locale () const
+ {
+ return _locale;
+ }
+
+ std::size_t state (const CharT *name_) const
+ {
+ std::size_t state_ = npos;
+ typename string_size_t_map::const_iterator iter_ =
+ _statemap.find (name_);
+
+ if (iter_ != _statemap.end ())
+ {
+ state_ = iter_->second;
+ }
+
+ return state_;
+ }
+
+ const CharT *state (const std::size_t index_) const
+ {
+ if (index_ == 0)
+ {
+ return initial ();
+ }
+ else
+ {
+ const std::size_t vec_index_ = index_ - 1;
+
+ if (vec_index_ > _lexer_state_names.size () - 1)
+ {
+ return 0;
+ }
+ else
+ {
+ return _lexer_state_names[vec_index_].c_str ();
+ }
+ }
+ }
+
+ std::size_t add_state (const CharT *name_)
+ {
+ validate (name_);
+
+ if (_statemap.insert (string_size_t_pair (name_,
+ _statemap.size ())).second)
+ {
+ _regexes.push_back (string_deque ());
+ _ids.push_back (id_vector ());
+ _unique_ids.push_back (id_vector ());
+ _states.push_back (id_vector ());
+
+ if (string (name_) != initial ())
+ {
+ _lexer_state_names.push_back (name_);
+ }
+ }
+
+ // Initial is not stored, so no need to - 1.
+ return _lexer_state_names.size ();
+ }
+
+ void add_macro (const CharT *name_, const CharT *regex_)
+ {
+ add_macro (name_, string (regex_));
+ }
+
+ void add_macro (const CharT *name_, const CharT *regex_start_,
+ const CharT *regex_end_)
+ {
+ add_macro (name_, string (regex_start_, regex_end_));
+ }
+
+ void add_macro (const CharT *name_, const string &regex_)
+ {
+ validate (name_);
+
+ typename string_set::const_iterator iter_ = _macroset.find (name_);
+
+ if (iter_ == _macroset.end ())
+ {
+ _macrodeque.push_back (string_pair (name_, regex_));
+ _macroset.insert (name_);
+ }
+ else
+ {
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "Attempt to redefine MACRO '";
+
+ while (*name_)
+ {
+ os_ << ss_.narrow (*name_++, static_cast<CharT> (' '));
+ }
+
+ os_ << "'.";
+ throw runtime_error (os_.str ());
+ }
+ }
+
+ void add_macros (const basic_rules<CharT> &rules_)
+ {
+ const string_pair_deque &macros_ = rules_.macrodeque ();
+ typename string_pair_deque::const_iterator macro_iter_ =
+ macros_.begin ();
+ typename string_pair_deque::const_iterator macro_end_ =
+ macros_.end ();
+
+ for (; macro_iter_ != macro_end_; ++macro_iter_)
+ {
+ add_macro (macro_iter_->first.c_str (),
+ macro_iter_->second.c_str ());
+ }
+ }
+
+ void merge_macros (const basic_rules<CharT> &rules_)
+ {
+ const string_pair_deque &macros_ = rules_.macrodeque ();
+ typename string_pair_deque::const_iterator macro_iter_ =
+ macros_.begin ();
+ typename string_pair_deque::const_iterator macro_end_ =
+ macros_.end ();
+ typename string_set::const_iterator macro_dest_iter_;
+ typename string_set::const_iterator macro_dest_end_ = _macroset.end ();
+
+ for (; macro_iter_ != macro_end_; ++macro_iter_)
+ {
+ macro_dest_iter_ = _macroset.find (macro_iter_->first);
+
+ if (macro_dest_iter_ == macro_dest_end_)
+ {
+ add_macro (macro_iter_->first.c_str (),
+ macro_iter_->second.c_str ());
+ }
+ }
+ }
+
+ std::size_t add (const CharT *regex_, const std::size_t id_)
+ {
+ return add (string (regex_), id_);
+ }
+
+ std::size_t add (const CharT *regex_start_, const CharT *regex_end_,
+ const std::size_t id_)
+ {
+ return add (string (regex_start_, regex_end_), id_);
+ }
+
+ std::size_t add (const string &regex_, const std::size_t id_)
+ {
+ const std::size_t counter_ = next_unique_id ();
+
+ check_for_invalid_id (id_);
+ _regexes.front ().push_back (regex_);
+ _ids.front ().push_back (id_);
+ _unique_ids.front ().push_back (counter_);
+ _states.front ().push_back (0);
+ return counter_;
+ }
+
+ std::size_t add (const CharT *curr_state_, const CharT *regex_,
+ const CharT *new_state_)
+ {
+ return add (curr_state_, string (regex_), new_state_);
+ }
+
+ std::size_t add (const CharT *curr_state_, const CharT *regex_start_,
+ const CharT *regex_end_, const CharT *new_state_)
+ {
+ return add (curr_state_, string (regex_start_, regex_end_),
+ new_state_);
+ }
+
+ std::size_t add (const CharT *curr_state_, const string &regex_,
+ const CharT *new_state_)
+ {
+ return add (curr_state_, regex_, 0, new_state_, false);
+ }
+
+ std::size_t add (const CharT *curr_state_, const CharT *regex_,
+ const std::size_t id_, const CharT *new_state_)
+ {
+ return add (curr_state_, string (regex_), id_, new_state_);
+ }
+
+ std::size_t add (const CharT *curr_state_, const CharT *regex_start_,
+ const CharT *regex_end_, const std::size_t id_,
+ const CharT *new_state_)
+ {
+ return add (curr_state_, string (regex_start_, regex_end_), id_,
+ new_state_);
+ }
+
+ std::size_t add (const CharT *curr_state_, const string &regex_,
+ const std::size_t id_, const CharT *new_state_)
+ {
+ return add (curr_state_, regex_, id_, new_state_, true);
+ }
+
+ void add (const CharT *source_, const basic_rules<CharT> &rules_,
+ const CharT *dest_, const CharT *to_ = detail::strings<CharT>::dot ())
+ {
+ const bool star_ = *source_ == '*' && *(source_ + 1) == 0;
+ const bool dest_dot_ = *dest_ == '.' && *(dest_ + 1) == 0;
+ const bool to_dot_ = *to_ == '.' && *(to_ + 1) == 0;
+ std::size_t state_ = 0;
+ const string_deque_deque &all_regexes_ = rules_.regexes ();
+ const id_vector_deque &all_ids_ = rules_.ids ();
+ const id_vector_deque &all_unique_ids_ = rules_.unique_ids ();
+ const id_vector_deque &all_states_ = rules_.states ();
+ typename string_deque::const_iterator regex_iter_;
+ typename string_deque::const_iterator regex_end_;
+ typename id_vector::const_iterator id_iter_;
+ typename id_vector::const_iterator uid_iter_;
+ typename id_vector::const_iterator state_iter_;
+
+ if (star_)
+ {
+ typename string_deque_deque::const_iterator all_regexes_iter_ =
+ all_regexes_.begin ();
+ typename string_deque_deque::const_iterator all_regexes_end_ =
+ all_regexes_.end ();
+ typename id_vector_deque::const_iterator all_ids_iter_ =
+ all_ids_.begin ();
+ typename id_vector_deque::const_iterator all_uids_iter_ =
+ all_unique_ids_.begin ();
+ typename id_vector_deque::const_iterator all_states_iter_ =
+ all_states_.begin ();
+
+ for (; all_regexes_iter_ != all_regexes_end_;
+ ++state_, ++all_regexes_iter_, ++all_ids_iter_,
+ ++all_uids_iter_, ++all_states_iter_)
+ {
+ regex_iter_ = all_regexes_iter_->begin ();
+ regex_end_ = all_regexes_iter_->end ();
+ id_iter_ = all_ids_iter_->begin ();
+ uid_iter_ = all_uids_iter_->begin ();
+ state_iter_ = all_states_iter_->begin ();
+
+ for (; regex_iter_ != regex_end_; ++regex_iter_, ++id_iter_,
+ ++uid_iter_, ++state_iter_)
+ {
+ // If ..._dot_ then lookup state name from rules_; otherwise
+ // pass name through.
+ add (dest_dot_ ? rules_.state (state_) : dest_, *regex_iter_,
+ *id_iter_, to_dot_ ? rules_.state (*state_iter_) : to_, true,
+ *uid_iter_);
+ }
+ }
+ }
+ else
+ {
+ const CharT *start_ = source_;
+ string state_name_;
+
+ while (*source_)
+ {
+ while (*source_ && *source_ != ',')
+ {
+ ++source_;
+ }
+
+ state_name_.assign (start_, source_);
+
+ if (*source_)
+ {
+ ++source_;
+ start_ = source_;
+ }
+
+ state_ = rules_.state (state_name_.c_str ());
+
+ if (state_ == npos)
+ {
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "Unknown state name '";
+ source_ = state_name_.c_str ();
+
+ while (*source_)
+ {
+ os_ << ss_.narrow (*source_++, ' ');
+ }
+
+ os_ << "'.";
+ throw runtime_error (os_.str ());
+ }
+
+ regex_iter_ = all_regexes_[state_].begin ();
+ regex_end_ = all_regexes_[state_].end ();
+ id_iter_ = all_ids_[state_].begin ();
+ uid_iter_ = all_unique_ids_[state_].begin ();
+ state_iter_ = all_states_[state_].begin ();
+
+ for (; regex_iter_ != regex_end_; ++regex_iter_, ++id_iter_,
+ ++uid_iter_, ++state_iter_)
+ {
+ // If ..._dot_ then lookup state name from rules_; otherwise
+ // pass name through.
+ add (dest_dot_ ? state_name_.c_str () : dest_, *regex_iter_,
+ *id_iter_, to_dot_ ? rules_.state (*state_iter_) : to_, true,
+ *uid_iter_);
+ }
+ }
+ }
+ }
+/*
+ void add (const CharT *curr_state_, const basic_rules<CharT> &rules_)
+ {
+ const string_deque_deque &regexes_ = rules_.regexes ();
+ const id_vector_deque &ids_ = rules_.ids ();
+ const id_vector_deque &unique_ids_ = rules_.unique_ids ();
+ typename string_deque_deque::const_iterator state_regex_iter_ =
+ regexes_.begin ();
+ typename string_deque_deque::const_iterator state_regex_end_ =
+ regexes_.end ();
+ typename id_vector_deque::const_iterator state_id_iter_ =
+ ids_.begin ();
+ typename id_vector_deque::const_iterator state_uid_iter_ =
+ unique_ids_.begin ();
+ typename string_deque::const_iterator regex_iter_;
+ typename string_deque::const_iterator regex_end_;
+ typename id_vector::const_iterator id_iter_;
+ typename id_vector::const_iterator uid_iter_;
+
+ for (; state_regex_iter_ != state_regex_end_; ++state_regex_iter_)
+ {
+ regex_iter_ = state_regex_iter_->begin ();
+ regex_end_ = state_regex_iter_->end ();
+ id_iter_ = state_id_iter_->begin ();
+ uid_iter_ = state_uid_iter_->begin ();
+
+ for (; regex_iter_ != regex_end_; ++regex_iter_, ++id_iter_,
+ ++uid_iter_)
+ {
+ add (curr_state_, *regex_iter_, *id_iter_, curr_state_, true,
+ *uid_iter_);
+ }
+ }
+ }
+*/
+ const string_size_t_map &statemap () const
+ {
+ return _statemap;
+ }
+
+ const string_pair_deque &macrodeque () const
+ {
+ return _macrodeque;
+ }
+
+ const string_deque_deque &regexes () const
+ {
+ return _regexes;
+ }
+
+ const id_vector_deque &ids () const
+ {
+ return _ids;
+ }
+
+ const id_vector_deque &unique_ids () const
+ {
+ return _unique_ids;
+ }
+
+ const id_vector_deque &states () const
+ {
+ return _states;
+ }
+
+ bool empty () const
+ {
+ typename string_deque_deque::const_iterator iter_ = _regexes.begin ();
+ typename string_deque_deque::const_iterator end_ = _regexes.end ();
+ bool empty_ = true;
+
+ for (; iter_ != end_; ++iter_)
+ {
+ if (!iter_->empty ())
+ {
+ empty_ = false;
+ break;
+ }
+ }
+
+ return empty_;
+ }
+
+ static const CharT *initial ()
+ {
+ return detail::strings<CharT>::initial ();
+ }
+
+ static const CharT *all_states ()
+ {
+ return detail::strings<CharT>::all_states ();
+ }
+
+ static const CharT *dot ()
+ {
+ return detail::strings<CharT>::dot ();
+ }
+
+private:
+ string_size_t_map _statemap;
+ string_pair_deque _macrodeque;
+ string_set _macroset;
+ string_deque_deque _regexes;
+ id_vector_deque _ids;
+ id_vector_deque _unique_ids;
+ id_vector_deque _states;
+ regex_flags _flags;
+ std::size_t _counter;
+ std::size_t (*_counter_ptr) ();
+ std::locale _locale;
+ string_deque _lexer_state_names;
+
+ std::size_t add (const CharT *curr_state_, const string &regex_,
+ const std::size_t id_, const CharT *new_state_, const bool check_,
+ const std::size_t uid_ = npos)
+ {
+ const bool star_ = *curr_state_ == '*' && *(curr_state_ + 1) == 0;
+ const bool dot_ = *new_state_ == '.' && *(new_state_ + 1) == 0;
+
+ if (check_)
+ {
+ check_for_invalid_id (id_);
+ }
+
+ if (!dot_)
+ {
+ validate (new_state_);
+ }
+
+ std::size_t new_ = string::npos;
+ typename string_size_t_map::const_iterator iter_;
+ typename string_size_t_map::const_iterator end_ = _statemap.end ();
+ id_vector states_;
+
+ if (!dot_)
+ {
+ iter_ = _statemap.find (new_state_);
+
+ if (iter_ == end_)
+ {
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "Unknown state name '";
+
+ while (*new_state_)
+ {
+ os_ << ss_.narrow (*new_state_++, ' ');
+ }
+
+ os_ << "'.";
+ throw runtime_error (os_.str ());
+ }
+
+ new_ = iter_->second;
+ }
+
+ if (star_)
+ {
+ const std::size_t size_ = _statemap.size ();
+
+ for (std::size_t i_ = 0; i_ < size_; ++i_)
+ {
+ states_.push_back (i_);
+ }
+ }
+ else
+ {
+ const CharT *start_ = curr_state_;
+ string state_;
+
+ while (*curr_state_)
+ {
+ while (*curr_state_ && *curr_state_ != ',')
+ {
+ ++curr_state_;
+ }
+
+ state_.assign (start_, curr_state_);
+
+ if (*curr_state_)
+ {
+ ++curr_state_;
+ start_ = curr_state_;
+ }
+
+ validate (state_.c_str ());
+ iter_ = _statemap.find (state_.c_str ());
+
+ if (iter_ == end_)
+ {
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "Unknown state name '";
+ curr_state_ = state_.c_str ();
+
+ while (*curr_state_)
+ {
+ os_ << ss_.narrow (*curr_state_++, ' ');
+ }
+
+ os_ << "'.";
+ throw runtime_error (os_.str ());
+ }
+
+ states_.push_back (iter_->second);
+ }
+ }
+
+ std::size_t first_counter_ = npos;
+
+ for (std::size_t i_ = 0, size_ = states_.size (); i_ < size_; ++i_)
+ {
+ const std::size_t curr_ = states_[i_];
+
+ _regexes[curr_].push_back (regex_);
+ _ids[curr_].push_back (id_);
+
+ if (uid_ == npos)
+ {
+ const std::size_t counter_ = next_unique_id ();
+
+ if (first_counter_ == npos)
+ {
+ first_counter_ = counter_;
+ }
+
+ _unique_ids[curr_].push_back (counter_);
+ }
+ else
+ {
+ if (first_counter_ == npos)
+ {
+ first_counter_ = uid_;
+ }
+
+ _unique_ids[curr_].push_back (uid_);
+ }
+
+ _states[curr_].push_back (dot_ ? curr_ : new_);
+ }
+
+ return first_counter_;
+ }
+
+ void validate (const CharT *name_) const
+ {
+ const CharT *start_ = name_;
+
+ if (*name_ != '_' && !(*name_ >= 'A' && *name_ <= 'Z') &&
+ !(*name_ >= 'a' && *name_ <= 'z'))
+ {
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "Invalid name '";
+
+ while (*name_)
+ {
+ os_ << ss_.narrow (*name_++, ' ');
+ }
+
+ os_ << "'.";
+ throw runtime_error (os_.str ());
+ }
+ else if (*name_)
+ {
+ ++name_;
+ }
+
+ while (*name_)
+ {
+ if (*name_ != '_' && *name_ != '-' &&
+ !(*name_ >= 'A' && *name_ <= 'Z') &&
+ !(*name_ >= 'a' && *name_ <= 'z') &&
+ !(*name_ >= '0' && *name_ <= '9'))
+ {
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "Invalid name '";
+ name_ = start_;
+
+ while (*name_)
+ {
+ os_ << ss_.narrow (*name_++, ' ');
+ }
+
+ os_ << "'.";
+ throw runtime_error (os_.str ());
+ }
+
+ ++name_;
+ }
+
+ if (name_ - start_ > static_cast<std::ptrdiff_t>(max_macro_len))
+ {
+ std::basic_stringstream<CharT> ss_;
+ std::ostringstream os_;
+
+ os_ << "Name '";
+ name_ = start_;
+
+ while (*name_)
+ {
+ os_ << ss_.narrow (*name_++, ' ');
+ }
+
+ os_ << "' too long.";
+ throw runtime_error (os_.str ());
+ }
+ }
+
+ void check_for_invalid_id (const std::size_t id_) const
+ {
+ switch (id_)
+ {
+ case 0:
+ throw runtime_error ("id 0 is reserved for EOF.");
+ case npos:
+ throw runtime_error ("id npos is reserved for the "
+ "UNKNOWN token.");
+ default:
+ // OK
+ break;
+ }
+ }
+};
+
+typedef basic_rules<char> rules;
+typedef basic_rules<wchar_t> wrules;
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/runtime_error.hpp b/boost/spirit/home/support/detail/lexer/runtime_error.hpp
new file mode 100644
index 0000000000..2ab716a517
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/runtime_error.hpp
@@ -0,0 +1,26 @@
+// runtime_error.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_RUNTIME_ERROR_HPP
+#define BOOST_LEXER_RUNTIME_ERROR_HPP
+
+#include <stdexcept>
+
+namespace boost
+{
+namespace lexer
+{
+class runtime_error : public std::runtime_error
+{
+public:
+ runtime_error (const std::string &what_arg_) :
+ std::runtime_error (what_arg_)
+ {
+ }
+};
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/serialise.hpp b/boost/spirit/home/support/detail/lexer/serialise.hpp
new file mode 100644
index 0000000000..3a2ff1fa08
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/serialise.hpp
@@ -0,0 +1,35 @@
+// examples/serialise.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_SERIALISE_HPP
+#define BOOST_LEXER_SERIALISE_HPP
+
+#include "internals.hpp"
+#include "state_machine.hpp"
+#include <boost/serialization/vector.hpp>
+
+namespace boost
+{
+namespace lexer
+{
+// IMPORTANT! This won't work if you don't enable RTTI!
+template<typename CharT, class Archive>
+void serialise (basic_state_machine<CharT> &sm_, Archive &ar_,
+ unsigned int version_ = 1)
+{
+ detail::internals &internals_ = const_cast<detail::internals &>
+ (sm_.data ());
+
+ ar_ & version_;
+ ar_ & *internals_._lookup;
+ ar_ & internals_._dfa_alphabet;
+ ar_ & *internals_._dfa;
+ ar_ & internals_._seen_BOL_assertion;
+ ar_ & internals_._seen_EOL_assertion;
+}
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/size_t.hpp b/boost/spirit/home/support/detail/lexer/size_t.hpp
new file mode 100644
index 0000000000..349aa6de09
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/size_t.hpp
@@ -0,0 +1,21 @@
+// size_t.h
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_SIZE_T_H
+#define BOOST_LEXER_SIZE_T_H
+
+#include <stddef.h> // ptrdiff_t
+
+#if defined _MSC_VER && _MSC_VER <= 1200
+namespace std
+{
+ using ::ptrdiff_t;
+ using ::size_t;
+}
+#else
+#include <string>
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/state_machine.hpp b/boost/spirit/home/support/detail/lexer/state_machine.hpp
new file mode 100644
index 0000000000..e09e9914b9
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/state_machine.hpp
@@ -0,0 +1,439 @@
+// state_machine.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_STATE_MACHINE_HPP
+#define BOOST_LEXER_STATE_MACHINE_HPP
+
+#include <algorithm>
+#include "conversion/char_state_machine.hpp"
+#include "consts.hpp"
+#include <deque>
+#include "internals.hpp"
+#include <map>
+#include "containers/ptr_vector.hpp"
+#include "size_t.hpp"
+#include <string>
+
+namespace boost
+{
+namespace lexer
+{
+template<typename CharT>
+class basic_state_machine
+{
+public:
+ typedef CharT char_type;
+
+ class iterator
+ {
+ public:
+#if defined _MSC_VER && _MSC_VER <= 1200
+ friend basic_state_machine;
+#else
+ friend class basic_state_machine;
+#endif
+
+ struct data
+ {
+ // Current iterator info
+ std::size_t dfa;
+ std::size_t states;
+ std::size_t state;
+ std::size_t transitions;
+ std::size_t transition;
+
+ // Current state info
+ bool end_state;
+ std::size_t id;
+ std::size_t unique_id;
+ std::size_t goto_dfa;
+ std::size_t bol_index;
+ std::size_t eol_index;
+
+ // Current transition info
+ basic_string_token<CharT> token;
+ std::size_t goto_state;
+
+ data () :
+ dfa (npos),
+ states (0),
+ state (npos),
+ transitions (0),
+ transition (npos),
+ end_state (false),
+ id (npos),
+ unique_id (npos),
+ goto_dfa (npos),
+ bol_index (npos),
+ eol_index (npos),
+ goto_state (npos)
+ {
+ }
+
+ bool operator == (const data &rhs_) const
+ {
+ return dfa == rhs_.dfa &&
+ states == rhs_.states &&
+ state == rhs_.state &&
+ transitions == rhs_.transitions &&
+ transition == rhs_.transition &&
+ end_state == rhs_.end_state &&
+ id == rhs_.id &&
+ unique_id == rhs_.unique_id &&
+ goto_dfa == rhs_.goto_dfa &&
+ bol_index == rhs_.bol_index &&
+ eol_index == rhs_.eol_index &&
+ token == rhs_.token &&
+ transition == rhs_.transition;
+ }
+ };
+
+ iterator () :
+ _sm (0),
+ _dfas (0),
+ _dfa (npos),
+ _states (0),
+ _state (npos),
+ _transitions (0),
+ _transition (npos)
+ {
+ }
+
+ bool operator == (const iterator &rhs_) const
+ {
+ return _dfas == rhs_._dfas && _dfa == rhs_._dfa &&
+ _states == rhs_._states && _state == rhs_._state &&
+ _transitions == rhs_._transitions &&
+ _transition == rhs_._transition;
+ }
+
+ bool operator != (const iterator &rhs_) const
+ {
+ return !(*this == rhs_);
+ }
+
+ data &operator * ()
+ {
+ return _data;
+ }
+
+ data *operator -> ()
+ {
+ return &_data;
+ }
+
+ // Let compiler generate operator = ().
+
+ // prefix version
+ iterator &operator ++ ()
+ {
+ next ();
+ return *this;
+ }
+
+ // postfix version
+ iterator operator ++ (int)
+ {
+ iterator iter_ = *this;
+
+ next ();
+ return iter_;
+ }
+
+ void clear ()
+ {
+ _dfas = _states = _transitions = 0;
+ _dfa = _state = _transition = npos;
+ }
+
+ private:
+ basic_state_machine *_sm;
+ data _data;
+ std::size_t _dfas;
+ std::size_t _dfa;
+ std::size_t _states;
+ std::size_t _state;
+ std::size_t _transitions;
+ std::size_t _transition;
+ typename detail::basic_char_state_machine<CharT>::state::
+ size_t_string_token_map::const_iterator _token_iter;
+ typename detail::basic_char_state_machine<CharT>::state::
+ size_t_string_token_map::const_iterator _token_end;
+
+ void next ()
+ {
+ bool reset_state_ = false;
+
+ if (_transition >= _transitions)
+ {
+ _transition = _data.transition = 0;
+ _data.state = ++_state;
+ reset_state_ = true;
+
+ if (_state >= _states)
+ {
+ ++_dfa;
+
+ if (_dfa >= _dfas)
+ {
+ clear ();
+ reset_state_ = false;
+ }
+ else
+ {
+ _states = _data.states =
+ _sm->_csm._sm_vector[_dfa].size ();
+ _state = _data.state = 0;
+ }
+ }
+ }
+ else
+ {
+ _data.transition = _transition;
+ }
+
+ if (reset_state_)
+ {
+ const typename detail::basic_char_state_machine<CharT>::
+ state *ptr_ = &_sm->_csm._sm_vector[_dfa][_state];
+
+ _transitions = _data.transitions = ptr_->_transitions.size ();
+ _data.end_state = ptr_->_end_state;
+ _data.id = ptr_->_id;
+ _data.unique_id = ptr_->_unique_id;
+ _data.goto_dfa = ptr_->_state;
+ _data.bol_index = ptr_->_bol_index;
+ _data.eol_index = ptr_->_eol_index;
+ _token_iter = ptr_->_transitions.begin ();
+ _token_end = ptr_->_transitions.end ();
+ }
+
+ if (_token_iter != _token_end)
+ {
+ _data.token = _token_iter->second;
+ _data.goto_state = _token_iter->first;
+ ++_token_iter;
+ ++_transition;
+ }
+ else
+ {
+ _data.token.clear ();
+ _data.goto_state = npos;
+ }
+ }
+ };
+
+#if defined _MSC_VER && _MSC_VER <= 1200
+ friend iterator;
+#else
+ friend class iterator;
+#endif
+
+ basic_state_machine ()
+ {
+ }
+
+ void clear ()
+ {
+ _internals.clear ();
+ _csm.clear ();
+ }
+
+ bool empty () const
+ {
+ // Don't include _csm in this test, as irrelevant to state.
+ return _internals._lookup->empty () &&
+ _internals._dfa_alphabet.empty () &&
+ _internals._dfa->empty ();
+ }
+
+ std::size_t size () const
+ {
+ return _internals._dfa->size ();
+ }
+
+ bool operator == (const basic_state_machine &rhs_) const
+ {
+ // Don't include _csm in this test, as irrelevant to state.
+ return _internals._lookup == rhs_._internals._lookup &&
+ _internals._dfa_alphabet == rhs_._internals._dfa_alphabet &&
+ _internals._dfa == rhs_._internals._dfa &&
+ _internals._seen_BOL_assertion ==
+ rhs_._internals._seen_BOL_assertion &&
+ _internals._seen_EOL_assertion ==
+ rhs_._internals._seen_EOL_assertion;
+ }
+
+ iterator begin () const
+ {
+ iterator iter_;
+
+ iter_._sm = const_cast<basic_state_machine *>(this);
+ check_for_csm ();
+
+ if (!_csm.empty ())
+ {
+ const typename detail::basic_char_state_machine<CharT>::
+ state_vector *ptr_ = &_csm._sm_vector.front ();
+
+ iter_._dfas = _csm._sm_vector.size ();
+ iter_._states = iter_._data.states = ptr_->size ();
+ iter_._transitions = iter_._data.transitions =
+ ptr_->front ()._transitions.size ();
+ iter_._dfa = iter_._data.dfa = 0;
+ iter_._state = iter_._data.state = 0;
+ iter_._transition = 0;
+ iter_._data.end_state = ptr_->front ()._end_state;
+ iter_._data.id = ptr_->front ()._id;
+ iter_._data.unique_id = ptr_->front ()._unique_id;
+ iter_._data.goto_dfa = ptr_->front ()._state;
+ iter_._data.bol_index = ptr_->front ()._bol_index;
+ iter_._data.eol_index = ptr_->front ()._eol_index;
+ iter_._token_iter = ptr_->front ()._transitions.begin ();
+ iter_._token_end = ptr_->front ()._transitions.end ();
+
+ // Deal with case where there is only a bol or eol
+ // but no other transitions.
+ if (iter_._transitions)
+ {
+ ++iter_;
+ }
+ }
+
+ return iter_;
+ }
+
+ iterator end () const
+ {
+ iterator iter_;
+
+ iter_._sm = const_cast<basic_state_machine *>(this);
+ return iter_;
+ }
+
+ void swap (basic_state_machine &sm_)
+ {
+ _internals.swap (sm_._internals);
+ _csm.swap (sm_._csm);
+ }
+
+ const detail::internals &data () const
+ {
+ return _internals;
+ }
+
+private:
+ detail::internals _internals;
+ mutable detail::basic_char_state_machine<CharT> _csm;
+
+ void check_for_csm () const
+ {
+ if (_csm.empty ())
+ {
+ human_readable (_csm);
+ }
+ }
+
+ void human_readable (detail::basic_char_state_machine<CharT> &sm_) const
+ {
+ const std::size_t max_ = sizeof (CharT) == 1 ?
+ num_chars : num_wchar_ts;
+ const std::size_t start_states_ = _internals._dfa->size ();
+
+ sm_.clear ();
+ sm_._sm_vector.resize (start_states_);
+
+ for (std::size_t start_state_index_ = 0;
+ start_state_index_ < start_states_; ++start_state_index_)
+ {
+ const detail::internals::size_t_vector *lu_ =
+ _internals._lookup[start_state_index_];
+ const std::size_t alphabet_ =
+ _internals._dfa_alphabet[start_state_index_] - dfa_offset;
+ std::vector<std::basic_string<CharT> > chars_ (alphabet_);
+ const std::size_t states_ = _internals._dfa[start_state_index_]->
+ size () / (alphabet_ + dfa_offset);
+ const std::size_t *read_ptr_ = &_internals.
+ _dfa[start_state_index_]->front () + alphabet_ + dfa_offset;
+
+ sm_._sm_vector[start_state_index_].resize (states_ - 1);
+
+ for (std::size_t alpha_index_ = 0; alpha_index_ < max_;
+ ++alpha_index_)
+ {
+ const std::size_t col_ = lu_->at (alpha_index_);
+
+ if (col_ != dead_state_index)
+ {
+ chars_[col_ - dfa_offset] += static_cast<CharT>
+ (alpha_index_);
+ }
+ }
+
+ for (std::size_t state_index_ = 1; state_index_ < states_;
+ ++state_index_)
+ {
+ typename detail::basic_char_state_machine<CharT>::state
+ *state_ = &sm_._sm_vector[start_state_index_]
+ [state_index_ - 1];
+
+ state_->_end_state = *read_ptr_ != 0;
+ state_->_id = *(read_ptr_ + id_index);
+ state_->_unique_id = *(read_ptr_ + unique_id_index);
+ state_->_state = *(read_ptr_ + state_index);
+ state_->_bol_index = *(read_ptr_ + bol_index) - 1;
+ state_->_eol_index = *(read_ptr_ + eol_index) - 1;
+ read_ptr_ += dfa_offset;
+
+ for (std::size_t col_index_ = 0; col_index_ < alphabet_;
+ ++col_index_, ++read_ptr_)
+ {
+ const std::size_t transition_ = *read_ptr_;
+
+ if (transition_ != 0)
+ {
+ const std::size_t i_ = transition_ - 1;
+ typename detail::basic_char_state_machine<CharT>::
+ state::size_t_string_token_map::iterator iter_ =
+ state_->_transitions.find (i_);
+
+ if (iter_ == state_->_transitions.end ())
+ {
+ basic_string_token<CharT> token_
+ (false, chars_[col_index_]);
+ typename detail::basic_char_state_machine<CharT>::
+ state::size_t_string_token_pair pair_
+ (i_, token_);
+
+ state_->_transitions.insert (pair_);
+ }
+ else
+ {
+ iter_->second._charset += chars_[col_index_];
+ }
+ }
+ }
+
+ for (typename detail::basic_char_state_machine<CharT>::state::
+ size_t_string_token_map::iterator iter_ =
+ state_->_transitions.begin (),
+ end_ = state_->_transitions.end ();
+ iter_ != end_; ++iter_)
+ {
+ std::sort (iter_->second._charset.begin (),
+ iter_->second._charset.end ());
+ iter_->second.normalise ();
+ }
+ }
+ }
+ }
+};
+
+typedef basic_state_machine<char> state_machine;
+typedef basic_state_machine<wchar_t> wstate_machine;
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/lexer/string_token.hpp b/boost/spirit/home/support/detail/lexer/string_token.hpp
new file mode 100644
index 0000000000..6bfa6ff1a5
--- /dev/null
+++ b/boost/spirit/home/support/detail/lexer/string_token.hpp
@@ -0,0 +1,413 @@
+// string_token.hpp
+// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_LEXER_STRING_TOKEN_HPP
+#define BOOST_LEXER_STRING_TOKEN_HPP
+
+#include <algorithm>
+#include "size_t.hpp"
+#include "consts.hpp" // num_chars, num_wchar_ts
+#include <string>
+
+namespace boost
+{
+namespace lexer
+{
+template<typename CharT>
+struct basic_string_token
+{
+ typedef std::basic_string<CharT> string;
+
+ bool _negated;
+ string _charset;
+
+ basic_string_token () :
+ _negated (false)
+ {
+ }
+
+ basic_string_token (const bool negated_, const string &charset_) :
+ _negated (negated_),
+ _charset (charset_)
+ {
+ }
+
+ void remove_duplicates ()
+ {
+ const CharT *start_ = _charset.c_str ();
+ const CharT *end_ = start_ + _charset.size ();
+
+ // Optimisation for very large charsets:
+ // sorting via pointers is much quicker than
+ // via iterators...
+ std::sort (const_cast<CharT *> (start_), const_cast<CharT *> (end_));
+ _charset.erase (std::unique (_charset.begin (), _charset.end ()),
+ _charset.end ());
+ }
+
+ void normalise ()
+ {
+ const std::size_t max_chars_ = sizeof (CharT) == 1 ?
+ num_chars : num_wchar_ts;
+
+ if (_charset.length () == max_chars_)
+ {
+ _negated = !_negated;
+#if defined _MSC_VER && _MSC_VER <= 1200
+ _charset.erase ();
+#else
+ _charset.clear ();
+#endif
+ }
+ else if (_charset.length () > max_chars_ / 2)
+ {
+ negate ();
+ }
+ }
+
+ void negate ()
+ {
+ const std::size_t max_chars_ = sizeof (CharT) == 1 ?
+ num_chars : num_wchar_ts;
+ CharT curr_char_ = sizeof (CharT) == 1 ? -128 : 0;
+ string temp_;
+ const CharT *curr_ = _charset.c_str ();
+ const CharT *chars_end_ = curr_ + _charset.size ();
+
+ _negated = !_negated;
+ temp_.resize (max_chars_ - _charset.size ());
+
+ CharT *ptr_ = const_cast<CharT *> (temp_.c_str ());
+ std::size_t i_ = 0;
+
+ while (curr_ < chars_end_)
+ {
+ while (*curr_ > curr_char_)
+ {
+ *ptr_ = curr_char_;
+ ++ptr_;
+ ++curr_char_;
+ ++i_;
+ }
+
+ ++curr_char_;
+ ++curr_;
+ ++i_;
+ }
+
+ for (; i_ < max_chars_; ++i_)
+ {
+ *ptr_ = curr_char_;
+ ++ptr_;
+ ++curr_char_;
+ }
+
+ _charset = temp_;
+ }
+
+ bool operator < (const basic_string_token &rhs_) const
+ {
+ return _negated < rhs_._negated ||
+ (_negated == rhs_._negated && _charset < rhs_._charset);
+ }
+
+ bool empty () const
+ {
+ return _charset.empty () && !_negated;
+ }
+
+ bool any () const
+ {
+ return _charset.empty () && _negated;
+ }
+
+ void clear ()
+ {
+ _negated = false;
+#if defined _MSC_VER && _MSC_VER <= 1200
+ _charset.erase ();
+#else
+ _charset.clear ();
+#endif
+ }
+
+ void intersect (basic_string_token &rhs_, basic_string_token &overlap_)
+ {
+ if ((any () && rhs_.any ()) || (_negated == rhs_._negated &&
+ !any () && !rhs_.any ()))
+ {
+ intersect_same_types (rhs_, overlap_);
+ }
+ else
+ {
+ intersect_diff_types (rhs_, overlap_);
+ }
+ }
+
+ static void escape_char (const CharT ch_, string &out_)
+ {
+ switch (ch_)
+ {
+ case '\0':
+ out_ += '\\';
+ out_ += '0';
+ break;
+ case '\a':
+ out_ += '\\';
+ out_ += 'a';
+ break;
+ case '\b':
+ out_ += '\\';
+ out_ += 'b';
+ break;
+ case 27:
+ out_ += '\\';
+ out_ += 'x';
+ out_ += '1';
+ out_ += 'b';
+ break;
+ case '\f':
+ out_ += '\\';
+ out_ += 'f';
+ break;
+ case '\n':
+ out_ += '\\';
+ out_ += 'n';
+ break;
+ case '\r':
+ out_ += '\\';
+ out_ += 'r';
+ break;
+ case '\t':
+ out_ += '\\';
+ out_ += 't';
+ break;
+ case '\v':
+ out_ += '\\';
+ out_ += 'v';
+ break;
+ case '\\':
+ out_ += '\\';
+ out_ += '\\';
+ break;
+ case '"':
+ out_ += '\\';
+ out_ += '"';
+ break;
+ case '\'':
+ out_ += '\\';
+ out_ += '\'';
+ break;
+ default:
+ {
+ if (ch_ < 32 && ch_ >= 0)
+ {
+ std::basic_stringstream<CharT> ss_;
+
+ out_ += '\\';
+ out_ += 'x';
+ ss_ << std::hex <<
+ static_cast<std::size_t> (ch_);
+ out_ += ss_.str ();
+ }
+ else
+ {
+ out_ += ch_;
+ }
+
+ break;
+ }
+ }
+ }
+
+private:
+ void intersect_same_types (basic_string_token &rhs_,
+ basic_string_token &overlap_)
+ {
+ if (any ())
+ {
+ clear ();
+ overlap_._negated = true;
+ rhs_.clear ();
+ }
+ else
+ {
+ typename string::iterator iter_ = _charset.begin ();
+ typename string::iterator end_ = _charset.end ();
+ typename string::iterator rhs_iter_ = rhs_._charset.begin ();
+ typename string::iterator rhs_end_ = rhs_._charset.end ();
+
+ overlap_._negated = _negated;
+
+ while (iter_ != end_ && rhs_iter_ != rhs_end_)
+ {
+ if (*iter_ < *rhs_iter_)
+ {
+ ++iter_;
+ }
+ else if (*iter_ > *rhs_iter_)
+ {
+ ++rhs_iter_;
+ }
+ else
+ {
+ overlap_._charset += *iter_;
+ iter_ = _charset.erase (iter_);
+ end_ = _charset.end ();
+ rhs_iter_ = rhs_._charset.erase (rhs_iter_);
+ rhs_end_ = rhs_._charset.end ();
+ }
+ }
+
+ if (_negated)
+ {
+ // duplicates already merged, so safe to merge
+ // using std lib.
+
+ // src, dest
+ merge (_charset, overlap_._charset);
+ // duplicates already merged, so safe to merge
+ // using std lib.
+
+ // src, dest
+ merge (rhs_._charset, overlap_._charset);
+ _negated = false;
+ rhs_._negated = false;
+ std::swap (_charset, rhs_._charset);
+ normalise ();
+ overlap_.normalise ();
+ rhs_.normalise ();
+ }
+ else if (!overlap_._charset.empty ())
+ {
+ normalise ();
+ overlap_.normalise ();
+ rhs_.normalise ();
+ }
+ }
+ }
+
+ void intersect_diff_types (basic_string_token &rhs_,
+ basic_string_token &overlap_)
+ {
+ if (any ())
+ {
+ intersect_any (rhs_, overlap_);
+ }
+ else if (_negated)
+ {
+ intersect_negated (rhs_, overlap_);
+ }
+ else // _negated == false
+ {
+ intersect_charset (rhs_, overlap_);
+ }
+ }
+
+ void intersect_any (basic_string_token &rhs_, basic_string_token &overlap_)
+ {
+ if (rhs_._negated)
+ {
+ rhs_.intersect_negated (*this, overlap_);
+ }
+ else // rhs._negated == false
+ {
+ rhs_.intersect_charset (*this, overlap_);
+ }
+ }
+
+ void intersect_negated (basic_string_token &rhs_,
+ basic_string_token &overlap_)
+ {
+ if (rhs_.any ())
+ {
+ overlap_._negated = true;
+ overlap_._charset = _charset;
+ rhs_._negated = false;
+ rhs_._charset = _charset;
+ clear ();
+ }
+ else // rhs._negated == false
+ {
+ rhs_.intersect_charset (*this, overlap_);
+ }
+ }
+
+ void intersect_charset (basic_string_token &rhs_,
+ basic_string_token &overlap_)
+ {
+ if (rhs_.any ())
+ {
+ overlap_._charset = _charset;
+ rhs_._negated = true;
+ rhs_._charset = _charset;
+ clear ();
+ }
+ else // rhs_._negated == true
+ {
+ typename string::iterator iter_ = _charset.begin ();
+ typename string::iterator end_ = _charset.end ();
+ typename string::iterator rhs_iter_ = rhs_._charset.begin ();
+ typename string::iterator rhs_end_ = rhs_._charset.end ();
+
+ while (iter_ != end_ && rhs_iter_ != rhs_end_)
+ {
+ if (*iter_ < *rhs_iter_)
+ {
+ overlap_._charset += *iter_;
+ rhs_iter_ = rhs_._charset.insert (rhs_iter_, *iter_);
+ ++rhs_iter_;
+ rhs_end_ = rhs_._charset.end ();
+ iter_ = _charset.erase (iter_);
+ end_ = _charset.end ();
+ }
+ else if (*iter_ > *rhs_iter_)
+ {
+ ++rhs_iter_;
+ }
+ else
+ {
+ ++iter_;
+ ++rhs_iter_;
+ }
+ }
+
+ if (iter_ != end_)
+ {
+ // nothing bigger in rhs_ than iter_,
+ // so safe to merge using std lib.
+ string temp_ (iter_, end_);
+
+ // src, dest
+ merge (temp_, overlap_._charset);
+ _charset.erase (iter_, end_);
+ }
+
+ if (!overlap_._charset.empty ())
+ {
+ merge (overlap_._charset, rhs_._charset);
+ // possible duplicates, so check for any and erase.
+ rhs_._charset.erase (std::unique (rhs_._charset.begin (),
+ rhs_._charset.end ()), rhs_._charset.end ());
+ normalise ();
+ overlap_.normalise ();
+ rhs_.normalise ();
+ }
+ }
+ }
+
+ void merge (string &src_, string &dest_)
+ {
+ string tmp_ (src_.size () + dest_.size (), 0);
+
+ std::merge (src_.begin (), src_.end (), dest_.begin (), dest_.end (),
+ tmp_.begin ());
+ dest_ = tmp_;
+ }
+};
+}
+}
+
+#endif
diff --git a/boost/spirit/home/support/detail/make_cons.hpp b/boost/spirit/home/support/detail/make_cons.hpp
new file mode 100644
index 0000000000..cbbb73b445
--- /dev/null
+++ b/boost/spirit/home/support/detail/make_cons.hpp
@@ -0,0 +1,86 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_MAKE_CONS_OCTOBER_16_2008_1252PM
+#define BOOST_SPIRIT_MAKE_CONS_OCTOBER_16_2008_1252PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_limits.hpp> // needs to be included before proto
+#include <boost/proto/proto.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/is_abstract.hpp>
+#include <boost/type_traits/is_function.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ template <typename T>
+ struct as_meta_element
+ : mpl::eval_if_c<is_abstract<T>::value || is_function<T>::value
+ , add_reference<T>, remove_const<T> >
+ {};
+
+ template <typename T>
+ struct as_meta_element<T&> : as_meta_element<T> // always store by value
+ {};
+
+ template <typename T, int N>
+ struct as_meta_element<T[N]>
+ {
+ typedef const T(&type)[N];
+ };
+
+ namespace result_of
+ {
+ template <typename Car, typename Cdr = fusion::nil>
+ struct make_cons
+ {
+ typedef typename as_meta_element<Car>::type car_type;
+ typedef typename fusion::cons<car_type, Cdr> type;
+ };
+ }
+
+ template <typename Car, typename Cdr>
+ fusion::cons<typename as_meta_element<Car>::type, Cdr>
+ make_cons(Car const& car, Cdr const& cdr)
+ {
+ typedef typename as_meta_element<Car>::type car_type;
+ typedef typename fusion::cons<car_type, Cdr> result;
+ return result(car, cdr);
+ }
+
+ template <typename Car>
+ fusion::cons<typename as_meta_element<Car>::type>
+ make_cons(Car const& car)
+ {
+ typedef typename as_meta_element<Car>::type car_type;
+ typedef typename fusion::cons<car_type> result;
+ return result(car);
+ }
+
+#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 0)
+ // workaround for gcc-4.0 bug where illegal function types
+ // can be formed (const is added to function type)
+ // description: http://lists.boost.org/Archives/boost/2009/04/150743.php
+ template <typename Car>
+ fusion::cons<typename as_meta_element<Car>::type>
+ make_cons(Car& car, typename enable_if<is_function<Car> >::type* = 0)
+ {
+ typedef typename as_meta_element<Car>::type car_type;
+ typedef typename fusion::cons<car_type> result;
+ return result(car);
+ }
+#endif
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/detail/make_vector.hpp b/boost/spirit/home/support/detail/make_vector.hpp
new file mode 100644
index 0000000000..92fb2c97c5
--- /dev/null
+++ b/boost/spirit/home/support/detail/make_vector.hpp
@@ -0,0 +1,114 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under the 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/version.hpp>
+
+// This is the same as the one in fusion in Boost 1.41. This is provided
+// for compatibility with Boost 1.40 and below.
+
+#if (BOOST_VERSION > 104000)
+
+#include <boost/fusion/include/make_vector.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ namespace result_of
+ {
+ using fusion::result_of::make_vector;
+ }
+ using fusion::make_vector;
+}}}
+
+#else
+
+#ifndef BOOST_PP_IS_ITERATING
+#if !defined(SPIRIT_MAKE_VECTOR_07162005_0243)
+#define SPIRIT_MAKE_VECTOR_07162005_0243
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+#include <boost/fusion/support/detail/as_fusion_element.hpp>
+
+namespace boost { namespace fusion
+{
+ struct void_;
+}}
+
+namespace boost { namespace spirit { namespace detail
+{
+ namespace result_of
+ {
+ template <
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ FUSION_MAX_VECTOR_SIZE, typename T, fusion::void_)
+ , typename Extra = fusion::void_
+ >
+ struct make_vector;
+
+ template <>
+ struct make_vector<>
+ {
+ typedef fusion::vector0 type;
+ };
+ }
+
+ inline fusion::vector0
+ make_vector()
+ {
+ return fusion::vector0();
+ }
+
+#define BOOST_FUSION_AS_FUSION_ELEMENT(z, n, data) \
+ typename fusion::detail::as_fusion_element<BOOST_PP_CAT(T, n)>::type
+
+#define BOOST_PP_FILENAME_1 <boost/spirit/home/support/detail/make_vector.hpp>
+#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE)
+#include BOOST_PP_ITERATE()
+
+#undef BOOST_FUSION_AS_FUSION_ELEMENT
+
+}}}
+
+#endif
+#else // defined(BOOST_PP_IS_ITERATING)
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#define N BOOST_PP_ITERATION()
+
+ namespace result_of
+ {
+ template <BOOST_PP_ENUM_PARAMS(N, typename T)>
+#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)
+ #define TEXT(z, n, text) , text
+ struct make_vector< BOOST_PP_ENUM_PARAMS(N, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_VECTOR_SIZE, TEXT, fusion::void_) >
+ #undef TEXT
+#else
+ struct make_vector<BOOST_PP_ENUM_PARAMS(N, T)>
+#endif
+ {
+ typedef BOOST_PP_CAT(fusion::vector, N)<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)> type;
+ };
+ }
+
+ template <BOOST_PP_ENUM_PARAMS(N, typename T)>
+ inline BOOST_PP_CAT(fusion::vector, N)<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)>
+ make_vector(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _))
+ {
+ return BOOST_PP_CAT(fusion::vector, N)<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)>(
+ BOOST_PP_ENUM_PARAMS(N, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+#endif // (BOOST_VERSION > 103800)
diff --git a/boost/spirit/home/support/detail/math/detail/fp_traits.hpp b/boost/spirit/home/support/detail/math/detail/fp_traits.hpp
new file mode 100644
index 0000000000..199712a3b9
--- /dev/null
+++ b/boost/spirit/home/support/detail/math/detail/fp_traits.hpp
@@ -0,0 +1,583 @@
+// fp_traits.hpp
+
+#ifndef BOOST_SPIRIT_MATH_FP_TRAITS_HPP
+#define BOOST_SPIRIT_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)
+
+#if defined(__vms) && defined(__DECCXX) && !__IEEE_FLOAT
+# error The VAX floating point mode on VMS is not supported.
+#endif
+
+#if defined(_MSC_VER)
+#pragma once
+#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>
+
+//------------------------------------------------------------------------------
+
+namespace boost {
+namespace spirit {
+namespace math {
+namespace detail {
+
+//------------------------------------------------------------------------------
+
+/*
+Most processors support three different floating point precisions:
+single precision (32 bits), double precision (64 bits)
+and extended double precision (>64 bits)
+
+Note that the C++ type long double can be implemented
+both as double precision and extended double precision.
+*/
+
+struct single_precision_tag {};
+struct double_precision_tag {};
+struct extended_double_precision_tag {};
+
+//------------------------------------------------------------------------------
+
+/*
+template<class T, class U> struct fp_traits_impl;
+
+ This is traits class that describes the binary structure of floating
+ point numbers of C++ type T and precision U
+
+Requirements:
+
+ T = float, double or long double
+ U = single_precision_tag, double_precision_tag
+ or extended_double_precision_tag
+
+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.
+
+ coverage -- tells us whether all bytes are copied or not.
+ It is a typedef for all_bits or not_all_bits.
+
+Static data members:
+
+ sign, exponent, flag, mantissa -- bit masks that give the meaning of the bits
+ in the leading bytes.
+
+Static function members:
+
+ init() -- initializes the static data members, if needed.
+ (Is a no-op in the specialized versions of the template.)
+
+ get_bits(), set_bits() -- provide access to the leading bytes.
+*/
+
+struct all_bits {};
+struct not_all_bits {};
+
+// Generic version -------------------------------------------------------------
+
+// The generic version uses run time initialization to determine the floating
+// point format. It is capable of handling most formats,
+// but not the Motorola 68K extended double precision format.
+
+// Currently the generic version is used only for extended double precision
+// on Itanium. In all other cases there are specializations of the template
+// that use compile time initialization.
+
+template<class T> struct uint32_t_coverage
+{
+ typedef not_all_bits type;
+};
+
+template<> struct uint32_t_coverage<single_precision_tag>
+{
+ typedef all_bits type;
+};
+
+template<class T, class U> struct fp_traits_impl
+{
+ typedef uint32_t bits;
+ typedef BOOST_DEDUCED_TYPENAME uint32_t_coverage<U>::type coverage;
+
+ BOOST_STATIC_CONSTANT(uint32_t, sign = 0x80000000);
+ static uint32_t exponent;
+ static uint32_t flag;
+ static uint32_t mantissa;
+
+ static void init()
+ {
+ if(is_init_) return;
+ do_init_();
+ is_init_ = true;
+ }
+
+ static void get_bits(T x, uint32_t& a)
+ {
+ memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+ }
+
+ static void set_bits(T& x, uint32_t a)
+ {
+ memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+ }
+
+private:
+ static size_t offset_;
+ static bool is_init_;
+ static void do_init_();
+};
+
+//..............................................................................
+
+template<class T, class U> uint32_t fp_traits_impl<T,U>::exponent;
+template<class T, class U> uint32_t fp_traits_impl<T,U>::flag;
+template<class T, class U> uint32_t fp_traits_impl<T,U>::mantissa;
+template<class T, class U> size_t fp_traits_impl<T,U>::offset_;
+template<class T, class U> bool fp_traits_impl<T,U>::is_init_;
+
+// In a single-threaded program, do_init will be called exactly once.
+// In a multi-threaded program, do_init may be called simultaneously
+// by more then one thread. That should not be a problem.
+
+//..............................................................................
+
+template<class T, class U> void fp_traits_impl<T,U>::do_init_()
+{
+ T x = static_cast<T>(3) / static_cast<T>(4);
+ // sign bit = 0
+ // exponent: first and last bit = 0, all other bits = 1
+ // flag bit (if present) = 1
+ // mantissa: first bit = 1, all other bits = 0
+
+ uint32_t a;
+
+ for(size_t k = 0; k <= sizeof(T) - 4; ++k) {
+
+ memcpy(&a, reinterpret_cast<unsigned char*>(&x) + k, 4);
+
+ switch(a) {
+
+ case 0x3f400000: // IEEE single precision format
+
+ offset_ = k;
+ exponent = 0x7f800000;
+ flag = 0x00000000;
+ mantissa = 0x007fffff;
+ return;
+
+ case 0x3fe80000: // IEEE double precision format
+ // and PowerPC extended double precision format
+ offset_ = k;
+ exponent = 0x7ff00000;
+ flag = 0x00000000;
+ mantissa = 0x000fffff;
+ return;
+
+ case 0x3ffe0000: // Motorola extended double precision format
+
+ // Must not get here. Must be handled by specialization.
+ // To get accurate cutoff between normals and subnormals
+ // we must use the flag bit that is in the 5th byte.
+ // Otherwise this cutoff will be off by a factor 2.
+ // If we do get here, then we have failed to detect the Motorola
+ // processor at compile time.
+
+ BOOST_ASSERT(false &&
+ "Failed to detect the Motorola processor at compile time");
+ return;
+
+ case 0x3ffe8000: // IEEE extended double precision format
+ // with 15 exponent bits
+ offset_ = k;
+ exponent = 0x7fff0000;
+ flag = 0x00000000;
+ mantissa = 0x0000ffff;
+ return;
+
+ case 0x3ffec000: // Intel extended double precision format
+
+ offset_ = k;
+ exponent = 0x7fff0000;
+ flag = 0x00008000;
+ mantissa = 0x00007fff;
+ return;
+
+ default:
+ continue;
+ }
+ }
+
+ BOOST_ASSERT(false);
+
+ // Unknown format.
+}
+
+
+// float (32 bits) -------------------------------------------------------------
+
+template<> struct fp_traits_impl<float, single_precision_tag>
+{
+ typedef uint32_t bits;
+ typedef all_bits coverage;
+
+ BOOST_STATIC_CONSTANT(uint32_t, sign = 0x80000000);
+ BOOST_STATIC_CONSTANT(uint32_t, exponent = 0x7f800000);
+ BOOST_STATIC_CONSTANT(uint32_t, flag = 0x00000000);
+ BOOST_STATIC_CONSTANT(uint32_t, mantissa = 0x007fffff);
+
+ static void init() {}
+ static void get_bits(float x, uint32_t& a) { memcpy(&a, &x, 4); }
+ static void set_bits(float& x, uint32_t a) { memcpy(&x, &a, 4); }
+};
+
+
+// double (64 bits) ------------------------------------------------------------
+
+#if defined(BOOST_NO_INT64_T) || defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+
+template<> struct fp_traits_impl<double, double_precision_tag>
+{
+ typedef uint32_t bits;
+ typedef not_all_bits coverage;
+
+ BOOST_STATIC_CONSTANT(uint32_t, sign = 0x80000000);
+ BOOST_STATIC_CONSTANT(uint32_t, exponent = 0x7ff00000);
+ BOOST_STATIC_CONSTANT(uint32_t, flag = 0);
+ BOOST_STATIC_CONSTANT(uint32_t, mantissa = 0x000fffff);
+
+ static void init() {}
+
+ static void get_bits(double x, uint32_t& a)
+ {
+ memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+ }
+
+ static void set_bits(double& x, uint32_t a)
+ {
+ 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_impl<double, double_precision_tag>
+{
+ typedef uint64_t bits;
+ typedef all_bits coverage;
+
+ static const uint64_t sign = (uint64_t)0x80000000 << 32;
+ static const uint64_t exponent = (uint64_t)0x7ff00000 << 32;
+ static const uint64_t flag = 0;
+ static const uint64_t mantissa
+ = ((uint64_t)0x000fffff << 32) + (uint64_t)0xffffffff;
+
+ static void init() {}
+ static void get_bits(double x, uint64_t& a) { memcpy(&a, &x, 8); }
+ static void set_bits(double& x, uint64_t a) { memcpy(&x, &a, 8); }
+};
+
+#endif
+
+
+// long double (64 bits) -------------------------------------------------------
+
+#if defined(BOOST_NO_INT64_T) || defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+
+template<> struct fp_traits_impl<long double, double_precision_tag>
+{
+ typedef uint32_t bits;
+ typedef not_all_bits coverage;
+
+ BOOST_STATIC_CONSTANT(uint32_t, sign = 0x80000000);
+ BOOST_STATIC_CONSTANT(uint32_t, exponent = 0x7ff00000);
+ BOOST_STATIC_CONSTANT(uint32_t, flag = 0);
+ BOOST_STATIC_CONSTANT(uint32_t, mantissa = 0x000fffff);
+
+ static void init() {}
+
+ static void get_bits(long double x, uint32_t& a)
+ {
+ memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+ }
+
+ static void set_bits(long double& x, uint32_t a)
+ {
+ 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_impl<long double, double_precision_tag>
+{
+ typedef uint64_t bits;
+ typedef all_bits coverage;
+
+ static const uint64_t sign = (uint64_t)0x80000000 << 32;
+ static const uint64_t exponent = (uint64_t)0x7ff00000 << 32;
+ static const uint64_t flag = 0;
+ static const uint64_t mantissa
+ = ((uint64_t)0x000fffff << 32) + (uint64_t)0xffffffff;
+
+ static void init() {}
+ static void get_bits(long double x, uint64_t& a) { memcpy(&a, &x, 8); }
+ static void set_bits(long double& x, uint64_t a) { 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_impl<long double, extended_double_precision_tag>
+{
+ typedef uint32_t bits;
+ typedef not_all_bits coverage;
+
+ BOOST_STATIC_CONSTANT(uint32_t, sign = 0x80000000);
+ BOOST_STATIC_CONSTANT(uint32_t, exponent = 0x7fff0000);
+ BOOST_STATIC_CONSTANT(uint32_t, flag = 0x00008000);
+ BOOST_STATIC_CONSTANT(uint32_t, mantissa = 0x00007fff);
+
+ static void init() {}
+
+ static void get_bits(long double x, uint32_t& a)
+ {
+ memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + 6, 4);
+ }
+
+ static void set_bits(long double& x, uint32_t a)
+ {
+ 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 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).
+
+
+// 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_impl<long double, extended_double_precision_tag>
+{
+ typedef uint32_t bits;
+ typedef not_all_bits coverage;
+
+ BOOST_STATIC_CONSTANT(uint32_t, sign = 0x80000000);
+ BOOST_STATIC_CONSTANT(uint32_t, exponent = 0x7ff00000);
+ BOOST_STATIC_CONSTANT(uint32_t, flag = 0x00000000);
+ BOOST_STATIC_CONSTANT(uint32_t, mantissa = 0x000fffff);
+
+ static void init() {}
+
+ static void get_bits(long double x, uint32_t& a)
+ {
+ memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+ }
+
+ static void set_bits(long double& x, uint32_t a)
+ {
+ 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_impl<long double, extended_double_precision_tag>
+{
+ typedef uint32_t bits;
+ typedef not_all_bits coverage;
+
+ BOOST_STATIC_CONSTANT(uint32_t, sign = 0x80000000);
+ BOOST_STATIC_CONSTANT(uint32_t, exponent = 0x7fff0000);
+ BOOST_STATIC_CONSTANT(uint32_t, flag = 0x00008000);
+ BOOST_STATIC_CONSTANT(uint32_t, mantissa = 0x00007fff);
+
+ static void init() {}
+
+ // copy 1st, 2nd, 5th and 6th byte. 3rd and 4th byte are padding.
+
+ static void get_bits(long double x, uint32_t& a)
+ {
+ memcpy(&a, &x, 2);
+ 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)
+ {
+ memcpy(&x, &a, 2);
+ 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_impl<long double, extended_double_precision_tag>
+{
+ typedef uint32_t bits;
+ typedef not_all_bits coverage;
+
+ BOOST_STATIC_CONSTANT(uint32_t, sign = 0x80000000);
+ BOOST_STATIC_CONSTANT(uint32_t, exponent = 0x7fff0000);
+ BOOST_STATIC_CONSTANT(uint32_t, flag = 0x00000000);
+ BOOST_STATIC_CONSTANT(uint32_t, mantissa = 0x0000ffff);
+
+ static void init() {}
+
+ static void get_bits(long double x, uint32_t& a)
+ {
+ memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+ }
+
+ static void set_bits(long double& x, uint32_t a)
+ {
+ 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> struct size_to_precision;
+
+template<> struct size_to_precision<4>
+{
+ typedef single_precision_tag type;
+};
+
+template<> struct size_to_precision<8>
+{
+ typedef double_precision_tag type;
+};
+
+template<> struct size_to_precision<10>
+{
+ typedef extended_double_precision_tag type;
+};
+
+template<> struct size_to_precision<12>
+{
+ typedef extended_double_precision_tag type;
+};
+
+template<> struct size_to_precision<16>
+{
+ typedef extended_double_precision_tag type;
+};
+
+// fp_traits is a type switch that selects the right fp_traits_impl
+
+template<class T> struct fp_traits
+{
+ BOOST_STATIC_ASSERT(boost::is_floating_point<T>::value);
+ typedef BOOST_DEDUCED_TYPENAME size_to_precision<sizeof(T)>::type precision;
+ typedef fp_traits_impl<T, precision> type;
+};
+
+
+//------------------------------------------------------------------------------
+
+} // namespace detail
+} // namespace math
+} // namespace spirit
+} // namespace boost
+
+#endif
diff --git a/boost/spirit/home/support/detail/math/fpclassify.hpp b/boost/spirit/home/support/detail/math/fpclassify.hpp
new file mode 100644
index 0000000000..3659ec85ea
--- /dev/null
+++ b/boost/spirit/home/support/detail/math/fpclassify.hpp
@@ -0,0 +1,235 @@
+// fpclassify.hpp
+
+#ifndef BOOST_SPIRIT_MATH_FPCLASSIFY_HPP
+#define BOOST_SPIRIT_MATH_FPCLASSIFY_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)
+
+/*
+The following algorithm is used:
+
+ If all exponent bits, the flag bit (if there is one),
+ and all mantissa 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 mantissa bit is 1, then the number is subnormal.
+
+ If all exponent bits are 1 and all mantissa bits are 0,
+ then the number is infinity.
+
+ If all exponent bits are 1 and at least one mantissa bit is 1,
+ then the number is a not-a-number.
+
+ Otherwise the number is normal.
+
+(Note that the binary representation of infinity
+has flag bit 0 for Motorola 68K extended double precision,
+and flag bit 1 for Intel extended double precision.)
+
+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 mantissa bits.
+Some of the functions below have two implementations,
+depending on whether all the mantissa bits are copied or not.
+*/
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <cmath>
+
+#ifndef FP_INFINITE
+# define FP_INFINITE 0
+# define FP_NAN 1
+# define FP_NORMAL 2
+# define FP_SUBNORMAL 3
+# define FP_ZERO 4
+#endif
+
+#include <boost/spirit/home/support/detail/math/detail/fp_traits.hpp>
+
+namespace boost {
+namespace spirit {
+namespace math {
+
+//------------------------------------------------------------------------------
+
+template<class T> bool (isfinite)(T x)
+{
+ typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+ traits::init();
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= traits::exponent;
+ return a != traits::exponent;
+}
+
+//------------------------------------------------------------------------------
+
+template<class T> bool (isnormal)(T x)
+{
+ typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+ traits::init();
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= traits::exponent | traits::flag;
+ return (a != 0) && (a < traits::exponent);
+}
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+ template<class T> bool isinf_impl(T x, all_bits)
+ {
+ typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= traits::exponent | traits::mantissa;
+ return a == traits::exponent;
+ }
+
+ template<class T> bool isinf_impl(T x, not_all_bits)
+ {
+ typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= traits::exponent | traits::mantissa;
+ if(a != traits::exponent)
+ return false;
+
+ traits::set_bits(x,0);
+ return x == 0;
+ }
+
+} // namespace detail
+
+template<class T> bool (isinf)(T x)
+{
+ typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+ traits::init();
+ return detail::isinf_impl(x, BOOST_DEDUCED_TYPENAME traits::coverage());
+}
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+ template<class T> bool isnan_impl(T x, all_bits)
+ {
+ typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+ traits::init();
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= traits::exponent | traits::mantissa;
+ return a > traits::exponent;
+ }
+
+ template<class T> bool isnan_impl(T x, not_all_bits)
+ {
+ typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+ traits::init();
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+
+ a &= traits::exponent | traits::mantissa;
+ if(a < traits::exponent)
+ return false;
+
+ a &= traits::mantissa;
+ traits::set_bits(x,a);
+ return x != 0;
+ }
+
+} // namespace detail
+
+template<class T> bool (isnan)(T x)
+{
+ typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+ traits::init();
+ return detail::isnan_impl(x, BOOST_DEDUCED_TYPENAME traits::coverage());
+}
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+ template<class T> int fpclassify_impl(T x, all_bits)
+ {
+ typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= traits::exponent | traits::flag | traits::mantissa;
+
+ if(a <= traits::mantissa) {
+ if(a == 0)
+ return FP_ZERO;
+ else
+ return FP_SUBNORMAL;
+ }
+
+ if(a < traits::exponent)
+ return FP_NORMAL;
+
+ a &= traits::mantissa;
+ if(a == 0)
+ return FP_INFINITE;
+
+ return FP_NAN;
+ }
+
+ template<class T> int fpclassify_impl(T x, not_all_bits)
+ {
+ typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= traits::exponent | traits::flag | traits::mantissa;
+
+ if(a <= traits::mantissa) {
+ if(x == 0)
+ return FP_ZERO;
+ else
+ return FP_SUBNORMAL;
+ }
+
+ if(a < traits::exponent)
+ return FP_NORMAL;
+
+ a &= traits::mantissa;
+ traits::set_bits(x,a);
+ if(x == 0)
+ return FP_INFINITE;
+
+ return FP_NAN;
+ }
+
+} // namespace detail
+
+template<class T> int (fpclassify)(T x)
+{
+ typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+ traits::init();
+ return detail::fpclassify_impl(x, BOOST_DEDUCED_TYPENAME traits::coverage());
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace math
+} // namespace spirit
+} // namespace boost
+
+#endif
diff --git a/boost/spirit/home/support/detail/math/signbit.hpp b/boost/spirit/home/support/detail/math/signbit.hpp
new file mode 100644
index 0000000000..045fc3a8f0
--- /dev/null
+++ b/boost/spirit/home/support/detail/math/signbit.hpp
@@ -0,0 +1,92 @@
+// signbit.hpp
+
+#ifndef BOOST_SPIRIT_MATH_SIGNBIT_HPP
+#define BOOST_SPIRIT_MATH_SIGNBIT_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)
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/detail/math/detail/fp_traits.hpp>
+
+namespace boost {
+namespace spirit {
+namespace math {
+
+//------------------------------------------------------------------------------
+
+template<class T> bool (signbit)(T x)
+{
+ typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+ traits::init();
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= traits::sign;
+ return a != 0;
+}
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+ template<class T> T copysign_impl(T x, T y)
+ {
+ typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+ traits::init();
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a &= ~traits::sign;
+
+ BOOST_DEDUCED_TYPENAME traits::bits b;
+ traits::get_bits(y,b);
+ b &= traits::sign;
+
+ traits::set_bits(x,a|b);
+ return x;
+ }
+}
+
+inline float (copysign)(float x, float y) // magnitude of x and sign of y
+{
+ return detail::copysign_impl(x,y);
+}
+
+inline double (copysign)(double x, double y)
+{
+ return detail::copysign_impl(x,y);
+}
+
+inline long double (copysign)(long double x, long double y)
+{
+ return detail::copysign_impl(x,y);
+}
+
+//------------------------------------------------------------------------------
+
+template<class T> T (changesign)(T x)
+{
+ typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+ traits::init();
+
+ BOOST_DEDUCED_TYPENAME traits::bits a;
+ traits::get_bits(x,a);
+ a ^= traits::sign;
+ traits::set_bits(x,a);
+ return x;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace math
+} // namespace spirit
+} // namespace boost
+
+#endif
diff --git a/boost/spirit/home/support/detail/pow10.hpp b/boost/spirit/home/support/detail/pow10.hpp
new file mode 100644
index 0000000000..b49bb581fd
--- /dev/null
+++ b/boost/spirit/home/support/detail/pow10.hpp
@@ -0,0 +1,113 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(SPIRIT_POW10_DECEMBER_26_2008_1118AM)
+#define SPIRIT_POW10_DECEMBER_26_2008_1118AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/limits.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/numeric_traits.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4244) // conversion from 'double' to 'float', possible loss of data
+#endif
+
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename T, typename Enable/* = void*/>
+ struct pow10_helper
+ {
+ static T call(unsigned dim)
+ {
+ using namespace std; // allow for ADL to find the correct overload
+ return pow(T(10), T(dim));
+ }
+ };
+
+ template <>
+ struct pow10_helper<unused_type>
+ {
+ static unused_type call(unused_type)
+ {
+ return unused;
+ }
+ };
+
+#if (DBL_MAX_10_EXP == 308) // for IEEE-754
+ template <>
+ struct pow10_helper<double>
+ {
+ static double call(unsigned dim)
+ {
+ static double const exponents[] =
+ {
+ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
+ 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
+ 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29,
+ 1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39,
+ 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49,
+ 1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59,
+ 1e60, 1e61, 1e62, 1e63, 1e64, 1e65, 1e66, 1e67, 1e68, 1e69,
+ 1e70, 1e71, 1e72, 1e73, 1e74, 1e75, 1e76, 1e77, 1e78, 1e79,
+ 1e80, 1e81, 1e82, 1e83, 1e84, 1e85, 1e86, 1e87, 1e88, 1e89,
+ 1e90, 1e91, 1e92, 1e93, 1e94, 1e95, 1e96, 1e97, 1e98, 1e99,
+ 1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109,
+ 1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119,
+ 1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129,
+ 1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139,
+ 1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149,
+ 1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159,
+ 1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169,
+ 1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179,
+ 1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189,
+ 1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199,
+ 1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209,
+ 1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219,
+ 1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229,
+ 1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239,
+ 1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249,
+ 1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259,
+ 1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269,
+ 1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279,
+ 1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289,
+ 1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299,
+ 1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
+ };
+ BOOST_ASSERT(dim < sizeof(exponents)/sizeof(double));
+ return exponents[dim];
+ }
+ };
+
+ template <>
+ struct pow10_helper<float>
+ {
+ static float call(unsigned dim)
+ {
+ return pow10_helper<double>::call(dim);
+ }
+ };
+#endif // for IEEE-754
+
+ template <typename T>
+ inline T pow10(unsigned dim)
+ {
+ return pow10_helper<T>::call(dim);
+ }
+}}}
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/detail/scoped_enum_emulation.hpp b/boost/spirit/home/support/detail/scoped_enum_emulation.hpp
new file mode 100644
index 0000000000..70979a6d2d
--- /dev/null
+++ b/boost/spirit/home/support/detail/scoped_enum_emulation.hpp
@@ -0,0 +1,28 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// http://spirit.sourceforge.net/
+//
+// Distributed under the 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_SPIRIT_SCOPED_ENUM_EMULATION_HPP
+#define BOOST_SPIRIT_SCOPED_ENUM_EMULATION_HPP
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/version.hpp>
+#include <boost/config.hpp>
+
+#if BOOST_VERSION >= 104000
+# include <boost/detail/scoped_enum_emulation.hpp>
+#else
+# if !defined(BOOST_NO_SCOPED_ENUMS)
+# define BOOST_NO_SCOPED_ENUMS
+# endif
+# define BOOST_SCOPED_ENUM_START(name) struct name { enum enum_type
+# define BOOST_SCOPED_ENUM_END };
+# define BOOST_SCOPED_ENUM(name) name::enum_type
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/detail/sign.hpp b/boost/spirit/home/support/detail/sign.hpp
new file mode 100644
index 0000000000..7c1bfb06c7
--- /dev/null
+++ b/boost/spirit/home/support/detail/sign.hpp
@@ -0,0 +1,71 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(SPIRIT_SIGN_MAR_11_2009_0734PM)
+#define SPIRIT_SIGN_MAR_11_2009_0734PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104000
+#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
+#include <boost/spirit/home/support/detail/math/signbit.hpp>
+#else
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#endif
+
+namespace boost { namespace spirit { namespace detail
+{
+#if BOOST_VERSION < 104000
+ // signbit(-NAN) is broken for versions of Boost earlier than 1.40.0
+ // This routine has been taken and adapted from Johan Rade's fp_traits
+ // library
+ template<typename T>
+ inline bool (signbit)(T x)
+ {
+ return (boost::spirit::math::signbit)(x);
+ }
+
+ template<typename T>
+ inline T (changesign)(T x)
+ {
+ return (boost::spirit::math::changesign)(x);
+ }
+#else
+ template<typename T>
+ inline bool (signbit)(T x)
+ {
+ return (boost::math::signbit)(x) ? true : false;
+ }
+
+ // This routine has been taken and adapted from Johan Rade's fp_traits
+ // library
+ template<typename T>
+ inline T (changesign)(T x)
+ {
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && !defined(BOOST_MATH_DISABLE_STD_FPCLASSIFY)
+ return -x;
+#else
+ typedef typename math::detail::fp_traits<T>::type traits_type;
+
+ typename traits_type::bits a;
+ traits_type::get_bits(x, a);
+ a ^= traits_type::sign;
+ traits_type::set_bits(x, a);
+ return x;
+#endif
+ }
+#endif
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/detail/what_function.hpp b/boost/spirit/home/support/detail/what_function.hpp
new file mode 100644
index 0000000000..d9678ddca4
--- /dev/null
+++ b/boost/spirit/home/support/detail/what_function.hpp
@@ -0,0 +1,48 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_WHAT_FUNCTION_APRIL_22_2007_0236PM)
+#define SPIRIT_WHAT_FUNCTION_APRIL_22_2007_0236PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <string>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/detail/workaround.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ template <typename Context>
+ struct what_function
+ {
+ what_function(info& what, Context& context)
+ : what(what), context(context)
+ {
+ what.value = std::list<info>();
+ }
+
+ template <typename Component>
+ void operator()(Component const& component) const
+ {
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+ component; // suppresses warning: C4100: 'component' : unreferenced formal parameter
+#endif
+ boost::get<std::list<info> >(what.value).
+ push_back(component.what(context));
+ }
+
+ info& what;
+ Context& context;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ what_function& operator= (what_function const&);
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/extended_variant.hpp b/boost/spirit/home/support/extended_variant.hpp
new file mode 100644
index 0000000000..0a9613ba65
--- /dev/null
+++ b/boost/spirit/home/support/extended_variant.hpp
@@ -0,0 +1,115 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_EXTENDED_VARIANT_AUGUST_6_2011_0859AM)
+#define BOOST_SPIRIT_EXTENDED_VARIANT_AUGUST_6_2011_0859AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/variant.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ template <
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ BOOST_VARIANT_LIMIT_TYPES,
+ typename T, boost::detail::variant::void_)
+ // We should not be depending on detail::variant::void_
+ // but I'm not sure if this can fixed. Any other way is
+ // clumsy at best.
+ >
+ struct extended_variant
+ {
+ // tell spirit that this is an adapted variant
+ struct adapted_variant_tag;
+
+ typedef boost::variant<
+ BOOST_VARIANT_ENUM_PARAMS(T)>
+ variant_type;
+ typedef typename variant_type::types types;
+
+ typedef extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)> base_type;
+
+ extended_variant() : var() {}
+
+ template <typename T>
+ extended_variant(T const& var)
+ : var(var) {}
+
+ template <typename F>
+ typename F::result_type apply_visitor(F const& v)
+ {
+ return var.apply_visitor(v);
+ }
+
+ template <typename F>
+ typename F::result_type apply_visitor(F const& v) const
+ {
+ return var.apply_visitor(v);
+ }
+
+ template <typename F>
+ typename F::result_type apply_visitor(F& v)
+ {
+ return var.apply_visitor(v);
+ }
+
+ template <typename F>
+ typename F::result_type apply_visitor(F& v) const
+ {
+ return var.apply_visitor(v);
+ }
+
+ variant_type const& get() const
+ {
+ return var;
+ }
+
+ variant_type& get()
+ {
+ return var;
+ }
+
+ variant_type var;
+ };
+}}
+
+namespace boost
+{
+ template <typename T, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ inline T const&
+ get(boost::spirit::extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& x)
+ {
+ return boost::get<T>(x.get());
+ }
+
+ template <typename T, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ inline T&
+ get(boost::spirit::extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)>& x)
+ {
+ return boost::get<T>(x.get());
+ }
+
+ template <typename T, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ inline T const*
+ get(boost::spirit::extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)> const* x)
+ {
+ return boost::get<T>(&x->get());
+ }
+
+ template <typename T, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ inline T*
+ get(boost::spirit::extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)>* x)
+ {
+ return boost::get<T>(&x->get());
+ }
+}
+
+#endif
diff --git a/boost/spirit/home/support/handles_container.hpp b/boost/spirit/home/support/handles_container.hpp
new file mode 100644
index 0000000000..876c9a9217
--- /dev/null
+++ b/boost/spirit/home/support/handles_container.hpp
@@ -0,0 +1,55 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_HANDLES_CONTAINER_DEC_18_2010_0920AM)
+#define BOOST_SPIRIT_HANDLES_CONTAINER_DEC_18_2010_0920AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/find_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ // Finds out whether a component handles container attributes intrinsically
+ // (or whether container attributes need to be split up separately).
+ template <typename T, typename Attribute, typename Context
+ , typename Iterator, typename Enable>
+ struct handles_container : mpl::false_ {};
+
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct unary_handles_container
+ : handles_container<Subject, Attribute, Context, Iterator> {};
+
+ template <typename Left, typename Right, typename Attribute
+ , typename Context, typename Iterator>
+ struct binary_handles_container
+ : mpl::or_<
+ handles_container<Left, Attribute, Context, Iterator>
+ , handles_container<Right, Attribute, Context, Iterator> >
+ {};
+
+ template <typename Elements, typename Attribute, typename Context
+ , typename Iterator>
+ struct nary_handles_container
+ : mpl::not_<
+ is_same<
+ typename mpl::find_if<
+ Elements, handles_container<mpl::_, Attribute
+ , Context, Iterator>
+ >::type
+ , typename mpl::end<Elements>::type> >
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/has_semantic_action.hpp b/boost/spirit/home/support/has_semantic_action.hpp
new file mode 100644
index 0000000000..b4cb4e7c54
--- /dev/null
+++ b/boost/spirit/home/support/has_semantic_action.hpp
@@ -0,0 +1,47 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_HAS_SEMANTIC_ACTION_SEP_20_2009_0626PM)
+#define BOOST_SPIRIT_HAS_SEMANTIC_ACTION_SEP_20_2009_0626PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/find_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ // finding out, whether a component contains a semantic action
+ template <typename T, typename Enable = void>
+ struct has_semantic_action
+ : mpl::false_ {};
+
+ template <typename Subject>
+ struct unary_has_semantic_action
+ : has_semantic_action<Subject> {};
+
+ template <typename Left, typename Right>
+ struct binary_has_semantic_action
+ : mpl::or_<has_semantic_action<Left>, has_semantic_action<Right> > {};
+
+ template <typename Elements>
+ struct nary_has_semantic_action
+ : mpl::not_<
+ is_same<
+ typename mpl::find_if<
+ Elements, has_semantic_action<mpl::_>
+ >::type
+ , typename mpl::end<Elements>::type
+ >
+ > {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/info.hpp b/boost/spirit/home/support/info.hpp
new file mode 100644
index 0000000000..07018886b5
--- /dev/null
+++ b/boost/spirit/home/support/info.hpp
@@ -0,0 +1,159 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_INFO_NOVEMBER_22_2008_1132AM)
+#define BOOST_SPIRIT_INFO_NOVEMBER_22_2008_1132AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/variant/variant.hpp>
+#include <boost/variant/recursive_variant.hpp>
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/foreach.hpp>
+#include <boost/spirit/home/support/utf8.hpp>
+#include <list>
+#include <iterator>
+#include <utility>
+
+namespace boost { namespace spirit
+{
+ // info provides information about a component. Each component
+ // has a what member function that returns an info object.
+ // strings in the info object are assumed to be encoded as UTF8
+ // for uniformity.
+ struct info
+ {
+ struct nil {};
+
+ typedef
+ boost::variant<
+ nil
+ , utf8_string
+ , recursive_wrapper<info>
+ , recursive_wrapper<std::pair<info, info> >
+ , std::list<info>
+ >
+ value_type;
+
+ explicit info(utf8_string const& tag)
+ : tag(tag), value(nil()) {}
+
+ template <typename T>
+ info(utf8_string const& tag, T const& value)
+ : tag(tag), value(value) {}
+
+ info(utf8_string const& tag, char value)
+ : tag(tag), value(utf8_string(1, value)) {}
+
+ info(utf8_string const& tag, wchar_t value)
+ : tag(tag), value(to_utf8(value)) {}
+
+ info(utf8_string const& tag, ucs4_char value)
+ : tag(tag), value(to_utf8(value)) {}
+
+ template <typename Char>
+ info(utf8_string const& tag, Char const* str)
+ : tag(tag), value(to_utf8(str)) {}
+
+ template <typename Char, typename Traits, typename Allocator>
+ info(utf8_string const& tag
+ , std::basic_string<Char, Traits, Allocator> const& str)
+ : tag(tag), value(to_utf8(str)) {}
+
+ utf8_string tag;
+ value_type value;
+ };
+
+ template <typename Callback>
+ struct basic_info_walker
+ {
+ typedef void result_type;
+ typedef basic_info_walker<Callback> this_type;
+
+ basic_info_walker(Callback& callback, utf8_string const& tag, int depth)
+ : callback(callback), tag(tag), depth(depth) {}
+
+ void operator()(info::nil) const
+ {
+ callback.element(tag, "", depth);
+ }
+
+ void operator()(utf8_string const& str) const
+ {
+ callback.element(tag, str, depth);
+ }
+
+ void operator()(info const& what) const
+ {
+ boost::apply_visitor(
+ this_type(callback, what.tag, depth+1), what.value);
+ }
+
+ void operator()(std::pair<info, info> const& pair) const
+ {
+ callback.element(tag, "", depth);
+ boost::apply_visitor(
+ this_type(callback, pair.first.tag, depth+1), pair.first.value);
+ boost::apply_visitor(
+ this_type(callback, pair.second.tag, depth+1), pair.second.value);
+ }
+
+ void operator()(std::list<info> const& l) const
+ {
+ callback.element(tag, "", depth);
+ BOOST_FOREACH(info const& what, l)
+ {
+ boost::apply_visitor(
+ this_type(callback, what.tag, depth+1), what.value);
+ }
+ }
+
+ Callback& callback;
+ utf8_string const& tag;
+ int depth;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ basic_info_walker& operator= (basic_info_walker const&);
+ };
+
+ // bare-bones print support
+ template <typename Out>
+ struct simple_printer
+ {
+ typedef utf8_string string;
+
+ simple_printer(Out& out)
+ : out(out) {}
+
+ void element(string const& tag, string const& value, int /*depth*/) const
+ {
+ if (value == "")
+ out << '<' << tag << '>';
+ else
+ out << '"' << value << '"';
+ }
+
+ Out& out;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ simple_printer& operator= (simple_printer const&);
+ };
+
+ template <typename Out>
+ Out& operator<<(Out& out, info const& what)
+ {
+ simple_printer<Out> pr(out);
+ basic_info_walker<simple_printer<Out> > walker(pr, what.tag, 0);
+ boost::apply_visitor(walker, what.value);
+ return out;
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp b/boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp
new file mode 100644
index 0000000000..9df2d9c151
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp
@@ -0,0 +1,90 @@
+// Copyright (c) 2001, Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_BUF_ID_CHECK_POLICY_MAR_16_2007_1108AM)
+#define BOOST_SPIRIT_ITERATOR_BUF_ID_CHECK_POLICY_MAR_16_2007_1108AM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+#include <exception> // for std::exception
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // class illegal_backtracking
+ // thrown by buf_id_check CheckingPolicy if an instance of an iterator is
+ // used after another one has invalidated the queue
+ ///////////////////////////////////////////////////////////////////////////
+ class illegal_backtracking : public std::exception
+ {
+ public:
+ illegal_backtracking() throw() {}
+ ~illegal_backtracking() throw() {}
+
+ char const* what() const throw()
+ {
+ return "boost::spirit::multi_pass::illegal_backtracking";
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ // class buf_id_check
+ // Implementation of the CheckingPolicy used by multi_pass
+ // This policy is most effective when used together with the std_deque
+ // StoragePolicy.
+ //
+ // If used with the fixed_size_queue StoragePolicy, it will not detect
+ // iterator dereferences that are out of the range of the queue.
+ ///////////////////////////////////////////////////////////////////////////////
+ struct buf_id_check
+ {
+ ///////////////////////////////////////////////////////////////////////
+ struct unique //: detail::default_checking_policy
+ {
+ unique() : buf_id(0) {}
+ unique(unique const& x) : buf_id(x.buf_id) {}
+
+ void swap(unique& x)
+ {
+ boost::swap(buf_id, x.buf_id);
+ }
+
+ // called to verify that everything is ok.
+ template <typename MultiPass>
+ static void docheck(MultiPass const& mp)
+ {
+ if (mp.buf_id != mp.shared()->shared_buf_id)
+ boost::throw_exception(illegal_backtracking());
+ }
+
+ // called from multi_pass::clear_queue, so we can increment the count
+ template <typename MultiPass>
+ static void clear_queue(MultiPass& mp)
+ {
+ ++mp.shared()->shared_buf_id;
+ ++mp.buf_id;
+ }
+
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ protected:
+ unsigned long buf_id;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ struct shared
+ {
+ shared() : shared_buf_id(0) {}
+ unsigned long shared_buf_id;
+ };
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp b/boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp
new file mode 100644
index 0000000000..e70af081bc
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp
@@ -0,0 +1,130 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_BUFFERING_ITERATOR_INPUT_ITERATOR_POLICY_MAR_04_2010_1224AM)
+#define BOOST_SPIRIT_BUFFERING_ITERATOR_INPUT_ITERATOR_POLICY_MAR_04_2010_1224AM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+#include <boost/assert.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // class input_iterator
+ //
+ // Implementation of the InputPolicy used by multi_pass, this is different
+ // from the input_iterator policy only as it is buffering the last input
+ // character to allow returning it by reference. This is needed for
+ // wrapping iterators not buffering the last item (such as the
+ // std::istreambuf_iterator). Unfortunately there is no way to
+ // automatically figure this out at compile time.
+ //
+ // The buffering_input_iterator encapsulates an input iterator of type T
+ ///////////////////////////////////////////////////////////////////////////
+ struct buffering_input_iterator
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ class unique // : public detail::default_input_policy
+ {
+ private:
+ typedef
+ typename boost::detail::iterator_traits<T>::value_type
+ result_type;
+
+ public:
+ typedef
+ typename boost::detail::iterator_traits<T>::difference_type
+ difference_type;
+ typedef
+ typename boost::detail::iterator_traits<T>::difference_type
+ distance_type;
+ typedef
+ typename boost::detail::iterator_traits<T>::pointer
+ pointer;
+ typedef
+ typename boost::detail::iterator_traits<T>::reference
+ reference;
+ typedef result_type value_type;
+
+ protected:
+ unique() {}
+ explicit unique(T x) {}
+
+ void swap(unique&) {}
+
+ public:
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ template <typename MultiPass>
+ static typename MultiPass::reference get_input(MultiPass& mp)
+ {
+ return mp.shared()->get_input();
+ }
+
+ template <typename MultiPass>
+ static void advance_input(MultiPass& mp)
+ {
+ BOOST_ASSERT(0 != mp.shared());
+ mp.shared()->advance_input();
+ }
+
+ // test, whether we reached the end of the underlying stream
+ template <typename MultiPass>
+ static bool input_at_eof(MultiPass const& mp)
+ {
+ static T const end_iter;
+ return mp.shared()->input_ == end_iter;
+ }
+
+ template <typename MultiPass>
+ static bool input_is_valid(MultiPass const& mp, value_type const& t)
+ {
+ return mp.shared()->input_is_valid_;
+ }
+
+ // no unique data elements
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct shared
+ {
+ typedef
+ typename boost::detail::iterator_traits<T>::value_type
+ result_type;
+
+ explicit shared(T const& input)
+ : input_(input), curtok_(0), input_is_valid_(false) {}
+
+ void advance_input()
+ {
+ ++input_;
+ input_is_valid_ = false;
+ }
+
+ result_type& get_input()
+ {
+ if (!input_is_valid_) {
+ curtok_ = *input_;
+ input_is_valid_ = true;
+ }
+ return curtok_;
+ }
+
+ T input_;
+ result_type curtok_;
+ bool input_is_valid_;
+ };
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/combine_policies.hpp b/boost/spirit/home/support/iterators/detail/combine_policies.hpp
new file mode 100644
index 0000000000..cfac882084
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/combine_policies.hpp
@@ -0,0 +1,558 @@
+// Copyright (c) 2001-2012 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_COMBINE_POLICIES_APR_06_2008_0136PM)
+#define BOOST_SPIRIT_ITERATOR_COMBINE_POLICIES_APR_06_2008_0136PM
+
+#include <boost/config.hpp>
+#include <boost/type_traits/is_empty.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The purpose of the multi_pass_unique template is to eliminate
+ // empty policy classes (policies not containing any data items) from the
+ // multiple inheritance chain. This is necessary since some compilers
+ // fail to apply the empty base optimization if multiple inheritance is
+ // involved.
+ // Additionally this can be used to combine separate policies into one
+ // single multi_pass_policy as required by the multi_pass template
+ ///////////////////////////////////////////////////////////////////////////
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ // without partial template specialization there is nothing much to do in
+ // terms of empty base optimization anyways...
+ template <typename T, typename Ownership, typename Checking,
+ typename Input, typename Storage>
+ struct multi_pass_unique
+ : Ownership, Checking, Input, Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T& x) : Input(x) {}
+ multi_pass_unique(T const& x) : Input(x) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Ownership::destroy(mp);
+ Checking::destroy(mp);
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Ownership::swap(x);
+ this->Checking::swap(x);
+ this->Input::swap(x);
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+ };
+#else
+ ///////////////////////////////////////////////////////////////////////////
+ // select the correct derived classes based on if a policy is empty
+ template <typename T
+ , typename Ownership, typename Checking, typename Input, typename Storage
+ , bool OwnershipIsEmpty = boost::is_empty<Ownership>::value
+ , bool CheckingIsEmpty = boost::is_empty<Checking>::value
+ , bool InputIsEmpty = boost::is_empty<Input>::value>
+ struct multi_pass_unique;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Ownership, typename Checking
+ , typename Input, typename Storage>
+ struct multi_pass_unique<T, Ownership, Checking, Input, Storage
+ , false, false, false>
+ : Ownership, Checking, Input, Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T& x) : Input(x) {}
+ multi_pass_unique(T const& x) : Input(x) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Ownership::destroy(mp);
+ Checking::destroy(mp);
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Ownership::swap(x);
+ this->Checking::swap(x);
+ this->Input::swap(x);
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Ownership, typename Checking
+ , typename Input, typename Storage>
+ struct multi_pass_unique<T, Ownership, Checking, Input, Storage
+ , false, false, true>
+ : Ownership, Checking, Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T const&) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Ownership::destroy(mp);
+ Checking::destroy(mp);
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Ownership::swap(x);
+ this->Checking::swap(x);
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+
+ // implement input policy functions by forwarding to the Input type
+ template <typename MultiPass>
+ inline static void advance_input(MultiPass& mp)
+ { Input::advance_input(mp); }
+
+ template <typename MultiPass>
+ inline static typename MultiPass::reference get_input(MultiPass& mp)
+ { return Input::get_input(mp); }
+
+ template <typename MultiPass>
+ inline static bool input_at_eof(MultiPass const& mp)
+ { return Input::input_at_eof(mp); }
+
+ template <typename MultiPass, typename TokenType>
+ inline static bool input_is_valid(MultiPass& mp, TokenType& curtok)
+ { return Input::input_is_valid(mp, curtok); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Ownership, typename Checking
+ , typename Input, typename Storage>
+ struct multi_pass_unique<T, Ownership, Checking, Input, Storage
+ , false, true, false>
+ : Ownership, Input, Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T& x) : Input(x) {}
+ multi_pass_unique(T const& x) : Input(x) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Ownership::destroy(mp);
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Ownership::swap(x);
+ this->Input::swap(x);
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+
+ // checking policy functions are forwarded to the Checking type
+ template <typename MultiPass>
+ inline static void docheck(MultiPass const& mp)
+ { Checking::docheck(mp); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Ownership, typename Checking
+ , typename Input, typename Storage>
+ struct multi_pass_unique<T, Ownership, Checking, Input, Storage
+ , false, true, true>
+ : Ownership, Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T const&) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Ownership::destroy(mp);
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Ownership::swap(x);
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+
+ // implement input policy functions by forwarding to the Input type
+ template <typename MultiPass>
+ inline static void advance_input(MultiPass& mp)
+ { Input::advance_input(mp); }
+
+ template <typename MultiPass>
+ inline static typename MultiPass::reference get_input(MultiPass& mp)
+ { return Input::get_input(mp); }
+
+ template <typename MultiPass>
+ inline static bool input_at_eof(MultiPass const& mp)
+ { return Input::input_at_eof(mp); }
+
+ template <typename MultiPass, typename TokenType>
+ inline static bool input_is_valid(MultiPass& mp, TokenType& curtok)
+ { return Input::input_is_valid(mp, curtok); }
+
+ // checking policy functions are forwarded to the Checking type
+ template <typename MultiPass>
+ inline static void docheck(MultiPass const& mp)
+ { Checking::docheck(mp); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Ownership, typename Checking
+ , typename Input, typename Storage>
+ struct multi_pass_unique<T, Ownership, Checking, Input, Storage
+ , true, false, false>
+ : Checking, Input, Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T& x) : Input(x) {}
+ multi_pass_unique(T const& x) : Input(x) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Checking::destroy(mp);
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Checking::swap(x);
+ this->Input::swap(x);
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+
+ // ownership policy functions are forwarded to the Ownership type
+ template <typename MultiPass>
+ inline static void clone(MultiPass& mp)
+ { Ownership::clone(mp); }
+
+ template <typename MultiPass>
+ inline static bool release(MultiPass& mp)
+ { return Ownership::release(mp); }
+
+ template <typename MultiPass>
+ inline static bool is_unique(MultiPass const& mp)
+ { return Ownership::is_unique(mp); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Ownership, typename Checking
+ , typename Input, typename Storage>
+ struct multi_pass_unique<T, Ownership, Checking, Input, Storage
+ , true, false, true>
+ : Checking, Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T const&) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Checking::destroy(mp);
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Checking::swap(x);
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+
+ // implement input policy functions by forwarding to the Input type
+ template <typename MultiPass>
+ inline static void advance_input(MultiPass& mp)
+ { Input::advance_input(mp); }
+
+ template <typename MultiPass>
+ inline static typename MultiPass::reference get_input(MultiPass& mp)
+ { return Input::get_input(mp); }
+
+ template <typename MultiPass>
+ inline static bool input_at_eof(MultiPass const& mp)
+ { return Input::input_at_eof(mp); }
+
+ template <typename MultiPass, typename TokenType>
+ inline static bool input_is_valid(MultiPass& mp, TokenType& curtok)
+ { return Input::input_is_valid(mp, curtok); }
+
+ // ownership policy functions are forwarded to the Ownership type
+ template <typename MultiPass>
+ inline static void clone(MultiPass& mp)
+ { Ownership::clone(mp); }
+
+ template <typename MultiPass>
+ inline static bool release(MultiPass& mp)
+ { return Ownership::release(mp); }
+
+ template <typename MultiPass>
+ inline static bool is_unique(MultiPass const& mp)
+ { return Ownership::is_unique(mp); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Ownership, typename Checking
+ , typename Input, typename Storage>
+ struct multi_pass_unique<T, Ownership, Checking, Input, Storage
+ , true, true, false>
+ : Input, Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T& x) : Input(x) {}
+ multi_pass_unique(T const& x) : Input(x) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Input::swap(x);
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+
+ // checking policy functions are forwarded to the Checking type
+ template <typename MultiPass>
+ inline static void docheck(MultiPass const& mp)
+ { Checking::docheck(mp); }
+
+ // ownership policy functions are forwarded to the Ownership type
+ template <typename MultiPass>
+ inline static void clone(MultiPass& mp)
+ { Ownership::clone(mp); }
+
+ template <typename MultiPass>
+ inline static bool release(MultiPass& mp)
+ { return Ownership::release(mp); }
+
+ template <typename MultiPass>
+ inline static bool is_unique(MultiPass const& mp)
+ { return Ownership::is_unique(mp); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Ownership, typename Checking
+ , typename Input, typename Storage>
+ struct multi_pass_unique<T, Ownership, Checking, Input, Storage
+ , true, true, true>
+ : Storage
+ {
+ multi_pass_unique() {}
+ multi_pass_unique(T const&) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ Input::destroy(mp);
+ Storage::destroy(mp);
+ }
+
+ void swap(multi_pass_unique& x)
+ {
+ this->Storage::swap(x);
+ }
+
+ template <typename MultiPass>
+ inline static void clear_queue(MultiPass& mp)
+ {
+ Checking::clear_queue(mp);
+ Storage::clear_queue(mp);
+ }
+
+ // implement input policy functions by forwarding to the Input type
+ template <typename MultiPass>
+ inline static void advance_input(MultiPass& mp)
+ { Input::advance_input(mp); }
+
+ template <typename MultiPass>
+ inline static typename MultiPass::reference get_input(MultiPass& mp)
+ { return Input::get_input(mp); }
+
+ template <typename MultiPass>
+ inline static bool input_at_eof(MultiPass const& mp)
+ { return Input::input_at_eof(mp); }
+
+ template <typename MultiPass, typename TokenType>
+ inline static bool input_is_valid(MultiPass& mp, TokenType& curtok)
+ { return Input::input_is_valid(mp, curtok); }
+
+ // checking policy functions are forwarded to the Checking type
+ template <typename MultiPass>
+ inline static void docheck(MultiPass const& mp)
+ { Checking::docheck(mp); }
+
+ // ownership policy functions are forwarded to the Ownership type
+ template <typename MultiPass>
+ inline static void clone(MultiPass& mp)
+ { Ownership::clone(mp); }
+
+ template <typename MultiPass>
+ inline static bool release(MultiPass& mp)
+ { return Ownership::release(mp); }
+
+ template <typename MultiPass>
+ inline static bool is_unique(MultiPass const& mp)
+ { return Ownership::is_unique(mp); }
+ };
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // the multi_pass_shared structure is used to combine the shared data items
+ // of all policies into one single structure
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename T, typename Ownership, typename Checking, typename Input
+ , typename Storage>
+ struct multi_pass_shared : Ownership, Checking, Input, Storage
+ {
+ explicit multi_pass_shared(T& input) : Input(input) {}
+ explicit multi_pass_shared(T const& input) : Input(input) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // This is a default implementation of a policy class as required by the
+ // multi_pass template, combining 4 separate policies into one. Any other
+ // multi_pass policy class needs to follow the scheme as shown below.
+ template<typename Ownership, typename Checking, typename Input
+ , typename Storage>
+ struct default_policy
+ {
+ typedef Ownership ownership_policy;
+ typedef Checking checking_policy;
+ typedef Input input_policy;
+ typedef Storage storage_policy;
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct unique : multi_pass_unique<T
+ , typename Ownership::unique, typename Checking::unique
+ , typename Input::BOOST_NESTED_TEMPLATE unique<T>
+ , typename Storage::BOOST_NESTED_TEMPLATE unique<
+ typename Input::BOOST_NESTED_TEMPLATE unique<T>::value_type> >
+ {
+ typedef typename Ownership::unique ownership_policy;
+ typedef typename Checking::unique checking_policy;
+ typedef typename Input::BOOST_NESTED_TEMPLATE unique<T>
+ input_policy;
+ typedef typename Storage::BOOST_NESTED_TEMPLATE unique<
+ typename input_policy::value_type> storage_policy;
+
+ typedef multi_pass_unique<T, ownership_policy, checking_policy
+ , input_policy, storage_policy> unique_base_type;
+
+ unique() {}
+ explicit unique(T& input) : unique_base_type(input) {}
+ explicit unique(T const& input) : unique_base_type(input) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct shared : multi_pass_shared<T
+ , typename Ownership::shared, typename Checking::shared
+ , typename Input::BOOST_NESTED_TEMPLATE shared<T>
+ , typename Storage::BOOST_NESTED_TEMPLATE shared<
+ typename Input::BOOST_NESTED_TEMPLATE unique<T>::value_type> >
+ {
+ typedef typename Ownership::shared ownership_policy;
+ typedef typename Checking::shared checking_policy;
+ typedef typename Input::BOOST_NESTED_TEMPLATE shared<T>
+ input_policy;
+ typedef typename Storage::BOOST_NESTED_TEMPLATE shared<
+ typename Input::BOOST_NESTED_TEMPLATE unique<T>::value_type>
+ storage_policy;
+
+ typedef multi_pass_shared<T, ownership_policy, checking_policy
+ , input_policy, storage_policy> shared_base_type;
+
+ explicit shared(T& input)
+ : shared_base_type(input), inhibit_clear_queue_(false) {}
+ explicit shared(T const& input)
+ : shared_base_type(input), inhibit_clear_queue_(false) {}
+
+ // This is needed for the correct implementation of expectation
+ // points. Normally expectation points flush any multi_pass
+ // iterator they may act on, but if the corresponding error handler
+ // is of type 'retry' no flushing of the internal buffers should be
+ // executed (even if explicitly requested).
+ bool inhibit_clear_queue_;
+ };
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/first_owner_policy.hpp b/boost/spirit/home/support/iterators/detail/first_owner_policy.hpp
new file mode 100644
index 0000000000..73d6ee1a8e
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/first_owner_policy.hpp
@@ -0,0 +1,62 @@
+// Copyright (c) 2001, Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_FIRST_OWNER_POLICY_MAR_16_2007_1108AM)
+#define BOOST_SPIRIT_ITERATOR_FIRST_OWNER_POLICY_MAR_16_2007_1108AM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // class first_owner
+ // Implementation of an OwnershipPolicy used by multi_pass
+ // This ownership policy dictates that the first iterator created will
+ // determine the lifespan of the shared components. This works well for
+ // spirit, since no dynamic allocation of iterators is done, and all
+ // copies are make on the stack.
+ //
+ // There is a caveat about using this policy together with the std_deque
+ // StoragePolicy. Since first_owner always returns false from unique(),
+ // std_deque will only release the queued data if clear_queue() is called.
+ ///////////////////////////////////////////////////////////////////////////
+ struct first_owner
+ {
+ ///////////////////////////////////////////////////////////////////////
+ struct unique : detail::default_ownership_policy
+ {
+ unique() : first(true) {}
+ unique(unique const&) : first(false) {}
+
+ // return true to indicate deletion of resources
+ template <typename MultiPass>
+ static bool release(MultiPass& mp)
+ {
+ return mp.first;
+ }
+
+ // use swap from default policy
+ // if we're the first, we still remain the first, even if assigned
+ // to, so don't swap first. swap is only called from operator=
+
+ template <typename MultiPass>
+ static bool is_unique(MultiPass const&)
+ {
+ return false; // no way to know, so always return false
+ }
+
+ protected:
+ bool first;
+ };
+
+ ////////////////////////////////////////////////////////////////////////
+ struct shared {}; // no shared data
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/fixed_size_queue.hpp b/boost/spirit/home/support/iterators/detail/fixed_size_queue.hpp
new file mode 100644
index 0000000000..1ba6fc02b6
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/fixed_size_queue.hpp
@@ -0,0 +1,392 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_FIXED_SIZE_QUEUE_MAR_16_2007_1137AM)
+#define BOOST_SPIRIT_ITERATOR_FIXED_SIZE_QUEUE_MAR_16_2007_1137AM
+
+#include <cstdlib>
+#include <iterator>
+#include <cstddef>
+
+#include <boost/config.hpp>
+#include <boost/assert.hpp> // for BOOST_ASSERT
+#include <boost/iterator_adaptors.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// Make sure we're using a decent version of the Boost.IteratorAdaptors lib
+#if !defined(BOOST_ITERATOR_ADAPTORS_VERSION) || \
+ BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+#error "Please use at least Boost V1.31.0 while compiling the fixed_size_queue class!"
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#define BOOST_SPIRIT_ASSERT_FSQ_SIZE \
+ BOOST_ASSERT(((m_tail + N + 1) - m_head) % (N+1) == m_size % (N+1)) \
+ /**/
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Queue, typename T, typename Pointer>
+ class fsq_iterator
+ : public boost::iterator_facade<
+ fsq_iterator<Queue, T, Pointer>, T,
+ std::random_access_iterator_tag
+ >
+ {
+ public:
+ typedef typename Queue::position_type position_type;
+ typedef boost::iterator_facade<
+ fsq_iterator<Queue, T, Pointer>, T,
+ std::random_access_iterator_tag
+ > base_type;
+
+ fsq_iterator() {}
+ fsq_iterator(position_type const &p_) : p(p_) {}
+
+ position_type &get_position() { return p; }
+ position_type const &get_position() const { return p; }
+
+ private:
+ friend class boost::iterator_core_access;
+
+ typename base_type::reference dereference() const
+ {
+ return p.self->m_queue[p.pos];
+ }
+
+ void increment()
+ {
+ ++p.pos;
+ if (p.pos == Queue::MAX_SIZE+1)
+ p.pos = 0;
+ }
+
+ void decrement()
+ {
+ if (p.pos == 0)
+ p.pos = Queue::MAX_SIZE;
+ else
+ --p.pos;
+ }
+
+ bool is_eof() const
+ {
+ return p.self == 0 || p.pos == p.self->size();
+ }
+
+ template <typename Q, typename T_, typename P>
+ bool equal(fsq_iterator<Q, T_, P> const &x) const
+ {
+ if (is_eof())
+ return x.is_eof();
+ if (x.is_eof())
+ return false;
+
+ position_type const &rhs_pos = x.get_position();
+ return (p.self == rhs_pos.self) && (p.pos == rhs_pos.pos);
+ }
+
+ template <typename Q, typename T_, typename P>
+ typename base_type::difference_type distance_to(
+ fsq_iterator<Q, T_, P> const &x) const
+ {
+ typedef typename base_type::difference_type difference_type;
+
+ position_type const &p2 = x.get_position();
+ std::size_t pos1 = p.pos;
+ std::size_t pos2 = p2.pos;
+
+ // Undefined behavior if the iterators come from different
+ // containers
+ BOOST_ASSERT(p.self == p2.self);
+
+ if (pos1 < p.self->m_head)
+ pos1 += Queue::MAX_SIZE;
+ if (pos2 < p2.self->m_head)
+ pos2 += Queue::MAX_SIZE;
+
+ if (pos2 > pos1)
+ return difference_type(pos2 - pos1);
+ else
+ return -difference_type(pos1 - pos2);
+ }
+
+ void advance(typename base_type::difference_type n)
+ {
+ // Notice that we don't care values of n that can
+ // wrap around more than one time, since it would
+ // be undefined behavior anyway (going outside
+ // the begin/end range). Negative wrapping is a bit
+ // cumbersome because we don't want to case p.pos
+ // to signed.
+ if (n < 0)
+ {
+ n = -n;
+ if (p.pos < (std::size_t)n)
+ p.pos = Queue::MAX_SIZE+1 - (n - p.pos);
+ else
+ p.pos -= n;
+ }
+ else
+ {
+ p.pos += n;
+ if (p.pos >= Queue::MAX_SIZE+1)
+ p.pos -= Queue::MAX_SIZE+1;
+ }
+ }
+
+ private:
+ position_type p;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, std::size_t N>
+ class fixed_size_queue
+ {
+ private:
+ struct position
+ {
+ fixed_size_queue* self;
+ std::size_t pos;
+
+ position() : self(0), pos(0) {}
+
+ // The const_cast here is just to avoid to have two different
+ // position structures for the const and non-const case.
+ // The const semantic is guaranteed by the iterator itself
+ position(const fixed_size_queue* s, std::size_t p)
+ : self(const_cast<fixed_size_queue*>(s)), pos(p)
+ {}
+
+ bool is_initialized() const { return self != 0; }
+ void set_queue(fixed_size_queue* q) { self = q; }
+ };
+
+ public:
+ // Declare the iterators
+ typedef fsq_iterator<fixed_size_queue<T, N>, T, T*> iterator;
+ typedef
+ fsq_iterator<fixed_size_queue<T, N>, T const, T const*>
+ const_iterator;
+ typedef position position_type;
+
+ friend class fsq_iterator<fixed_size_queue<T, N>, T, T*>;
+ friend class fsq_iterator<fixed_size_queue<T, N>, T const, T const*>;
+
+ fixed_size_queue();
+ fixed_size_queue(const fixed_size_queue& x);
+ fixed_size_queue& operator=(const fixed_size_queue& x);
+ ~fixed_size_queue();
+
+ void push_back(const T& e);
+ void push_front(const T& e);
+ void serve(T& e);
+ void pop_front();
+
+ bool empty() const
+ {
+ return m_size == 0;
+ }
+
+ bool full() const
+ {
+ return m_size == N;
+ }
+
+ iterator begin()
+ {
+ return iterator(position(this, m_head));
+ }
+
+ const_iterator begin() const
+ {
+ return const_iterator(position(this, m_head));
+ }
+
+ iterator end()
+ {
+ return iterator(position(0, m_tail));
+ }
+
+ const_iterator end() const
+ {
+ return const_iterator(position(0, m_tail));
+ }
+
+ std::size_t size() const
+ {
+ return m_size;
+ }
+
+ T& front()
+ {
+ return m_queue[m_head];
+ }
+
+ const T& front() const
+ {
+ return m_queue[m_head];
+ }
+
+ private:
+ // Redefine the template parameters to avoid using partial template
+ // specialization on the iterator policy to extract N.
+ BOOST_STATIC_CONSTANT(std::size_t, MAX_SIZE = N);
+
+ std::size_t m_head;
+ std::size_t m_tail;
+ std::size_t m_size;
+ T m_queue[N+1];
+ };
+
+ template <typename T, std::size_t N>
+ inline
+ fixed_size_queue<T, N>::fixed_size_queue()
+ : m_head(0)
+ , m_tail(0)
+ , m_size(0)
+ {
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+ }
+
+ template <typename T, std::size_t N>
+ inline
+ fixed_size_queue<T, N>::fixed_size_queue(const fixed_size_queue& x)
+ : m_head(x.m_head)
+ , m_tail(x.m_tail)
+ , m_size(x.m_size)
+ {
+ copy(x.begin(), x.end(), begin());
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+ }
+
+ template <typename T, std::size_t N>
+ inline fixed_size_queue<T, N>&
+ fixed_size_queue<T, N>::operator=(const fixed_size_queue& x)
+ {
+ if (this != &x)
+ {
+ m_head = x.m_head;
+ m_tail = x.m_tail;
+ m_size = x.m_size;
+ copy(x.begin(), x.end(), begin());
+ }
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+
+ return *this;
+ }
+
+ template <typename T, std::size_t N>
+ inline
+ fixed_size_queue<T, N>::~fixed_size_queue()
+ {
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+ }
+
+ template <typename T, std::size_t N>
+ inline void
+ fixed_size_queue<T, N>::push_back(const T& e)
+ {
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+
+ BOOST_ASSERT(!full());
+
+ m_queue[m_tail] = e;
+ ++m_size;
+ ++m_tail;
+ if (m_tail == N+1)
+ m_tail = 0;
+
+
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+ }
+
+ template <typename T, std::size_t N>
+ inline void
+ fixed_size_queue<T, N>::push_front(const T& e)
+ {
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+
+ BOOST_ASSERT(!full());
+
+ if (m_head == 0)
+ m_head = N;
+ else
+ --m_head;
+
+ m_queue[m_head] = e;
+ ++m_size;
+
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+ }
+
+
+ template <typename T, std::size_t N>
+ inline void
+ fixed_size_queue<T, N>::serve(T& e)
+ {
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+
+ e = m_queue[m_head];
+ pop_front();
+ }
+
+
+
+ template <typename T, std::size_t N>
+ inline void
+ fixed_size_queue<T, N>::pop_front()
+ {
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+
+ ++m_head;
+ if (m_head == N+1)
+ m_head = 0;
+ --m_size;
+
+ BOOST_ASSERT(m_size <= N+1);
+ BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+ BOOST_ASSERT(m_head <= N+1);
+ BOOST_ASSERT(m_tail <= N+1);
+ }
+
+}}}
+
+#undef BOOST_SPIRIT_ASSERT_FSQ_SIZE
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp b/boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp
new file mode 100644
index 0000000000..283c7479d9
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp
@@ -0,0 +1,128 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_FIXED_SIZE_QUEUE_POLICY_MAR_16_2007_1134AM)
+#define BOOST_SPIRIT_ITERATOR_FIXED_SIZE_QUEUE_POLICY_MAR_16_2007_1134AM
+
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/spirit/home/support/iterators/detail/fixed_size_queue.hpp>
+#include <boost/assert.hpp>
+#include <cstdlib>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // class fixed_size_queue
+ // Implementation of the StoragePolicy used by multi_pass
+ // fixed_size_queue keeps a circular buffer (implemented by
+ // boost::spirit::fixed_size_queue class) that is size N+1 and stores N
+ // elements.
+ //
+ // It is up to the user to ensure that there is enough look ahead for
+ // their grammar. Currently there is no way to tell if an iterator is
+ // pointing to forgotten data. The leading iterator will put an item in
+ // the queue and remove one when it is incremented. No dynamic allocation
+ // is done, except on creation of the queue (fixed_size_queue constructor).
+ ///////////////////////////////////////////////////////////////////////////
+ template <std::size_t N>
+ struct fixed_size_queue
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Value>
+ class unique : public detail::default_storage_policy
+ {
+ private:
+ typedef detail::fixed_size_queue<Value, N> queue_type;
+
+ protected:
+ unique() {}
+
+ unique(unique const& x)
+ : queued_position(x.queued_position) {}
+
+ void swap(unique& x)
+ {
+ boost::swap(queued_position, x.queued_position);
+ }
+
+ // This is called when the iterator is dereferenced. It's a
+ // template method so we can recover the type of the multi_pass
+ // iterator and access the m_input data member.
+ template <typename MultiPass>
+ static typename MultiPass::reference
+ dereference(MultiPass const& mp)
+ {
+ if (!mp.queued_position.get_position().is_initialized())
+ mp.queued_position.get_position().set_queue(&mp.shared()->queued_elements);
+
+ if (mp.queued_position == mp.shared()->queued_elements.end())
+ return MultiPass::get_input(mp);
+
+ return *mp.queued_position;
+ }
+
+ // This is called when the iterator is incremented. It's a
+ // template method so we can recover the type of the multi_pass
+ // iterator and access the m_input data member.
+ template <typename MultiPass>
+ static void increment(MultiPass& mp)
+ {
+ if (!mp.queued_position.get_position().is_initialized())
+ mp.queued_position.get_position().set_queue(&mp.shared()->queued_elements);
+
+ if (mp.queued_position == mp.shared()->queued_elements.end())
+ {
+ // don't let the queue get larger than N
+ if (mp.shared()->queued_elements.size() >= N)
+ mp.shared()->queued_elements.pop_front();
+
+ mp.shared()->queued_elements.push_back(
+ MultiPass::get_input(mp));
+ MultiPass::advance_input(mp);
+ }
+ ++mp.queued_position;
+ }
+
+ // clear_queue is a no-op
+
+ // called to determine whether the iterator is an eof iterator
+ template <typename MultiPass>
+ static bool is_eof(MultiPass const& mp)
+ {
+ return mp.queued_position == mp.shared()->queued_elements.end() &&
+ MultiPass::input_at_eof(mp);
+ }
+
+ // called by operator==
+ template <typename MultiPass>
+ static bool equal_to(MultiPass const& mp, MultiPass const& x)
+ {
+ return mp.queued_position == x.queued_position;
+ }
+
+ // called by operator<
+ template <typename MultiPass>
+ static bool less_than(MultiPass const& mp, MultiPass const& x)
+ {
+ return mp.queued_position < x.queued_position;
+ }
+
+ protected:
+ mutable typename queue_type::iterator queued_position;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Value>
+ struct shared
+ {
+ typedef detail::fixed_size_queue<Value, N> queue_type;
+ queue_type queued_elements;
+ };
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/functor_input_policy.hpp b/boost/spirit/home/support/iterators/detail/functor_input_policy.hpp
new file mode 100644
index 0000000000..da59285ed4
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/functor_input_policy.hpp
@@ -0,0 +1,114 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_SPLIT_FUNCTOR_INPUT_POLICY_JAN_16_2008_0448M)
+#define BOOST_SPIRIT_ITERATOR_SPLIT_FUNCTOR_INPUT_POLICY_JAN_16_2008_0448M
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/assert.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ namespace is_valid_test_
+ {
+ template <typename Token>
+ inline bool token_is_valid(Token const&)
+ {
+ return true;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // class functor_input
+ // Implementation of the InputPolicy used by multi_pass
+ // functor_input gets tokens from a functor
+ //
+ // Note: the functor must have a typedef for result_type
+ // It also must have a static variable of type result_type defined
+ // to represent EOF that is called eof.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct functor_input
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Functor>
+ class unique : public detail::default_input_policy
+ {
+ private:
+ typedef typename Functor::result_type result_type;
+
+ protected:
+ unique() {}
+ explicit unique(Functor const& x) : ftor(x) {}
+
+ void swap(unique& x)
+ {
+ boost::swap(ftor, x.ftor);
+ }
+
+ public:
+ typedef result_type value_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef std::ptrdiff_t distance_type;
+ typedef result_type* pointer;
+ typedef result_type& reference;
+
+ public:
+ // get the next token
+ template <typename MultiPass>
+ static typename MultiPass::reference get_input(MultiPass& mp)
+ {
+ value_type& curtok = mp.shared()->curtok;
+ if (!input_is_valid(mp, curtok))
+ curtok = mp.ftor();
+ return curtok;
+ }
+
+ template <typename MultiPass>
+ static void advance_input(MultiPass& mp)
+ {
+ // if mp.shared is NULL then this instance of the multi_pass
+ // represents a end iterator
+ BOOST_ASSERT(0 != mp.shared());
+ mp.shared()->curtok = mp.ftor();
+ }
+
+ // test, whether we reached the end of the underlying stream
+ template <typename MultiPass>
+ static bool input_at_eof(MultiPass const& mp)
+ {
+ return mp.shared()->curtok == mp.ftor.eof;
+ }
+
+ template <typename MultiPass>
+ static bool input_is_valid(MultiPass const&, value_type const& t)
+ {
+ using namespace is_valid_test_;
+ return token_is_valid(t);
+ }
+
+ Functor& get_functor() const
+ {
+ return ftor;
+ }
+
+ protected:
+ mutable Functor ftor;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Functor>
+ struct shared
+ {
+ explicit shared(Functor const&) : curtok(0) {}
+
+ typename Functor::result_type curtok;
+ };
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp b/boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp
new file mode 100644
index 0000000000..f2e81e85ac
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp
@@ -0,0 +1,111 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_INPUT_ITERATOR_POLICY_MAR_16_2007_1156AM)
+#define BOOST_SPIRIT_ITERATOR_INPUT_ITERATOR_POLICY_MAR_16_2007_1156AM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+#include <boost/assert.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ namespace input_iterator_is_valid_test_
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Token>
+ inline bool token_is_valid(Token const& c)
+ {
+ return c ? true : false;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // class input_iterator
+ // Implementation of the InputPolicy used by multi_pass
+ //
+ // The input_iterator encapsulates an input iterator of type T
+ ///////////////////////////////////////////////////////////////////////////
+ struct input_iterator
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ class unique // : public detail::default_input_policy
+ {
+ private:
+ typedef
+ typename boost::detail::iterator_traits<T>::value_type
+ result_type;
+
+ public:
+ typedef
+ typename boost::detail::iterator_traits<T>::difference_type
+ difference_type;
+ typedef
+ typename boost::detail::iterator_traits<T>::difference_type
+ distance_type;
+ typedef
+ typename boost::detail::iterator_traits<T>::pointer
+ pointer;
+ typedef
+ typename boost::detail::iterator_traits<T>::reference
+ reference;
+ typedef result_type value_type;
+
+ protected:
+ unique() {}
+ explicit unique(T x) {}
+
+ void swap(unique&) {}
+
+ public:
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ template <typename MultiPass>
+ static typename MultiPass::reference get_input(MultiPass& mp)
+ {
+ return *mp.shared()->input_;
+ }
+
+ template <typename MultiPass>
+ static void advance_input(MultiPass& mp)
+ {
+ ++mp.shared()->input_;
+ }
+
+ // test, whether we reached the end of the underlying stream
+ template <typename MultiPass>
+ static bool input_at_eof(MultiPass const& mp)
+ {
+ static T const end_iter;
+ return mp.shared()->input_ == end_iter;
+ }
+
+ template <typename MultiPass>
+ static bool input_is_valid(MultiPass const& mp, value_type const& t)
+ {
+ using namespace input_iterator_is_valid_test_;
+ return token_is_valid(t);
+ }
+
+ // no unique data elements
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct shared
+ {
+ explicit shared(T const& input) : input_(input) {}
+
+ T input_;
+ };
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/istream_policy.hpp b/boost/spirit/home/support/iterators/detail/istream_policy.hpp
new file mode 100644
index 0000000000..0e5064a646
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/istream_policy.hpp
@@ -0,0 +1,124 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ISTREAM_POLICY_JAN_04_2010_0130PM)
+#define BOOST_SPIRIT_ISTREAM_POLICY_JAN_04_2010_0130PM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // class istream
+ // Implementation of the InputPolicy used by multi_pass
+ //
+ // The istream encapsulates an std::basic_istream
+ ///////////////////////////////////////////////////////////////////////////
+ struct istream
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ class unique // : public detail::default_input_policy
+ {
+ private:
+ typedef typename T::char_type result_type;
+
+ public:
+ typedef typename T::off_type difference_type;
+ typedef typename T::off_type distance_type;
+ typedef result_type const* pointer;
+ typedef result_type const& reference;
+ typedef result_type value_type;
+
+ protected:
+ unique() {}
+ explicit unique(T&) {}
+
+ void swap(unique&) {}
+
+ public:
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ template <typename MultiPass>
+ static typename MultiPass::reference get_input(MultiPass& mp)
+ {
+ if (!mp.shared()->initialized_)
+ mp.shared()->read_one();
+ return mp.shared()->curtok_;
+ }
+
+ template <typename MultiPass>
+ static void advance_input(MultiPass& mp)
+ {
+ // We invalidate the currently cached input character to avoid
+ // reading more input from the underlying iterator than
+ // required. Without this we would always read ahead one
+ // character, even if this character never gets consumed by the
+ // client.
+ mp.shared()->peek_one();
+ }
+
+ // test, whether we reached the end of the underlying stream
+ template <typename MultiPass>
+ static bool input_at_eof(MultiPass const& mp)
+ {
+ return mp.shared()->eof_reached_;
+ }
+
+ template <typename MultiPass>
+ static bool input_is_valid(MultiPass const& mp, value_type const&)
+ {
+ return mp.shared()->initialized_;
+ }
+
+ // no unique data elements
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct shared
+ {
+ private:
+ typedef typename T::char_type result_type;
+
+ public:
+ explicit shared(T& input)
+ : input_(input), curtok_(-1)
+ , initialized_(false), eof_reached_(false)
+ {
+ peek_one(); // istreams may be at eof right in the beginning
+ }
+
+ void read_one()
+ {
+ if (!(input_ >> curtok_)) {
+ initialized_ = false;
+ eof_reached_ = true;
+ }
+ else {
+ initialized_ = true;
+ }
+ }
+
+ void peek_one()
+ {
+ input_.peek(); // try for eof
+ initialized_ = false;
+ eof_reached_ = input_.eof();
+ }
+
+ T& input_;
+ result_type curtok_;
+ bool initialized_;
+ bool eof_reached_;
+ };
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/lex_input_policy.hpp b/boost/spirit/home/support/iterators/detail/lex_input_policy.hpp
new file mode 100644
index 0000000000..9fece3730d
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/lex_input_policy.hpp
@@ -0,0 +1,86 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_LEX_INPUT_POLICY_MAR_16_2007_1205PM)
+#define BOOST_SPIRIT_ITERATOR_LEX_INPUT_POLICY_MAR_16_2007_1205PM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////////
+ // class lex_input
+ // Implementation of the InputPolicy used by multi_pass
+ //
+ // The lex_input class gets tokens (integers) from yylex()
+ ///////////////////////////////////////////////////////////////////////////
+ struct lex_input
+ {
+ typedef int value_type;
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ class unique : public detail::default_input_policy
+ {
+ public:
+ typedef std::ptrdiff_t difference_type;
+ typedef std::ptrdiff_t distance_type;
+ typedef int* pointer;
+ typedef int& reference;
+
+ protected:
+ unique() {}
+ explicit unique(T) {}
+
+ public:
+ template <typename MultiPass>
+ static typename MultiPass::reference get_input(MultiPass& mp)
+ {
+ value_type& curtok = mp.shared()->curtok;
+ if (-1 == curtok)
+ {
+ extern int yylex();
+ curtok = yylex();
+ }
+ return curtok;
+ }
+
+ template <typename MultiPass>
+ static void advance_input(MultiPass& mp)
+ {
+ extern int yylex();
+ mp.shared()->curtok = yylex();
+ }
+
+ // test, whether we reached the end of the underlying stream
+ template <typename MultiPass>
+ static bool input_at_eof(MultiPass const& mp)
+ {
+ return mp.shared()->curtok == 0;
+ }
+
+ template <typename MultiPass>
+ static bool input_is_valid(MultiPass const&, value_type const& t)
+ {
+ return -1 != t;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct shared
+ {
+ explicit shared(T) : curtok(-1) {}
+
+ value_type curtok;
+ };
+ };
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/iterators/detail/multi_pass.hpp b/boost/spirit/home/support/iterators/detail/multi_pass.hpp
new file mode 100644
index 0000000000..088b39ae42
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/multi_pass.hpp
@@ -0,0 +1,132 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_MULTI_PASS_MAR_16_2007_1122AM)
+#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_MAR_16_2007_1122AM
+
+#include <boost/config.hpp>
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/iterator.hpp>
+#include <boost/mpl/bool.hpp>
+#include <iterator>
+#include <algorithm>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace detail
+{
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ ///////////////////////////////////////////////////////////////////////////
+ // Meta-function to generate a std::iterator<> base class for multi_pass.
+ // This is used mainly to improve conformance of compilers not supporting
+ // PTS and thus relying on inheritance to recognize an iterator.
+ //
+ // We are using boost::iterator<> because it offers an automatic
+ // workaround for broken std::iterator<> implementations.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename InputPolicy>
+ struct iterator_base_creator
+ {
+ typedef typename InputPolicy::BOOST_NESTED_TEMPLATE unique<T> input_type;
+
+ typedef boost::iterator <
+ std::forward_iterator_tag
+ , typename input_type::value_type
+ , typename input_type::difference_type
+ , typename input_type::pointer
+ , typename input_type::reference
+ > type;
+ };
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Default implementations of the different policies to be used with a
+ // multi_pass iterator
+ ///////////////////////////////////////////////////////////////////////////
+ struct default_input_policy
+ {
+ default_input_policy() {}
+
+ template <typename Functor>
+ default_input_policy(Functor const&) {}
+
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ void swap(default_input_policy&) {}
+
+ template <typename MultiPass, typename TokenType>
+ static void advance_input(MultiPass& mp);
+
+ template <typename MultiPass>
+ static typename MultiPass::reference get_input(MultiPass& mp);
+
+ template <typename MultiPass>
+ static bool input_at_eof(MultiPass const& mp);
+
+ template <typename MultiPass, typename TokenType>
+ static bool input_is_valid(MultiPass& mp, TokenType& curtok);
+ };
+
+ struct default_ownership_policy
+ {
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ void swap(default_ownership_policy&) {}
+
+ template <typename MultiPass>
+ static void clone(MultiPass&) {}
+
+ template <typename MultiPass>
+ static bool release(MultiPass& mp);
+
+ template <typename MultiPass>
+ static bool is_unique(MultiPass const& mp);
+ };
+
+ struct default_storage_policy
+ {
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ void swap(default_storage_policy&) {}
+
+ template <typename MultiPass>
+ static typename MultiPass::reference dereference(MultiPass const& mp);
+
+ template <typename MultiPass>
+ static void increment(MultiPass&) {}
+
+ template <typename MultiPass>
+ static void clear_queue(MultiPass&) {}
+
+ template <typename MultiPass>
+ static bool is_eof(MultiPass const& mp);
+
+ template <typename MultiPass>
+ static bool equal_to(MultiPass const& mp, MultiPass const& x);
+
+ template <typename MultiPass>
+ static bool less_than(MultiPass const& mp, MultiPass const& x);
+ };
+
+ struct default_checking_policy
+ {
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ void swap(default_checking_policy&) {}
+
+ template <typename MultiPass>
+ static void docheck(MultiPass const&) {}
+
+ template <typename MultiPass>
+ static void clear_queue(MultiPass&) {}
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/no_check_policy.hpp b/boost/spirit/home/support/iterators/detail/no_check_policy.hpp
new file mode 100644
index 0000000000..8f4a26d9c3
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/no_check_policy.hpp
@@ -0,0 +1,31 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_NO_CHECK_POLICY_MAR_16_2007_1121AM)
+#define BOOST_SPIRIT_ITERATOR_NO_CHECK_POLICY_MAR_16_2007_1121AM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // class no_check
+ // Implementation of the CheckingPolicy used by multi_pass
+ // It does not do anything :-)
+ ///////////////////////////////////////////////////////////////////////////
+ struct no_check
+ {
+ ///////////////////////////////////////////////////////////////////////
+ struct unique : public detail::default_checking_policy {};
+
+ ///////////////////////////////////////////////////////////////////////
+ struct shared {};
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp b/boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp
new file mode 100644
index 0000000000..723bbee458
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp
@@ -0,0 +1,79 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_REF_COUNTED_POLICY_MAR_16_2007_1108AM)
+#define BOOST_SPIRIT_ITERATOR_REF_COUNTED_POLICY_MAR_16_2007_1108AM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#if defined(BOOST_HAS_THREADS)
+#include <boost/detail/atomic_count.hpp>
+#endif
+#include <cstdlib>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // class ref_counted
+ // Implementation of an OwnershipPolicy used by multi_pass.
+ //
+ // Implementation modified from RefCounted class from the Loki library by
+ // Andrei Alexandrescu.
+ ///////////////////////////////////////////////////////////////////////////
+ struct ref_counted
+ {
+ ///////////////////////////////////////////////////////////////////////
+ struct unique // : detail::default_ownership_policy
+ {
+ void swap(unique&) {}
+
+ // clone is called when a copy of the iterator is made, so
+ // increment the ref-count.
+ template <typename MultiPass>
+ static void clone(MultiPass& mp)
+ {
+ if (0 != mp.shared())
+ ++mp.shared()->count;
+ }
+
+ // called when a copy is deleted. Decrement the ref-count. Return
+ // value of true indicates that the last copy has been released.
+ template <typename MultiPass>
+ static bool release(MultiPass& mp)
+ {
+ return 0 != mp.shared() && 0 == --mp.shared()->count;
+ }
+
+ // returns true if there is only one iterator in existence.
+ // std_deque StoragePolicy will free it's buffered data if this
+ // returns true.
+ template <typename MultiPass>
+ static bool is_unique(MultiPass const& mp)
+ {
+ return 0 == mp.shared() || 1 == mp.shared()->count;
+ }
+
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+ };
+
+ ////////////////////////////////////////////////////////////////////////
+ struct shared
+ {
+ shared() : count(1) {}
+
+#if defined(BOOST_HAS_THREADS)
+ boost::detail::atomic_count count;
+#else
+ std::size_t count;
+#endif
+ };
+
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp b/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp
new file mode 100644
index 0000000000..711ae90394
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp
@@ -0,0 +1,201 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_SPLIT_FUNCTOR_INPUT_POLICY_JAN_17_2008_0103PM)
+#define BOOST_SPIRIT_ITERATOR_SPLIT_FUNCTOR_INPUT_POLICY_JAN_17_2008_0103PM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/assert.hpp>
+#include <boost/type_traits/is_empty.hpp>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ namespace split_functor_input_is_valid_test_
+ {
+ template <typename Token>
+ inline bool token_is_valid(Token const&)
+ {
+ return true;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // class split_functor_input
+ // Implementation of the InputPolicy used by multi_pass
+ // split_functor_input gets tokens from a functor
+ //
+ // This policy should be used when the functor holds two parts of data: a
+ // unique part (unique for each instance of the iterator) and a shared
+ // part (to be shared between the different copies of the same iterator).
+ // Using this policy allows to merge the shared part of the functor with
+ // the shared part of the iterator data, saving one pointer and one
+ // allocation per iterator instance.
+ //
+ // The Functor template parameter of this policy is expected to be a
+ // std::pair<unique, shared>, where 'unique' and 'shared' represent the
+ // respective parts of the functor itself.
+ //
+ // Note: the unique part of the functor must have a typedef for result_type
+ // It also must have a static variable of type result_type defined
+ // to represent EOF that is called eof.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct split_functor_input
+ {
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Functor
+ , bool FunctorIsEmpty = is_empty<typename Functor::first_type>::value>
+ class unique;
+
+ // the unique part of the functor is empty, do not include the functor
+ // as a member at all to avoid unnecessary padding bytes to be included
+ // into the generated structure
+ template <typename Functor>
+ class unique<Functor, true> // : public detail::default_input_policy
+ {
+ protected:
+ typedef typename Functor::first_type functor_type;
+ typedef typename functor_type::result_type result_type;
+
+ public:
+ typedef result_type value_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef std::ptrdiff_t distance_type;
+ typedef result_type const* pointer;
+ typedef result_type const& reference;
+
+ protected:
+ unique() {}
+ explicit unique(Functor const&) {}
+
+ public:
+ void swap(unique&) {}
+
+ // get the next token
+ template <typename MultiPass>
+ static typename MultiPass::reference get_input(MultiPass& mp)
+ {
+ value_type& curtok = mp.shared()->curtok;
+ using namespace split_functor_input_is_valid_test_;
+ if (!token_is_valid(curtok))
+ functor_type::get_next(mp, curtok);
+ return curtok;
+ }
+
+ template <typename MultiPass>
+ static void advance_input(MultiPass& mp)
+ {
+ functor_type::get_next(mp, mp.shared()->curtok);
+ }
+
+ // test, whether we reached the end of the underlying stream
+ template <typename MultiPass>
+ static bool input_at_eof(MultiPass const& mp)
+ {
+ return mp.shared()->curtok == functor_type::eof;
+ }
+
+ template <typename MultiPass>
+ static bool input_is_valid(MultiPass const&, value_type const& t)
+ {
+ using namespace split_functor_input_is_valid_test_;
+ return token_is_valid(t);
+ }
+
+ template <typename MultiPass>
+ static void destroy(MultiPass& mp)
+ {
+ functor_type::destroy(mp);
+ }
+ };
+
+ // the unique part of the functor is non-empty
+ template <typename Functor>
+ class unique<Functor, false> : public unique<Functor, true>
+ {
+ protected:
+ typedef typename Functor::first_type functor_type;
+ typedef typename functor_type::result_type result_type;
+
+ protected:
+ unique() {}
+ explicit unique(Functor const& x) : ftor(x.first) {}
+
+ void swap(unique& x)
+ {
+ boost::swap(ftor, x.ftor);
+ }
+
+ public:
+ typedef result_type value_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef std::ptrdiff_t distance_type;
+ typedef result_type const* pointer;
+ typedef result_type const& reference;
+
+ public:
+ // get the next token
+ template <typename MultiPass>
+ static typename MultiPass::reference get_input(MultiPass& mp)
+ {
+ value_type& curtok = mp.shared()->curtok;
+ using namespace split_functor_input_is_valid_test_;
+ if (!token_is_valid(curtok))
+ functor_type::get_next(mp, curtok);
+ return curtok;
+ }
+
+ template <typename MultiPass>
+ static void advance_input(MultiPass& mp)
+ {
+ mp.ftor.get_next(mp, mp.shared()->curtok);
+ }
+
+ template <typename MultiPass>
+ static bool input_is_valid(MultiPass const&, value_type const& t)
+ {
+ using namespace split_functor_input_is_valid_test_;
+ return token_is_valid(t);
+ }
+
+ // test, whether we reached the end of the underlying stream
+ template <typename MultiPass>
+ static bool input_at_eof(MultiPass const& mp)
+ {
+ return mp.shared()->curtok == mp.ftor.eof;
+ }
+
+ typename Functor::first_type& get_functor() const
+ {
+ return ftor;
+ }
+
+ mutable functor_type ftor;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Functor>
+ struct shared
+ {
+ protected:
+ typedef typename Functor::first_type functor_type;
+ typedef typename functor_type::result_type result_type;
+
+ public:
+ explicit shared(Functor const& x) : ftor(x.second), curtok(0) {}
+
+ mutable typename Functor::second_type ftor;
+ result_type curtok;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ shared& operator= (shared const&);
+ };
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp b/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp
new file mode 100644
index 0000000000..402956b87d
--- /dev/null
+++ b/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp
@@ -0,0 +1,170 @@
+// Copyright (c) 2001 Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_SPLIT_DEQUE_POLICY_APR_06_2008_0138PM)
+#define BOOST_SPIRIT_ITERATOR_SPLIT_DEQUE_POLICY_APR_06_2008_0138PM
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/assert.hpp>
+#include <vector>
+
+namespace boost { namespace spirit { namespace iterator_policies
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // class split_std_deque
+ //
+ // Implementation of the StoragePolicy used by multi_pass
+ // This stores all data in a std::vector (despite its name), and keeps an
+ // offset to the current position. It stores all the data unless there is
+ // only one iterator using the queue.
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ struct split_std_deque
+ {
+ enum { threshold = 16 };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Value>
+ class unique //: public detail::default_storage_policy
+ {
+ private:
+ typedef std::vector<Value> queue_type;
+
+ protected:
+ unique() : queued_position(0) {}
+
+ unique(unique const& x)
+ : queued_position(x.queued_position) {}
+
+ void swap(unique& x)
+ {
+ boost::swap(queued_position, x.queued_position);
+ }
+
+ // This is called when the iterator is dereferenced. It's a
+ // template method so we can recover the type of the multi_pass
+ // iterator and call advance_input and input_is_valid.
+ template <typename MultiPass>
+ static typename MultiPass::reference
+ dereference(MultiPass const& mp)
+ {
+ queue_type& queue = mp.shared()->queued_elements;
+ typename queue_type::size_type size = queue.size();
+
+ BOOST_ASSERT(mp.queued_position <= size);
+
+ if (mp.queued_position == size)
+ {
+ // check if this is the only iterator
+ if (size >= threshold && MultiPass::is_unique(mp))
+ {
+ // free up the memory used by the queue.
+ queue.clear();
+ mp.queued_position = 0;
+ }
+ return MultiPass::get_input(mp);
+ }
+
+ return queue[mp.queued_position];
+ }
+
+ // This is called when the iterator is incremented. It's a template
+ // method so we can recover the type of the multi_pass iterator
+ // and call is_unique and advance_input.
+ template <typename MultiPass>
+ static void increment(MultiPass& mp)
+ {
+ queue_type& queue = mp.shared()->queued_elements;
+ typename queue_type::size_type size = queue.size();
+
+ BOOST_ASSERT(mp.queued_position <= size);
+
+// // do not increment iterator as long as the current token is
+// // invalid
+// if (size > 0 && !MultiPass::input_is_valid(mp, queue[mp.queued_position-1]))
+// return;
+
+ if (mp.queued_position == size)
+ {
+ // check if this is the only iterator
+ if (size >= threshold && MultiPass::is_unique(mp))
+ {
+ // free up the memory used by the queue. we avoid
+ // clearing the queue on every increment, though,
+ // because this would be too time consuming
+ queue.clear();
+ mp.queued_position = 0;
+ }
+ else
+ {
+ queue.push_back(MultiPass::get_input(mp));
+ ++mp.queued_position;
+ }
+ MultiPass::advance_input(mp);
+ }
+ else
+ {
+ ++mp.queued_position;
+ }
+ }
+
+ // called to forcibly clear the queue
+ template <typename MultiPass>
+ static void clear_queue(MultiPass& mp)
+ {
+ mp.shared()->queued_elements.clear();
+ mp.queued_position = 0;
+ }
+
+ // called to determine whether the iterator is an eof iterator
+ template <typename MultiPass>
+ static bool is_eof(MultiPass const& mp)
+ {
+ return mp.queued_position == mp.shared()->queued_elements.size()
+ && MultiPass::input_at_eof(mp);
+ }
+
+ // called by operator==
+ template <typename MultiPass>
+ static bool equal_to(MultiPass const& mp, MultiPass const& x)
+ {
+ return mp.queued_position == x.queued_position;
+ }
+
+ // called by operator<
+ template <typename MultiPass>
+ static bool less_than(MultiPass const& mp, MultiPass const& x)
+ {
+ return mp.queued_position < x.queued_position;
+ }
+
+ template <typename MultiPass>
+ static void destroy(MultiPass&) {}
+
+ protected:
+ mutable typename queue_type::size_type queued_position;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename Value>
+ struct shared
+ {
+ shared()
+ {
+ queued_elements.reserve(threshold);
+ }
+
+ typedef std::vector<Value> queue_type;
+ queue_type queued_elements;
+ };
+
+ }; // split_std_deque
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/iterators/istream_iterator.hpp b/boost/spirit/home/support/iterators/istream_iterator.hpp
new file mode 100644
index 0000000000..b232be50b7
--- /dev/null
+++ b/boost/spirit/home/support/iterators/istream_iterator.hpp
@@ -0,0 +1,80 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ISTREAM_ITERATOR_JAN_03_2010_0522PM)
+#define BOOST_SPIRIT_ISTREAM_ITERATOR_JAN_03_2010_0522PM
+
+#include <boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp>
+#if defined(BOOST_SPIRIT_DEBUG)
+#include <boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp>
+#else
+#include <boost/spirit/home/support/iterators/detail/no_check_policy.hpp>
+#endif
+#include <boost/spirit/home/support/iterators/detail/istream_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/combine_policies.hpp>
+#include <boost/spirit/home/support/iterators/multi_pass.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elem, typename Traits = std::char_traits<Elem> >
+ class basic_istream_iterator :
+ public multi_pass<
+ std::basic_istream<Elem, Traits>
+ , iterator_policies::default_policy<
+ iterator_policies::ref_counted
+#if defined(BOOST_SPIRIT_DEBUG)
+ , iterator_policies::buf_id_check
+#else
+ , iterator_policies::no_check
+#endif
+ , iterator_policies::istream
+ , iterator_policies::split_std_deque>
+ >
+ {
+ private:
+ typedef multi_pass<
+ std::basic_istream<Elem, Traits>
+ , iterator_policies::default_policy<
+ iterator_policies::ref_counted
+#if defined(BOOST_SPIRIT_DEBUG)
+ , iterator_policies::buf_id_check
+#else
+ , iterator_policies::no_check
+#endif
+ , iterator_policies::istream
+ , iterator_policies::split_std_deque>
+ > base_type;
+
+ public:
+ basic_istream_iterator()
+ : base_type() {}
+
+ explicit basic_istream_iterator(std::basic_istream<Elem, Traits>& x)
+ : base_type(x) {}
+
+ basic_istream_iterator(basic_istream_iterator const& x)
+ : base_type(x) {}
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+ basic_istream_iterator(int) // workaround for a bug in the library
+ : base_type() {} // shipped with gcc 3.1
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+ basic_istream_iterator operator= (base_type const& rhs)
+ {
+ this->base_type::operator=(rhs);
+ return *this;
+ }
+
+ // default generated operators, destructor and assignment operator are ok.
+ };
+
+ typedef basic_istream_iterator<char> istream_iterator;
+
+}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/line_pos_iterator.hpp b/boost/spirit/home/support/iterators/line_pos_iterator.hpp
new file mode 100644
index 0000000000..0b2aec8ce9
--- /dev/null
+++ b/boost/spirit/home/support/iterators/line_pos_iterator.hpp
@@ -0,0 +1,180 @@
+/*==============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ 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)
+==============================================================================*/
+
+#if !defined(BOOST_SPIRIT_SUPPORT_LINE_POS_ITERATOR)
+#define BOOST_SPIRIT_SUPPORT_LINE_POS_ITERATOR
+
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/range/iterator_range.hpp>
+
+namespace boost { namespace spirit
+{
+ //[line_pos_iterator_class
+ /*`The `line_pos_iterator` is a lightweight line position iterator.
+ This iterator adapter only stores the current line number, nothing else.
+ Unlike __classic__'s `position_iterator`, it does not store the
+ column number and does not need an end iterator. The current column can
+ be computed, if needed. */
+ //`[heading Class Reference]
+ template <class Iterator>
+ class line_pos_iterator : public boost::iterator_adaptor<
+ line_pos_iterator<Iterator> // Derived
+ , Iterator // Base
+ , boost::use_default // Value
+ , boost::forward_traversal_tag // CategoryOrTraversal
+ > {
+ public:
+ line_pos_iterator();
+
+ explicit line_pos_iterator(Iterator);
+
+ std::size_t position() const;
+
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment();
+
+ std::size_t line; // The line position.
+ typename std::iterator_traits<Iterator>::value_type prev;
+ };
+ //]
+
+ template <class Iterator>
+ line_pos_iterator<Iterator>::line_pos_iterator() :
+ line_pos_iterator::iterator_adaptor_(), line(1), prev(0) { }
+
+ template <class Iterator>
+ line_pos_iterator<Iterator>::line_pos_iterator(Iterator base) :
+ line_pos_iterator::iterator_adaptor_(base), line(1), prev(0) { }
+
+ template <class Iterator>
+ std::size_t line_pos_iterator<Iterator>::position() const
+ {
+ return line;
+ }
+
+ template<class Iterator>
+ void line_pos_iterator<Iterator>::increment()
+ {
+ typename std::iterator_traits<Iterator>::reference
+ ref = *(this->base());
+
+ switch (ref) {
+ case '\r':
+ if (prev != '\n')
+ ++line;
+ break;
+ case '\n':
+ if (prev != '\r')
+ ++line;
+ break;
+ default:
+ break;
+ }
+
+ prev = ref;
+ ++this->base_reference();
+ }
+
+ //[line_pos_iterator_utilities
+ //`[heading get_line]
+ template <class Iterator>
+ inline std::size_t get_line(Iterator);
+ /*`Get the line position. Returns -1 if Iterator is not a
+ `line_pos_iterator`. */
+
+ //`[heading get_line_start]
+ template <class Iterator>
+ inline Iterator get_line_start(Iterator lower_bound, Iterator current);
+ /*`Get an iterator to the beginning of the line. Applicable to any
+ iterator. */
+
+ //`[heading get_current_line]
+ template <class Iterator>
+ inline iterator_range<Iterator>
+ get_current_line(Iterator lower_bound, Iterator current,
+ Iterator upper_bound);
+ /*`Get an `iterator_range` containing the current line. Applicable to any
+ iterator. */
+
+ //`[heading get_column]
+ template <class Iterator>
+ inline std::size_t get_column(Iterator lower_bound, Iterator current,
+ std::size_t tabs = 4);
+ /*`Get the current column. Applicable to any iterator. */
+ //]
+
+ template <class Iterator>
+ inline std::size_t get_line(Iterator)
+ {
+ return -1;
+ }
+
+ template <class Iterator>
+ inline std::size_t get_line(line_pos_iterator<Iterator> i)
+ {
+ return i.position();
+ }
+
+ template <class Iterator>
+ inline Iterator get_line_start(Iterator lower_bound, Iterator current)
+ {
+ Iterator latest = lower_bound;
+
+ for (Iterator i = lower_bound; i != current; ++i) {
+ switch (*i) {
+ case '\r':
+ case '\n':
+ latest = i;
+ }
+ }
+
+ return latest;
+ }
+
+ template <class Iterator>
+ inline iterator_range<Iterator>
+ get_current_line(Iterator lower_bound,
+ Iterator current,
+ Iterator upper_bound)
+ {
+ Iterator first = get_line_start(lower_bound, current);
+ Iterator last = get_line_start(current, upper_bound);
+
+ if (last == current)
+ last = upper_bound;
+
+ return iterator_range<Iterator>(first, last);
+ }
+
+ template <class Iterator>
+ inline std::size_t get_column(Iterator lower_bound,
+ Iterator current,
+ std::size_t tabs)
+ {
+ std::size_t column = 1;
+ Iterator first = get_line_start(lower_bound, current);
+
+ for (Iterator i = first; i != current; ++i) {
+ switch (*i) {
+ case '\t':
+ column += tabs - (column - 1) % tabs;
+ break;
+ default:
+ ++column;
+ }
+ }
+
+ return column;
+ }
+
+}}
+
+#endif // BOOST_SPIRIT_SUPPORT_LINE_POS_ITERATOR
+
diff --git a/boost/spirit/home/support/iterators/look_ahead.hpp b/boost/spirit/home/support/iterators/look_ahead.hpp
new file mode 100644
index 0000000000..039dfe261f
--- /dev/null
+++ b/boost/spirit/home/support/iterators/look_ahead.hpp
@@ -0,0 +1,69 @@
+// Copyright (c) 2001, Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// http://spirit.sourceforge.net/
+//
+// Distributed under the 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_SPIRIT_ITERATOR_LOOK_AHEAD_MAR_16_2007_1253PM)
+#define BOOST_SPIRIT_ITERATOR_LOOK_AHEAD_MAR_16_2007_1253PM
+
+#include <boost/spirit/home/support/iterators/detail/first_owner_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/no_check_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/combine_policies.hpp>
+#include <boost/spirit/home/support/iterators/multi_pass.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // this could be a template typedef, since such a thing doesn't
+ // exist in C++, we'll use inheritance to accomplish the same thing.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, std::size_t N>
+ class look_ahead :
+ public multi_pass<T
+ , iterator_policies::default_policy<
+ iterator_policies::first_owner
+ , iterator_policies::no_check
+ , iterator_policies::input_iterator
+ , iterator_policies::fixed_size_queue<N> >
+ >
+ {
+ private:
+ typedef multi_pass<T
+ , iterator_policies::default_policy<
+ iterator_policies::first_owner
+ , iterator_policies::no_check
+ , iterator_policies::input_iterator
+ , iterator_policies::fixed_size_queue<N> >
+ > base_type;
+
+ public:
+ look_ahead()
+ : base_type() {}
+
+ explicit look_ahead(T x)
+ : base_type(x) {}
+
+ look_ahead(look_ahead const& x)
+ : base_type(x) {}
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+ look_ahead(int) // workaround for a bug in the library
+ : base_type() {} // shipped with gcc 3.1
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+ look_ahead operator= (base_type const& rhs)
+ {
+ this->base_type::operator=(rhs);
+ return *this;
+ }
+
+ // default generated operators destructor and assignment operator are ok.
+ };
+
+}}
+
+#endif
diff --git a/boost/spirit/home/support/iterators/multi_pass.hpp b/boost/spirit/home/support/iterators/multi_pass.hpp
new file mode 100644
index 0000000000..2b355bfa6d
--- /dev/null
+++ b/boost/spirit/home/support/iterators/multi_pass.hpp
@@ -0,0 +1,252 @@
+// Copyright (c) 2001, Daniel C. Nuffer
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// http://spirit.sourceforge.net/
+//
+// Distributed under the 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_SPIRIT_ITERATOR_MULTI_PASS_MAR_16_2007_1124AM)
+#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_MAR_16_2007_1124AM
+
+#include <boost/config.hpp>
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/spirit/home/support/iterators/detail/combine_policies.hpp>
+#include <boost/limits.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/utility/base_from_member.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // The default multi_pass instantiation uses a ref-counted std_deque scheme.
+ ///////////////////////////////////////////////////////////////////////////
+ template<typename T, typename Policies>
+ class multi_pass
+ : private boost::base_from_member<
+ typename Policies::BOOST_NESTED_TEMPLATE shared<T>*>
+ , public Policies::BOOST_NESTED_TEMPLATE unique<T>
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ , typename iterator_base_creator<T, typename Policies::input_policy>::type
+#endif
+ {
+ private:
+ // unique and shared data types
+ typedef typename Policies::BOOST_NESTED_TEMPLATE unique<T>
+ policies_base_type;
+ typedef typename Policies::BOOST_NESTED_TEMPLATE shared<T>
+ shared_data_type;
+
+ typedef boost::base_from_member<shared_data_type*> member_base;
+
+ // define the types the standard embedded iterator typedefs are taken
+ // from
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+ typedef typename iterator_base_creator<Input, T>::type iterator_type;
+#else
+ typedef typename policies_base_type::input_policy iterator_type;
+#endif
+
+ public:
+ // standard iterator typedefs
+ typedef std::forward_iterator_tag iterator_category;
+ typedef typename iterator_type::value_type value_type;
+ typedef typename iterator_type::difference_type difference_type;
+ typedef typename iterator_type::distance_type distance_type;
+ typedef typename iterator_type::reference reference;
+ typedef typename iterator_type::pointer pointer;
+
+ multi_pass() : member_base(static_cast<shared_data_type*>(0)) {}
+
+ explicit multi_pass(T& input)
+ : member_base(new shared_data_type(input)), policies_base_type(input) {}
+
+ explicit multi_pass(T const& input)
+ : member_base(new shared_data_type(input)), policies_base_type(input) {}
+
+ multi_pass(multi_pass const& x)
+ : member_base(x.member), policies_base_type(x)
+ {
+ policies_base_type::clone(*this);
+ }
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+ // The standard library shipped with gcc-3.1 has a bug in
+ // bits/basic_string.tcc. It tries to use iter::iter(0) to
+ // construct an iterator. Ironically, this happens in sanity
+ // checking code that isn't required by the standard.
+ // The workaround is to provide an additional constructor that
+ // ignores its int argument and behaves like the default constructor.
+ multi_pass(int) : member_base(static_cast<shared_data_type*>(0)) {}
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+ ~multi_pass()
+ {
+ if (policies_base_type::release(*this)) {
+ policies_base_type::destroy(*this);
+ delete this->member;
+ }
+ }
+
+ multi_pass& operator=(multi_pass const& x)
+ {
+ if (this != &x) {
+ multi_pass temp(x);
+ temp.swap(*this);
+ }
+ return *this;
+ }
+
+ void swap(multi_pass& x)
+ {
+ boost::swap(this->member, x.member);
+ this->policies_base_type::swap(x);
+ }
+
+ reference operator*() const
+ {
+ policies_base_type::docheck(*this);
+ return policies_base_type::dereference(*this);
+ }
+ pointer operator->() const
+ {
+ return &(operator*());
+ }
+
+ multi_pass& operator++()
+ {
+ policies_base_type::docheck(*this);
+ policies_base_type::increment(*this);
+ return *this;
+ }
+ multi_pass operator++(int)
+ {
+ multi_pass tmp(*this);
+ ++*this;
+ return tmp;
+ }
+
+ void clear_queue(BOOST_SCOPED_ENUM(traits::clear_mode) mode =
+ traits::clear_mode::clear_if_enabled)
+ {
+ if (mode == traits::clear_mode::clear_always || !inhibit_clear_queue())
+ policies_base_type::clear_queue(*this);
+ }
+ bool inhibit_clear_queue() const
+ {
+ return this->member->inhibit_clear_queue_;
+ }
+ void inhibit_clear_queue(bool flag)
+ {
+ this->member->inhibit_clear_queue_ = flag;
+ }
+
+ bool operator==(multi_pass const& y) const
+ {
+ if (is_eof())
+ return y.is_eof();
+ if (y.is_eof())
+ return false;
+
+ return policies_base_type::equal_to(*this, y);
+ }
+ bool operator<(multi_pass const& y) const
+ {
+ return policies_base_type::less_than(*this, y);
+ }
+
+ bool operator!=(multi_pass const& y)
+ {
+ return !(*this == y);
+ }
+ bool operator>(multi_pass const& y)
+ {
+ return y < *this;
+ }
+ bool operator>=(multi_pass const& y)
+ {
+ return !(*this < y);
+ }
+ bool operator<=(multi_pass const& y)
+ {
+ return !(y < *this);
+ }
+
+ // allow access to base member
+ shared_data_type* shared() const { return this->member; }
+
+ private: // helper functions
+ bool is_eof() const
+ {
+ return (0 == this->member) || policies_base_type::is_eof(*this);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator function
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Policies, typename T>
+ inline multi_pass<T, Policies>
+ make_multi_pass(T& i)
+ {
+ return multi_pass<T, Policies>(i);
+ }
+ template <typename Policies, typename T>
+ inline multi_pass<T, Policies>
+ make_multi_pass(T const& i)
+ {
+ return multi_pass<T, Policies>(i);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ inline multi_pass<T>
+ make_default_multi_pass(T& i)
+ {
+ return multi_pass<T>(i);
+ }
+ template <typename T>
+ inline multi_pass<T>
+ make_default_multi_pass(T const& i)
+ {
+ return multi_pass<T>(i);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Policies>
+ inline void
+ swap(multi_pass<T, Policies> &x, multi_pass<T, Policies> &y)
+ {
+ x.swap(y);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // define special functions allowing to integrate any multi_pass iterator
+ // with expectation points
+ namespace traits
+ {
+ template <typename T, typename Policies>
+ void clear_queue(multi_pass<T, Policies>& mp
+ , BOOST_SCOPED_ENUM(traits::clear_mode) mode)
+ {
+ mp.clear_queue(mode);
+ }
+
+ template <typename T, typename Policies>
+ void inhibit_clear_queue(multi_pass<T, Policies>& mp, bool flag)
+ {
+ mp.inhibit_clear_queue(flag);
+ }
+
+ template <typename T, typename Policies>
+ bool inhibit_clear_queue(multi_pass<T, Policies>& mp)
+ {
+ return mp.inhibit_clear_queue();
+ }
+ }
+
+}} // namespace boost::spirit
+
+#endif
+
+
diff --git a/boost/spirit/home/support/iterators/multi_pass_fwd.hpp b/boost/spirit/home/support/iterators/multi_pass_fwd.hpp
new file mode 100644
index 0000000000..4724d11cd7
--- /dev/null
+++ b/boost/spirit/home/support/iterators/multi_pass_fwd.hpp
@@ -0,0 +1,91 @@
+/*=============================================================================
+ Copyright (c) 2007 Tobias Schwinger
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_ITERATOR_MULTI_PASS_FWD_APR_18_2008_1102AM)
+#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_FWD_APR_18_2008_1102AM
+
+#include <cstddef>
+#include <boost/spirit/home/support/multi_pass_wrapper.hpp>
+#include <boost/swap.hpp>
+
+namespace boost { namespace spirit {
+
+ namespace iterator_policies
+ {
+ // input policies
+ struct input_iterator;
+ struct buffering_input_iterator;
+ struct istream;
+ struct lex_input;
+ struct functor_input;
+ struct split_functor_input;
+
+ // ownership policies
+ struct ref_counted;
+ struct first_owner;
+
+ // checking policies
+ class illegal_backtracking;
+ struct buf_id_check;
+ struct no_check;
+
+ // storage policies
+ struct split_std_deque;
+ template<std::size_t N> struct fixed_size_queue;
+
+ // policy combiner
+#if defined(BOOST_SPIRIT_DEBUG)
+ template<typename Ownership = ref_counted
+ , typename Checking = buf_id_check
+ , typename Input = buffering_input_iterator
+ , typename Storage = split_std_deque>
+ struct default_policy;
+#else
+ template<typename Ownership = ref_counted
+ , typename Checking = no_check
+ , typename Input = buffering_input_iterator
+ , typename Storage = split_std_deque>
+ struct default_policy;
+#endif
+ }
+
+ template <typename T
+ , typename Policies = iterator_policies::default_policy<> >
+ class multi_pass;
+
+ template <typename T, typename Policies>
+ void swap(multi_pass<T, Policies> &x, multi_pass<T, Policies> &y);
+
+}} // namespace boost::spirit
+
+namespace boost { namespace spirit { namespace traits
+{
+ // declare special functions allowing to integrate any multi_pass iterator
+ // with expectation points
+
+ // multi_pass iterators require special handling (for the non-specialized
+ // versions of these functions see support/multi_pass_wrapper.hpp)
+ template <typename T, typename Policies>
+ void clear_queue(multi_pass<T, Policies>&
+ , BOOST_SCOPED_ENUM(clear_mode) mode = clear_mode::clear_if_enabled);
+
+ template <typename T, typename Policies>
+ void inhibit_clear_queue(multi_pass<T, Policies>&, bool);
+
+ template <typename T, typename Policies>
+ bool inhibit_clear_queue(multi_pass<T, Policies>&);
+
+ // Helper template to recognize a multi_pass iterator. This specialization
+ // will be instantiated for any multi_pass iterator.
+ template <typename T, typename Policies>
+ struct is_multi_pass<multi_pass<T, Policies> > : mpl::true_ {};
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/iterators/ostream_iterator.hpp b/boost/spirit/home/support/iterators/ostream_iterator.hpp
new file mode 100644
index 0000000000..b51e8caa6a
--- /dev/null
+++ b/boost/spirit/home/support/iterators/ostream_iterator.hpp
@@ -0,0 +1,16 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_OSTREAM_ITERATOR_JAN_13_2010_0211PM)
+#define BOOST_SPIRIT_OSTREAM_ITERATOR_JAN_13_2010_0211PM
+
+#include <boost/spirit/home/karma/stream/ostream_iterator.hpp>
+
+namespace boost { namespace spirit
+{
+ typedef karma::ostream_iterator<char, char> ostream_iterator;
+}}
+
+#endif
diff --git a/boost/spirit/home/support/lazy.hpp b/boost/spirit/home/support/lazy.hpp
new file mode 100644
index 0000000000..5af98466ca
--- /dev/null
+++ b/boost/spirit/home/support/lazy.hpp
@@ -0,0 +1,41 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_LAZY_NOVEMBER_04_2008_1157AM)
+#define BOOST_SPIRIT_LAZY_NOVEMBER_04_2008_1157AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/proto/proto.hpp>
+#include <boost/spirit/home/support/modify.hpp>
+#include <boost/spirit/home/support/detail/is_spirit_tag.hpp>
+
+namespace boost { namespace spirit
+{
+ template <typename Eval>
+ typename proto::terminal<phoenix::actor<Eval> >::type
+ lazy(phoenix::actor<Eval> const& f)
+ {
+ return proto::terminal<phoenix::actor<Eval> >::type::make(f);
+ }
+
+ namespace tag
+ {
+ struct lazy_eval
+ {
+ BOOST_SPIRIT_IS_TAG()
+ };
+ }
+
+ template <typename Domain>
+ struct is_modifier_directive<Domain, tag::lazy_eval>
+ : mpl::true_ {};
+}}
+
+#endif
diff --git a/boost/spirit/home/support/limits.hpp b/boost/spirit/home/support/limits.hpp
new file mode 100644
index 0000000000..ff53967f1c
--- /dev/null
+++ b/boost/spirit/home/support/limits.hpp
@@ -0,0 +1,35 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_SUPPORT_LIMITS_MAR_26_2011_0833PM)
+#define BOOST_SPIRIT_SUPPORT_LIMITS_MAR_26_2011_0833PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+
+#if !defined(SPIRIT_ARGUMENTS_LIMIT)
+# define SPIRIT_ARGUMENTS_LIMIT PHOENIX_LIMIT
+#endif
+#if !defined(SPIRIT_ATTRIBUTES_LIMIT)
+# define SPIRIT_ATTRIBUTES_LIMIT PHOENIX_LIMIT
+#endif
+
+#else
+
+#if !defined(SPIRIT_ARGUMENTS_LIMIT)
+# define SPIRIT_ARGUMENTS_LIMIT BOOST_PHOENIX_LIMIT
+#endif
+#if !defined(SPIRIT_ATTRIBUTES_LIMIT)
+# define SPIRIT_ATTRIBUTES_LIMIT BOOST_PHOENIX_LIMIT
+#endif
+
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/make_component.hpp b/boost/spirit/home/support/make_component.hpp
new file mode 100644
index 0000000000..04a743763d
--- /dev/null
+++ b/boost/spirit/home/support/make_component.hpp
@@ -0,0 +1,474 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_MAKE_COMPONENT_OCTOBER_16_2008_1250PM
+#define BOOST_SPIRIT_MAKE_COMPONENT_OCTOBER_16_2008_1250PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/proto/proto.hpp>
+#include <boost/spirit/home/support/detail/make_cons.hpp>
+#include <boost/spirit/home/support/modify.hpp>
+
+namespace boost { namespace spirit
+{
+ // There is no real "component" class. Each domain is responsible
+ // for creating its own components. You need to specialize this for
+ // each component in your domain. Use this as a guide.
+
+ template <typename Domain, typename Tag, typename Enable = void>
+ struct make_component
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Elements, typename Modifiers>
+ struct result<This(Elements, Modifiers)>;
+
+ template <typename Elements, typename Modifiers>
+ typename result<make_component(Elements, Modifiers)>::type
+ operator()(Elements const& elements, Modifiers const& modifiers) const;
+ };
+
+ namespace tag
+ {
+ // Normally, we use proto tags as-is to distinguish operators.
+ // The special case is proto::tag::subscript. Spirit uses this
+ // as either sementic actions or directives. To distinguish between
+ // the two, we use these special tags below.
+
+ struct directive;
+ struct action;
+ }
+
+ template <typename Domain, typename T, typename Enable = void>
+ struct flatten_tree;
+}}
+
+namespace boost { namespace spirit { namespace detail
+{
+ template <typename Expr, typename State, typename Data, typename Domain>
+ struct make_terminal_impl
+ : proto::transform_impl<Expr, State, Data>
+ {
+ typedef typename
+ proto::result_of::value<Expr>::type
+ value;
+
+ typedef typename result_of::make_cons<value>::type elements;
+
+ typedef
+ make_component<Domain, proto::tag::terminal>
+ make_component_;
+
+ typedef typename
+ make_component_::template
+ result<make_component_(elements, Data)>::type
+ result_type;
+
+ result_type operator()(
+ typename make_terminal_impl::expr_param expr
+ , typename make_terminal_impl::state_param /*state*/
+ , typename make_terminal_impl::data_param data
+ ) const
+ {
+ return typename make_terminal_impl::make_component_()(
+ detail::make_cons(proto::value(expr))
+ , data
+ );
+ }
+ };
+
+ template <typename Expr, typename State, typename Data, typename Domain>
+ struct make_terminal_impl<phoenix::actor<Expr>, State, Data, Domain>
+ : proto::transform_impl<phoenix::actor<Expr>, State, Data>
+ {
+ typedef phoenix::actor<Expr> value;
+ typedef typename result_of::make_cons<value>::type elements;
+ typedef make_component<Domain, proto::tag::terminal> make_component_;
+
+ typedef typename
+ make_component_::template
+ result<make_component_(elements, Data)>::type
+ result_type;
+
+ result_type operator()(
+ typename make_terminal_impl::expr_param expr
+ , typename make_terminal_impl::state_param /*state*/
+ , typename make_terminal_impl::data_param data
+ ) const
+ {
+ return typename make_terminal_impl::make_component_()(
+ detail::make_cons(expr)
+ , data
+ );
+ }
+ };
+
+ template <typename Expr, typename State, typename Data, typename Domain>
+ struct make_terminal_impl<phoenix::actor<Expr> &, State, Data, Domain>
+ : make_terminal_impl<phoenix::actor<Expr>, State, Data, Domain>
+ {};
+
+ template <typename Expr, typename State, typename Data, typename Domain>
+ struct make_terminal_impl<phoenix::actor<Expr> const &, State, Data, Domain>
+ : make_terminal_impl<phoenix::actor<Expr>, State, Data, Domain>
+ {};
+
+ template <typename Domain>
+ struct make_terminal : proto::transform<make_terminal<Domain> >
+ {
+ template<typename Expr, typename State, typename Data>
+ struct impl : make_terminal_impl<Expr, State, Data, Domain> {};
+ };
+
+ template <typename Domain, typename Tag, typename Grammar>
+ struct make_unary : proto::transform<make_unary<Domain, Tag, Grammar> >
+ {
+ template<typename Expr, typename State, typename Data>
+ struct impl : proto::transform_impl<Expr, State, Data>
+ {
+ typedef typename
+ proto::result_of::child_c<Expr, 0>::type
+ child;
+
+ typedef typename Grammar::
+ template result<Grammar(child, State, Data)>::type
+ child_component;
+
+ typedef typename
+ result_of::make_cons<child_component>::type
+ elements;
+
+ typedef make_component<Domain, Tag> make_component_;
+
+ typedef typename
+ make_component_::template
+ result<make_component_(elements, Data)>::type
+ result_type;
+
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ ) const
+ {
+ return typename impl::make_component_()(
+ detail::make_cons(
+ Grammar()(proto::child(expr), state, data))
+ , data
+ );
+ }
+ };
+ };
+
+ // un-flattened version
+ template <typename Domain, typename Tag, typename Grammar,
+ bool flatten = flatten_tree<Domain, Tag>::value>
+ struct make_binary
+ {
+ template<typename Expr, typename State, typename Data>
+ struct impl : proto::transform_impl<Expr, State, Data>
+ {
+ typedef typename Grammar::
+ template result<Grammar(
+ typename proto::result_of::child_c<Expr, 0>::type
+ , State, Data)>::type
+ lhs_component;
+
+ typedef typename Grammar::
+ template result<Grammar(
+ typename proto::result_of::child_c<Expr, 1>::type
+ , State, Data)>::type
+ rhs_component;
+
+ typedef typename
+ result_of::make_cons<
+ lhs_component
+ , typename result_of::make_cons<rhs_component>::type
+ >::type
+ elements_type;
+
+ typedef make_component<Domain, Tag> make_component_;
+
+ typedef typename
+ make_component_::template
+ result<make_component_(elements_type, Data)>::type
+ result_type;
+
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ ) const
+ {
+ elements_type elements =
+ detail::make_cons(
+ Grammar()(
+ proto::child_c<0>(expr), state, data) // LHS
+ , detail::make_cons(
+ Grammar()(
+ proto::child_c<1>(expr), state, data) // RHS
+ )
+ );
+
+ return make_component_()(elements, data);
+ }
+ };
+ };
+
+ template <typename Grammar>
+ struct make_binary_helper : proto::transform<make_binary_helper<Grammar> >
+ {
+ template<typename Expr, typename State, typename Data>
+ struct impl : proto::transform_impl<Expr, State, Data>
+ {
+ typedef typename Grammar::
+ template result<Grammar(Expr, State, Data)>::type
+ lhs;
+
+ typedef typename result_of::make_cons<lhs, State>::type result_type;
+
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ ) const
+ {
+ return detail::make_cons(Grammar()(expr, state, data), state);
+ }
+ };
+ };
+
+ // Flattened version
+ template <typename Domain, typename Tag, typename Grammar>
+ struct make_binary<Domain, Tag, Grammar, true>
+ : proto::transform<make_binary<Domain, Tag, Grammar> >
+ {
+ template<typename Expr, typename State, typename Data>
+ struct impl : proto::transform_impl<Expr, State, Data>
+ {
+ typedef typename
+ proto::reverse_fold_tree<
+ proto::_
+ , proto::make<fusion::nil>
+ , make_binary_helper<Grammar>
+ >::template impl<Expr, State, Data>
+ reverse_fold_tree;
+
+ typedef typename reverse_fold_tree::result_type elements;
+ typedef make_component<Domain, Tag> make_component_;
+
+ typedef typename
+ make_component_::template
+ result<make_component_(elements, Data)>::type
+ result_type;
+
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ ) const
+ {
+ return make_component_()(
+ reverse_fold_tree()(expr, state, data), data);
+ }
+ };
+ };
+
+ template <typename Domain, typename Grammar>
+ struct make_directive : proto::transform<make_directive<Domain, Grammar> >
+ {
+ template<typename Expr, typename State, typename Data>
+ struct impl : proto::transform_impl<Expr, State, Data>
+ {
+ typedef typename
+ proto::result_of::child_c<Expr, 0>::type
+ lhs;
+
+ typedef typename
+ proto::result_of::value<lhs>::type
+ tag_type;
+
+ typedef typename modify<Domain>::
+ template result<modify<Domain>(tag_type, Data)>::type
+ modifier_type;
+
+ typedef typename Grammar::
+ template result<Grammar(
+ typename proto::result_of::child_c<Expr, 1>::type
+ , State
+ , modifier_type
+ )>::type
+ rhs_component;
+
+ typedef typename
+ result_of::make_cons<
+ tag_type
+ , typename result_of::make_cons<rhs_component>::type
+ >::type
+ elements_type;
+
+ typedef make_component<Domain, tag::directive> make_component_;
+
+ typedef typename
+ make_component_::template
+ result<make_component_(elements_type, Data)>::type
+ result_type;
+
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ ) const
+ {
+ tag_type tag = proto::value(proto::child_c<0>(expr));
+ typename remove_reference<modifier_type>::type
+ modifier = modify<Domain>()(tag, data);
+
+ elements_type elements =
+ detail::make_cons(
+ tag // LHS
+ , detail::make_cons(
+ Grammar()(
+ proto::child_c<1>(expr) // RHS
+ , state, modifier)
+ )
+ );
+
+ return make_component_()(elements, data);
+ }
+ };
+ };
+
+ template <typename Domain, typename Grammar>
+ struct make_action : proto::transform<make_action<Domain, Grammar> >
+ {
+ template<typename Expr, typename State, typename Data>
+ struct impl : proto::transform_impl<Expr, State, Data>
+ {
+ typedef typename Grammar::
+ template result<Grammar(
+ typename proto::result_of::child_c<Expr, 0>::type
+ , State
+ , Data
+ )>::type
+ lhs_component;
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+ typedef typename
+ proto::result_of::value<
+ typename proto::result_of::child_c<Expr, 1>::type
+ >::type
+ rhs_component;
+#else
+ typedef
+ typename mpl::eval_if_c<
+ phoenix::is_actor<
+ typename proto::result_of::child_c<Expr, 1>::type
+ >::type::value
+ , proto::result_of::child_c<Expr, 1>
+ , proto::result_of::value<
+ typename proto::result_of::child_c<Expr, 1>::type
+ >
+ >::type
+ rhs_component;
+#endif
+
+ typedef typename
+ result_of::make_cons<
+ lhs_component
+ , typename result_of::make_cons<rhs_component>::type
+ >::type
+ elements_type;
+
+ typedef make_component<Domain, tag::action> make_component_;
+
+ typedef typename
+ make_component_::template
+ result<make_component_(elements_type, Data)>::type
+ result_type;
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ ) const
+ {
+ elements_type elements =
+ detail::make_cons(
+ Grammar()(
+ proto::child_c<0>(expr), state, data) // LHS
+ , detail::make_cons(
+ proto::value(proto::child_c<1>(expr))) // RHS
+ );
+
+ return make_component_()(elements, data);
+ }
+#else
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ ) const
+ {
+ return
+ (*this)(
+ expr
+ , state
+ , data
+ , typename phoenix::is_actor<
+ typename proto::result_of::child_c<Expr, 1>::type
+ >::type()
+ );
+ }
+
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ , mpl::false_
+ ) const
+ {
+ elements_type elements =
+ detail::make_cons(
+ Grammar()(
+ proto::child_c<0>(expr), state, data) // LHS
+ , detail::make_cons(
+ proto::value(proto::child_c<1>(expr))) // RHS
+ );
+
+ return make_component_()(elements, data);
+ }
+
+ result_type operator()(
+ typename impl::expr_param expr
+ , typename impl::state_param state
+ , typename impl::data_param data
+ , mpl::true_
+ ) const
+ {
+ elements_type elements =
+ detail::make_cons(
+ Grammar()(
+ proto::child_c<0>(expr), state, data) // LHS
+ , detail::make_cons(
+ proto::child_c<1>(expr)) // RHS
+ );
+
+ return make_component_()(elements, data);
+ }
+#endif
+ };
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/meta_compiler.hpp b/boost/spirit/home/support/meta_compiler.hpp
new file mode 100644
index 0000000000..a525ef362d
--- /dev/null
+++ b/boost/spirit/home/support/meta_compiler.hpp
@@ -0,0 +1,320 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_META_COMPILER_OCTOBER_16_2008_1258PM
+#define BOOST_SPIRIT_META_COMPILER_OCTOBER_16_2008_1258PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/spirit/include/phoenix_limits.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/spirit/include/phoenix_limits.hpp> // needs to be included before proto
+#include <boost/proto/proto.hpp>
+#include <boost/spirit/home/support/make_component.hpp>
+#include <boost/spirit/home/support/modify.hpp>
+#include <boost/spirit/home/support/detail/make_cons.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+namespace boost { namespace spirit
+{
+ // Some defaults...
+
+ template <typename Domain, typename Tag, typename Enable = void>
+ struct use_operator : mpl::false_ {};
+
+ template <typename Domain, typename T, typename Enable = void>
+ struct use_function : mpl::false_ {};
+
+ template <typename Domain, typename T, typename Enable = void>
+ struct use_directive : mpl::false_ {};
+
+ template <typename Domain, typename T, typename Enable /* = void */>
+ struct is_modifier_directive : mpl::false_ {};
+
+ template <typename Domain, typename T, typename Enable = void>
+ struct use_terminal : mpl::false_ {};
+
+ template <typename Domain, typename T, typename Enable /*= void*/>
+ struct flatten_tree : mpl::false_ {};
+
+ // Our meta-compiler. This is the main engine that hooks Spirit
+ // to the proto expression template engine.
+
+ template <typename Domain>
+ struct meta_compiler
+ {
+ struct meta_grammar;
+
+ BOOST_SPIRIT_ASSERT_MSG((
+ !use_operator<Domain, proto::tag::subscript>::value
+ ), error_proto_tag_subscript_cannot_be_used, ());
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+ // this is the non-broken part for compilers properly supporting
+ // partial template specialization (VC7.1 does not)
+ struct cases
+ {
+ template <typename Tag, typename Enable = void>
+ struct case_
+ : proto::not_<proto::_>
+ {};
+
+ ///////////////////////////////////////////////////////////////////
+ // terminals
+ ///////////////////////////////////////////////////////////////////
+ template <typename Enable>
+ struct case_<proto::tag::terminal, Enable>
+ : proto::when<
+ proto::if_<use_terminal<Domain, proto::_value>()>,
+ detail::make_terminal<Domain>
+ >
+ {};
+
+ template <typename Tag>
+ struct case_<Tag, typename enable_if<use_operator<Domain, Tag> >::type>
+ : proto::or_<
+ ///////////////////////////////////////////////////////////////////
+ // binary operators
+ ///////////////////////////////////////////////////////////////////
+ proto::when<proto::binary_expr<Tag, meta_grammar, meta_grammar>,
+ detail::make_binary<Domain, Tag, meta_grammar>
+ >,
+ ///////////////////////////////////////////////////////////////////
+ // unary operators
+ ///////////////////////////////////////////////////////////////////
+ proto::when<proto::unary_expr<Tag, meta_grammar>,
+ detail::make_unary<Domain, Tag, meta_grammar>
+ >
+ >
+ {};
+
+ template <typename Enable>
+ struct case_<proto::tag::subscript, Enable>
+ : proto::or_<
+ ///////////////////////////////////////////////////////////////////
+ // directives
+ ///////////////////////////////////////////////////////////////////
+ proto::when<proto::binary_expr<proto::tag::subscript
+ , proto::and_<
+ proto::terminal<proto::_>
+ , proto::if_<use_directive<Domain, proto::_value >()> >
+ , meta_grammar>,
+ detail::make_directive<Domain, meta_grammar>
+ >,
+ ///////////////////////////////////////////////////////////////////
+ // semantic actions
+ ///////////////////////////////////////////////////////////////////
+ proto::when<proto::binary_expr<proto::tag::subscript
+ , meta_grammar, proto::_>,
+ detail::make_action<Domain, meta_grammar>
+ >
+ >
+ {};
+ };
+#else
+ // this part actually constitutes invalid C++ code, but it allows us to
+ // convince VC7.1 to do what we want
+ struct cases
+ {
+ template <typename Tag, typename Enable = void>
+ struct case_
+ : proto::not_<proto::_>
+ {};
+
+ ///////////////////////////////////////////////////////////////////
+ // terminals
+ ///////////////////////////////////////////////////////////////////
+ template <>
+ struct case_<proto::tag::terminal>
+ : proto::when<
+ proto::if_<use_terminal<Domain, proto::_value>()>,
+ detail::make_terminal<Domain>
+ >
+ {};
+
+ template <typename Tag>
+ struct case_<Tag>
+ : proto::or_<
+ ///////////////////////////////////////////////////////////////////
+ // binary operators
+ ///////////////////////////////////////////////////////////////////
+ proto::when<proto::binary_expr<
+ typename enable_if<use_operator<Domain, Tag>, Tag>::type
+ , meta_grammar, meta_grammar>
+ , detail::make_binary<Domain, Tag, meta_grammar>
+ >,
+ ///////////////////////////////////////////////////////////////////
+ // unary operators
+ ///////////////////////////////////////////////////////////////////
+ proto::when<proto::unary_expr<
+ typename enable_if<use_operator<Domain, Tag>, Tag>::type
+ , meta_grammar>
+ , detail::make_unary<Domain, Tag, meta_grammar>
+ >
+ >
+ {};
+
+ template <>
+ struct case_<proto::tag::subscript>
+ : proto::or_<
+ ///////////////////////////////////////////////////////////////////
+ // directives
+ ///////////////////////////////////////////////////////////////////
+ proto::when<proto::binary_expr<proto::tag::subscript
+ , proto::and_<
+ proto::terminal<proto::_>
+ , proto::if_<use_directive<Domain, proto::_value >()> >
+ , meta_grammar>,
+ detail::make_directive<Domain, meta_grammar>
+ >,
+ ///////////////////////////////////////////////////////////////////
+ // semantic actions
+ ///////////////////////////////////////////////////////////////////
+ proto::when<proto::binary_expr<proto::tag::subscript
+ , meta_grammar, proto::_>,
+ detail::make_action<Domain, meta_grammar>
+ >
+ >
+ {};
+ };
+#endif
+
+ struct meta_grammar
+ : proto::switch_<cases>
+ {};
+ };
+
+ namespace result_of
+ {
+ // Default case
+ template <typename Domain, typename Expr
+ , typename Modifiers = unused_type, typename Enable = void>
+ struct compile
+ {
+ typedef typename meta_compiler<Domain>::meta_grammar meta_grammar;
+ typedef typename meta_grammar::
+ template result<meta_grammar(Expr, mpl::void_, Modifiers)>::type
+ type;
+ };
+
+ // If Expr is not a proto expression, make it a terminal
+ template <typename Domain, typename Expr, typename Modifiers>
+ struct compile<Domain, Expr, Modifiers,
+ typename disable_if<proto::is_expr<Expr> >::type>
+ : compile<Domain, typename proto::terminal<Expr>::type, Modifiers> {};
+ }
+
+ namespace traits
+ {
+ // Check if Expr matches the domain's grammar
+ template <typename Domain, typename Expr>
+ struct matches :
+ proto::matches<
+ typename proto::result_of::as_expr<
+ typename remove_reference<Expr>::type>::type,
+ typename meta_compiler<Domain>::meta_grammar
+ >
+ {
+ };
+ }
+
+ namespace detail
+ {
+ template <typename Domain>
+ struct compiler
+ {
+ // Default case
+ template <typename Expr, typename Modifiers>
+ static typename spirit::result_of::compile<Domain, Expr, Modifiers>::type
+ compile(Expr const& expr, Modifiers modifiers, mpl::true_)
+ {
+ typename meta_compiler<Domain>::meta_grammar compiler;
+ return compiler(expr, mpl::void_(), modifiers);
+ }
+
+ // If Expr is not a proto expression, make it a terminal
+ template <typename Expr, typename Modifiers>
+ static typename spirit::result_of::compile<Domain, Expr, Modifiers>::type
+ compile(Expr const& expr, Modifiers modifiers, mpl::false_)
+ {
+ typename meta_compiler<Domain>::meta_grammar compiler;
+ typedef typename detail::as_meta_element<Expr>::type expr_;
+ typename proto::terminal<expr_>::type term = {expr};
+ return compiler(term, mpl::void_(), modifiers);
+ }
+ };
+ }
+
+ template <typename Domain, typename Expr>
+ inline typename result_of::compile<Domain, Expr, unused_type>::type
+ compile(Expr const& expr)
+ {
+ typedef typename proto::is_expr<Expr>::type is_expr;
+ return detail::compiler<Domain>::compile(expr, unused, is_expr());
+ }
+
+ template <typename Domain, typename Expr, typename Modifiers>
+ inline typename result_of::compile<Domain, Expr, Modifiers>::type
+ compile(Expr const& expr, Modifiers modifiers)
+ {
+ typedef typename proto::is_expr<Expr>::type is_expr;
+ return detail::compiler<Domain>::compile(expr, modifiers, is_expr());
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, template <typename Subject> class generator>
+ struct make_unary_composite
+ {
+ typedef typename
+ fusion::result_of::value_at_c<Elements, 0>::type
+ element_type;
+ typedef generator<element_type> result_type;
+ result_type operator()(Elements const& elements, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(elements));
+ }
+ };
+
+ template <typename Elements, template <typename Left, typename Right> class generator>
+ struct make_binary_composite
+ {
+ typedef typename
+ fusion::result_of::value_at_c<Elements, 0>::type
+ left_type;
+ typedef typename
+ fusion::result_of::value_at_c<Elements, 1>::type
+ right_type;
+ typedef generator<left_type, right_type> result_type;
+
+ result_type operator()(Elements const& elements, unused_type) const
+ {
+ return result_type(
+ fusion::at_c<0>(elements)
+ , fusion::at_c<1>(elements)
+ );
+ }
+ };
+
+ template <typename Elements, template <typename Elements_> class generator>
+ struct make_nary_composite
+ {
+ typedef generator<Elements> result_type;
+ result_type operator()(Elements const& elements, unused_type) const
+ {
+ return result_type(elements);
+ }
+ };
+
+}}
+
+#endif
diff --git a/boost/spirit/home/support/modify.hpp b/boost/spirit/home/support/modify.hpp
new file mode 100644
index 0000000000..80d2f71b71
--- /dev/null
+++ b/boost/spirit/home/support/modify.hpp
@@ -0,0 +1,124 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_MODIFY_OCTOBER_25_2008_0142PM
+#define BOOST_SPIRIT_MODIFY_OCTOBER_25_2008_0142PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_limits.hpp> // needs to be included before proto
+#include <boost/proto/proto.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+
+namespace boost { namespace spirit
+{
+ template <typename Domain, typename T, typename Enable = void>
+ struct is_modifier_directive;
+
+ // Testing if a modifier set includes a modifier T involves
+ // checking for inheritance (i.e. Modifiers is derived from T)
+ template <typename Modifiers, typename T>
+ struct has_modifier
+ : is_base_of<T, Modifiers> {};
+
+ // Adding modifiers is done using multi-inheritance
+ template <typename Current, typename New, typename Enable = void>
+ struct compound_modifier : Current, New
+ {
+ compound_modifier()
+ : Current(), New() {}
+
+ compound_modifier(Current const& current, New const& new_)
+ : Current(current), New(new_) {}
+ };
+
+ // Don't add if New is already in Current
+ template <typename Current, typename New>
+ struct compound_modifier<
+ Current, New, typename enable_if<has_modifier<Current, New> >::type>
+ : Current
+ {
+ compound_modifier()
+ : Current() {}
+
+ compound_modifier(Current const& current, New const&)
+ : Current(current) {}
+ };
+
+ // Special case if Current is unused_type
+ template <typename New, typename Enable>
+ struct compound_modifier<unused_type, New, Enable> : New
+ {
+ compound_modifier()
+ : New() {}
+
+ compound_modifier(unused_type, New const& new_)
+ : New(new_) {}
+ };
+
+ // Domains may specialize this modify metafunction to allow
+ // directives to add information to the Modifier template
+ // parameter that is passed to the make_component metafunction.
+ // By default, we return the modifiers untouched
+ template <typename Domain, typename Enable = void>
+ struct modify
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Tag, typename Modifiers>
+ struct result<This(Tag, Modifiers)>
+ {
+ typedef typename remove_const<
+ typename remove_reference<Tag>::type>::type
+ tag_type;
+ typedef typename remove_const<
+ typename remove_reference<Modifiers>::type>::type
+ modifiers_type;
+
+ typedef typename mpl::if_<
+ is_modifier_directive<Domain, tag_type>
+ , compound_modifier<modifiers_type, tag_type>
+ , Modifiers>::type
+ type;
+ };
+
+ template <typename Tag, typename Modifiers>
+ typename result<modify(Tag, Modifiers)>::type
+ operator()(Tag tag, Modifiers modifiers) const
+ {
+ return op(tag, modifiers, is_modifier_directive<Domain, Tag>());
+ }
+
+ template <typename Tag, typename Modifiers>
+ Modifiers
+ op(Tag /*tag*/, Modifiers modifiers, mpl::false_) const
+ {
+ return modifiers;
+ }
+
+ template <typename Tag, typename Modifiers>
+ compound_modifier<Modifiers, Tag>
+ op(Tag tag, Modifiers modifiers, mpl::true_) const
+ {
+ return compound_modifier<Modifiers, Tag>(modifiers, tag);
+ }
+ };
+}}
+
+namespace boost { namespace proto
+{
+ template <typename Domain, typename Enable>
+ struct is_callable<spirit::modify<Domain, Enable> >
+ : mpl::true_ {};
+}}
+
+#endif
diff --git a/boost/spirit/home/support/multi_pass.hpp b/boost/spirit/home/support/multi_pass.hpp
new file mode 100644
index 0000000000..74f4a2314b
--- /dev/null
+++ b/boost/spirit/home/support/multi_pass.hpp
@@ -0,0 +1,39 @@
+// Copyright (c) 2001-2009, Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_MULTI_PASS_MAR_16_2007_0201AM)
+#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_MAR_16_2007_0201AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+// Include everything needed for the multi_pass
+// Ownership policies
+#include <boost/spirit/home/support/iterators/detail/first_owner_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp>
+
+// Input policies
+#include <boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/istream_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/lex_input_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/functor_input_policy.hpp>
+
+// Checking policies
+#include <boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/no_check_policy.hpp>
+
+// Storage policies
+#include <boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp>
+#include <boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp>
+
+// Main multi_pass iterator
+#include <boost/spirit/home/support/iterators/detail/combine_policies.hpp>
+#include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
+#include <boost/spirit/home/support/iterators/multi_pass.hpp>
+
+#endif
diff --git a/boost/spirit/home/support/multi_pass_wrapper.hpp b/boost/spirit/home/support/multi_pass_wrapper.hpp
new file mode 100644
index 0000000000..ec5fa36f45
--- /dev/null
+++ b/boost/spirit/home/support/multi_pass_wrapper.hpp
@@ -0,0 +1,52 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_ITERATOR_MULTI_PASS_WRAPPER_JUL_12_2009_0914PM)
+#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_WRAPPER_JUL_12_2009_0914PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/support/detail/scoped_enum_emulation.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ // declare special functions allowing to integrate any multi_pass iterator
+ // with expectation points
+
+ // normal iterators require no special handling
+ BOOST_SCOPED_ENUM_START(clear_mode)
+ {
+ clear_if_enabled,
+ clear_always
+ };
+ BOOST_SCOPED_ENUM_END
+
+ template <typename Iterator>
+ void clear_queue(Iterator&
+ , BOOST_SCOPED_ENUM(clear_mode) /*mode*/ = clear_mode::clear_if_enabled)
+ {}
+
+ template <typename Iterator>
+ void inhibit_clear_queue(Iterator&, bool)
+ {}
+
+ template <typename Iterator>
+ bool inhibit_clear_queue(Iterator&)
+ {
+ return false;
+ }
+
+ // Helper template to recognize a multi_pass iterator. This specialization
+ // will be instantiated for any non-multi_pass iterator.
+ template <typename Iterator>
+ struct is_multi_pass : mpl::false_ {};
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/home/support/nonterminal/expand_arg.hpp b/boost/spirit/home/support/nonterminal/expand_arg.hpp
new file mode 100644
index 0000000000..f037acce24
--- /dev/null
+++ b/boost/spirit/home/support/nonterminal/expand_arg.hpp
@@ -0,0 +1,88 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_EXPAND_ARG_FEB_19_2007_1107AM)
+#define BOOST_SPIRIT_EXPAND_ARG_FEB_19_2007_1107AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/utility/result_of.hpp>
+#include <boost/type_traits/is_scalar.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Context>
+ struct expand_arg
+ {
+ template <typename T>
+ struct result_type
+ {
+ // This is a temporary hack. The better way is to detect if T
+ // can be called given unused context.
+ typedef typename
+ mpl::eval_if<
+ mpl::or_<is_scalar<T>, traits::is_string<T> >
+ , mpl::identity<T const &>
+ , boost::result_of<T(unused_type, Context)>
+ >::type
+ type;
+ };
+
+ template <typename T>
+ struct result;
+
+ template <typename F, typename A0>
+ struct result<F(A0)>
+ : result_type<A0> {};
+
+ template <typename F, typename A0>
+ struct result<F(A0&)>
+ : result_type<A0> {};
+
+ expand_arg(Context& context)
+ : context(context)
+ {
+ }
+
+ template <typename T>
+ typename result_type<T>::type
+ call(T const& f, mpl::false_) const
+ {
+ return f(unused, context);
+ }
+
+ template <typename T>
+ typename result_type<T>::type
+ call(T const& val, mpl::true_) const
+ {
+ return val;
+ }
+
+ template <typename T>
+ typename result_type<T>::type
+ operator()(T const& x) const
+ {
+ return call(x, mpl::or_<is_scalar<T>, traits::is_string<T> >());
+ }
+
+ Context& context;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ expand_arg& operator= (expand_arg const&);
+ };
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/nonterminal/extract_param.hpp b/boost/spirit/home/support/nonterminal/extract_param.hpp
new file mode 100644
index 0000000000..61499327a0
--- /dev/null
+++ b/boost/spirit/home/support/nonterminal/extract_param.hpp
@@ -0,0 +1,123 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2009 Francois Barel
+
+ Distributed under the 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_SPIRIT_EXTRACT_PARAM_AUGUST_08_2009_0848AM)
+#define BOOST_SPIRIT_EXTRACT_PARAM_AUGUST_08_2009_0848AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/meta_compiler.hpp>
+#include <boost/spirit/home/support/nonterminal/locals.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+#include <boost/function_types/is_function.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/fusion/include/as_list.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/find_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Helpers to extract params (locals, attributes, ...) from nonterminal
+ // template arguments
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Types, typename Pred, typename Default>
+ struct extract_param
+ {
+ typedef typename mpl::find_if<Types, Pred>::type pos;
+
+ typedef typename
+ mpl::eval_if<
+ is_same<pos, typename mpl::end<Types>::type>
+ , mpl::identity<Default>
+ , mpl::deref<pos>
+ >::type
+ type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Types>
+ struct extract_locals
+ : fusion::result_of::as_vector<
+ typename extract_param<
+ Types
+ , is_locals<mpl::_>
+ , locals<>
+ >::type
+ >
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Domain, typename Types>
+ struct extract_component
+ : spirit::result_of::compile<
+ Domain
+ , typename extract_param<
+ Types
+ , traits::matches<Domain, mpl::_>
+ , unused_type
+ >::type
+ >
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Types>
+ struct extract_sig
+ : extract_param<
+ Types
+ , function_types::is_function<mpl::_>
+ , void()
+ >
+ {};
+
+ template <typename Sig>
+ struct attr_from_sig
+ {
+ typedef typename function_types::result_type<Sig>::type attr;
+
+ typedef typename
+ mpl::if_<
+ is_same<attr, void>
+ , unused_type
+ , attr
+ >::type
+ type;
+ };
+
+ template <typename Sig>
+ struct params_from_sig
+ {
+ typedef typename function_types::parameter_types<Sig>::type params;
+
+ typedef typename fusion::result_of::as_list<params>::type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Types>
+ struct extract_encoding
+ : extract_param<
+ Types
+ , is_char_encoding<mpl::_>
+ , unused_type
+ >
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/nonterminal/locals.hpp b/boost/spirit/home/support/nonterminal/locals.hpp
new file mode 100644
index 0000000000..4db0349053
--- /dev/null
+++ b/boost/spirit/home/support/nonterminal/locals.hpp
@@ -0,0 +1,54 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_LOCALS_APRIL_03_2007_0506PM)
+#define BOOST_SPIRIT_LOCALS_APRIL_03_2007_0506PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/bool.hpp>
+
+#if !defined(BOOST_SPIRIT_MAX_LOCALS_SIZE)
+# define BOOST_SPIRIT_MAX_LOCALS_SIZE 10
+#else
+# if BOOST_SPIRIT_MAX_LOCALS_SIZE < 3
+# undef BOOST_SPIRIT_MAX_LOCALS_SIZE
+# define BOOST_SPIRIT_MAX_LOCALS_SIZE 10
+# endif
+#endif
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ BOOST_SPIRIT_MAX_LOCALS_SIZE, typename T, mpl::na)
+ >
+ struct locals
+ : mpl::vector<BOOST_PP_ENUM_PARAMS(BOOST_SPIRIT_MAX_LOCALS_SIZE, T)> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T>
+ struct is_locals
+ : mpl::false_
+ {};
+
+ template <BOOST_PP_ENUM_PARAMS(BOOST_SPIRIT_MAX_LOCALS_SIZE, typename T)>
+ struct is_locals<locals<BOOST_PP_ENUM_PARAMS(BOOST_SPIRIT_MAX_LOCALS_SIZE, T)> >
+ : mpl::true_
+ {};
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/support/numeric_traits.hpp b/boost/spirit/home/support/numeric_traits.hpp
new file mode 100644
index 0000000000..3a5dce88ee
--- /dev/null
+++ b/boost/spirit/home/support/numeric_traits.hpp
@@ -0,0 +1,118 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_NUMERIC_TRAITS_JAN_07_2011_0722AM)
+#define BOOST_SPIRIT_NUMERIC_TRAITS_JAN_07_2011_0722AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine if T is a boolean type
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct is_bool : mpl::false_ {};
+
+ template <typename T>
+ struct is_bool<T const> : is_bool<T> {};
+
+ template <>
+ struct is_bool<bool> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine if T is a signed integer type
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct is_int : mpl::false_ {};
+
+ template <typename T>
+ struct is_int<T const> : is_int<T> {};
+
+ template <>
+ struct is_int<short> : mpl::true_ {};
+
+ template <>
+ struct is_int<int> : mpl::true_ {};
+
+ template <>
+ struct is_int<long> : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct is_int<boost::long_long_type> : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine if T is an unsigned integer type
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct is_uint : mpl::false_ {};
+
+ template <typename T>
+ struct is_uint<T const> : is_uint<T> {};
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+ template <>
+ struct is_uint<unsigned short> : mpl::true_ {};
+#endif
+
+ template <>
+ struct is_uint<unsigned int> : mpl::true_ {};
+
+ template <>
+ struct is_uint<unsigned long> : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+ template <>
+ struct is_uint<boost::ulong_long_type> : mpl::true_ {};
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine if T is a floating point type
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct is_real : mpl::false_ {};
+
+ template <typename T>
+ struct is_real<T const> : is_uint<T> {};
+
+ template <>
+ struct is_real<float> : mpl::true_ {};
+
+ template <>
+ struct is_real<double> : mpl::true_ {};
+
+ template <>
+ struct is_real<long double> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // customization points for numeric operations
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T, typename Enable = void>
+ struct absolute_value;
+
+ template <typename T, typename Enable = void>
+ struct is_negative;
+
+ template <typename T, typename Enable = void>
+ struct is_zero;
+
+ template <typename T, typename Enable = void>
+ struct pow10_helper;
+
+ template <typename T, typename Enable = void>
+ struct is_nan;
+
+ template <typename T, typename Enable = void>
+ struct is_infinite;
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/sequence_base_id.hpp b/boost/spirit/home/support/sequence_base_id.hpp
new file mode 100644
index 0000000000..df9c177698
--- /dev/null
+++ b/boost/spirit/home/support/sequence_base_id.hpp
@@ -0,0 +1,39 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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(SPIRIT_SEQUENCE_BASE_ID_MAR_15_2009_1243PM)
+#define SPIRIT_SEQUENCE_BASE_ID_MAR_15_2009_1243PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+
+namespace boost { namespace spirit { namespace traits
+{
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(sequence_base_id)
+ }
+
+ // We specialize this for sequences (see support/attributes.hpp).
+ // For sequences, we only wrap the attribute in a tuple IFF
+ // it is not already a fusion tuple.
+ //
+ // Note: in the comment above, "sequence" is a spirit sequence
+ // component (parser or generator), and a tuple is a fusion sequence
+ // (to avoid terminology confusion).
+ template <typename Derived, typename Attribute>
+ struct pass_attribute<Derived, Attribute,
+ typename enable_if<detail::has_sequence_base_id<Derived> >::type>
+ : wrap_if_not_tuple<Attribute> {};
+
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/string_traits.hpp b/boost/spirit/home/support/string_traits.hpp
new file mode 100644
index 0000000000..f970012b44
--- /dev/null
+++ b/boost/spirit/home/support/string_traits.hpp
@@ -0,0 +1,358 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ 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)
+================================================_==============================*/
+#if !defined(BOOST_SPIRIT_STRING_TRAITS_OCTOBER_2008_1252PM)
+#define BOOST_SPIRIT_STRING_TRAITS_OCTOBER_2008_1252PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/container.hpp>
+#include <string>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/proto/proto_fwd.hpp>
+#include <boost/type_traits/is_const.hpp>
+#if defined(__GNUC__) && (__GNUC__ < 4)
+#include <boost/type_traits/add_const.hpp>
+#endif
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine if T is a character type
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct is_char : mpl::false_ {};
+
+ template <typename T>
+ struct is_char<T const> : is_char<T> {};
+
+ template <>
+ struct is_char<char> : mpl::true_ {};
+
+ template <>
+ struct is_char<wchar_t> : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Determine if T is a string
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct is_string : mpl::false_ {};
+
+ template <typename T>
+ struct is_string<T const> : is_string<T> {};
+
+ template <>
+ struct is_string<char const*> : mpl::true_ {};
+
+ template <>
+ struct is_string<wchar_t const*> : mpl::true_ {};
+
+ template <>
+ struct is_string<char*> : mpl::true_ {};
+
+ template <>
+ struct is_string<wchar_t*> : mpl::true_ {};
+
+ template <std::size_t N>
+ struct is_string<char[N]> : mpl::true_ {};
+
+ template <std::size_t N>
+ struct is_string<wchar_t[N]> : mpl::true_ {};
+
+ template <std::size_t N>
+ struct is_string<char const[N]> : mpl::true_ {};
+
+ template <std::size_t N>
+ struct is_string<wchar_t const[N]> : mpl::true_ {};
+
+ template <std::size_t N>
+ struct is_string<char(&)[N]> : mpl::true_ {};
+
+ template <std::size_t N>
+ struct is_string<wchar_t(&)[N]> : mpl::true_ {};
+
+ template <std::size_t N>
+ struct is_string<char const(&)[N]> : mpl::true_ {};
+
+ template <std::size_t N>
+ struct is_string<wchar_t const(&)[N]> : mpl::true_ {};
+
+ template <typename T, typename Traits, typename Allocator>
+ struct is_string<std::basic_string<T, Traits, Allocator> > : mpl::true_ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Get the underlying char type of a string
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename T>
+ struct char_type_of;
+
+ template <typename T>
+ struct char_type_of<T const> : char_type_of<T> {};
+
+ template <>
+ struct char_type_of<char> : mpl::identity<char> {};
+
+ template <>
+ struct char_type_of<wchar_t> : mpl::identity<wchar_t> {};
+
+ template <>
+ struct char_type_of<char const*> : mpl::identity<char const> {};
+
+ template <>
+ struct char_type_of<wchar_t const*> : mpl::identity<wchar_t const> {};
+
+ template <>
+ struct char_type_of<char*> : mpl::identity<char> {};
+
+ template <>
+ struct char_type_of<wchar_t*> : mpl::identity<wchar_t> {};
+
+ template <std::size_t N>
+ struct char_type_of<char[N]> : mpl::identity<char> {};
+
+ template <std::size_t N>
+ struct char_type_of<wchar_t[N]> : mpl::identity<wchar_t> {};
+
+ template <std::size_t N>
+ struct char_type_of<char const[N]> : mpl::identity<char const> {};
+
+ template <std::size_t N>
+ struct char_type_of<wchar_t const[N]> : mpl::identity<wchar_t const> {};
+
+ template <std::size_t N>
+ struct char_type_of<char(&)[N]> : mpl::identity<char> {};
+
+ template <std::size_t N>
+ struct char_type_of<wchar_t(&)[N]> : mpl::identity<wchar_t> {};
+
+ template <std::size_t N>
+ struct char_type_of<char const(&)[N]> : mpl::identity<char const> {};
+
+ template <std::size_t N>
+ struct char_type_of<wchar_t const(&)[N]> : mpl::identity<wchar_t const> {};
+
+ template <typename T, typename Traits, typename Allocator>
+ struct char_type_of<std::basic_string<T, Traits, Allocator> >
+ : mpl::identity<T> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Get the C string from a string
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename String>
+ struct extract_c_string;
+
+ template <typename String>
+ struct extract_c_string
+ {
+ typedef typename char_type_of<String>::type char_type;
+
+ template <typename T>
+ static T const* call (T* str)
+ {
+ return (T const*)str;
+ }
+
+ template <typename T>
+ static T const* call (T const* str)
+ {
+ return str;
+ }
+ };
+
+ // Forwarder that strips const
+ template <typename T>
+ struct extract_c_string<T const>
+ {
+ typedef typename extract_c_string<T>::char_type char_type;
+
+ static typename extract_c_string<T>::char_type const* call (T const str)
+ {
+ return extract_c_string<T>::call(str);
+ }
+ };
+
+ // Forwarder that strips references
+ template <typename T>
+ struct extract_c_string<T&>
+ {
+ typedef typename extract_c_string<T>::char_type char_type;
+
+ static typename extract_c_string<T>::char_type const* call (T& str)
+ {
+ return extract_c_string<T>::call(str);
+ }
+ };
+
+ // Forwarder that strips const references
+ template <typename T>
+ struct extract_c_string<T const&>
+ {
+ typedef typename extract_c_string<T>::char_type char_type;
+
+ static typename extract_c_string<T>::char_type const* call (T const& str)
+ {
+ return extract_c_string<T>::call(str);
+ }
+ };
+
+ template <typename T, typename Traits, typename Allocator>
+ struct extract_c_string<std::basic_string<T, Traits, Allocator> >
+ {
+ typedef T char_type;
+
+ typedef std::basic_string<T, Traits, Allocator> string;
+
+ static T const* call (string const& str)
+ {
+ return str.c_str();
+ }
+ };
+
+ template <typename T>
+ typename extract_c_string<T*>::char_type const*
+ get_c_string (T* str)
+ {
+ return extract_c_string<T*>::call(str);
+ }
+
+ template <typename T>
+ typename extract_c_string<T const*>::char_type const*
+ get_c_string (T const* str)
+ {
+ return extract_c_string<T const*>::call(str);
+ }
+
+ template <typename String>
+ typename extract_c_string<String>::char_type const*
+ get_c_string (String& str)
+ {
+ return extract_c_string<String>::call(str);
+ }
+
+ template <typename String>
+ typename extract_c_string<String>::char_type const*
+ get_c_string (String const& str)
+ {
+ return extract_c_string<String>::call(str);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Get the begin/end iterators from a string
+ ///////////////////////////////////////////////////////////////////////////
+
+ // Implementation for C-style strings.
+
+// gcc 3.x.x has problems resolving ambiguities here
+#if defined(__GNUC__) && (__GNUC__ < 4)
+ template <typename T>
+ inline typename add_const<T>::type * get_begin(T* str) { return str; }
+
+ template <typename T>
+ inline typename add_const<T>::type* get_end(T* str)
+ {
+ T* last = str;
+ while (*last)
+ last++;
+ return last;
+ }
+#else
+ template <typename T>
+ inline T const* get_begin(T const* str) { return str; }
+
+ template <typename T>
+ inline T* get_begin(T* str) { return str; }
+
+ template <typename T>
+ inline T const* get_end(T const* str)
+ {
+ T const* last = str;
+ while (*last)
+ last++;
+ return last;
+ }
+
+ template <typename T>
+ inline T* get_end(T* str)
+ {
+ T* last = str;
+ while (*last)
+ last++;
+ return last;
+ }
+#endif
+
+ // Implementation for containers (includes basic_string).
+ template <typename T, typename Str>
+ inline typename Str::const_iterator get_begin(Str const& str)
+ { return str.begin(); }
+
+ template <typename T, typename Str>
+ inline typename Str::iterator
+ get_begin(Str& str BOOST_PROTO_DISABLE_IF_IS_CONST(Str))
+ { return str.begin(); }
+
+ template <typename T, typename Str>
+ inline typename Str::const_iterator get_end(Str const& str)
+ { return str.end(); }
+
+ template <typename T, typename Str>
+ inline typename Str::iterator
+ get_end(Str& str BOOST_PROTO_DISABLE_IF_IS_CONST(Str))
+ { return str.end(); }
+
+ // Default implementation for other types: try a C-style string
+ // conversion.
+ // These overloads are explicitly disabled for containers,
+ // as they would be ambiguous with the previous ones.
+ template <typename T, typename Str>
+ inline typename disable_if<is_container<Str>
+ , T const*>::type get_begin(Str const& str)
+ { return str; }
+
+ template <typename T, typename Str>
+ inline typename disable_if<is_container<Str>
+ , T const*>::type get_end(Str const& str)
+ { return get_end(get_begin<T>(str)); }
+}
+
+namespace result_of
+{
+ template <typename Char, typename T, typename Enable = void>
+ struct get_begin
+ {
+ typedef typename traits::char_type_of<T>::type char_type;
+
+ typedef typename mpl::if_<
+ is_const<char_type>
+ , char_type const
+ , char_type
+ >::type* type;
+ };
+
+ template <typename Char, typename Str>
+ struct get_begin<Char, Str
+ , typename enable_if<traits::is_container<Str> >::type>
+ {
+ typedef typename mpl::if_<
+ is_const<Str>
+ , typename Str::const_iterator
+ , typename Str::iterator
+ >::type type;
+ };
+
+ template <typename Char, typename T>
+ struct get_end : get_begin<Char, T> {};
+}
+
+}}
+
+#endif
diff --git a/boost/spirit/home/support/terminal.hpp b/boost/spirit/home/support/terminal.hpp
new file mode 100644
index 0000000000..d52fad2c3a
--- /dev/null
+++ b/boost/spirit/home/support/terminal.hpp
@@ -0,0 +1,655 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Thomas Heller
+
+ Distributed under the 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_SPIRIT_TERMINAL_NOVEMBER_04_2008_0906AM)
+#define BOOST_SPIRIT_TERMINAL_NOVEMBER_04_2008_0906AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/proto/proto.hpp>
+#include <boost/fusion/include/void.hpp>
+#include <boost/spirit/home/support/meta_compiler.hpp>
+#include <boost/spirit/home/support/detail/make_vector.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/detail/is_spirit_tag.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#include <boost/spirit/home/support/terminal_expression.hpp>
+
+namespace boost { namespace spirit
+{
+ template <typename Terminal, typename Args>
+ struct terminal_ex
+ {
+ typedef Terminal terminal_type;
+ typedef Args args_type;
+
+ terminal_ex(Args const& args)
+ : args(args) {}
+ terminal_ex(Args const& args, Terminal const& term)
+ : args(args), term(term) {}
+
+ Args args; // Args is guaranteed to be a fusion::vectorN so you
+ // can use that template for detection and specialization
+ Terminal term;
+ };
+
+ template <typename Terminal, typename Actor, int Arity>
+ struct lazy_terminal
+ {
+ typedef Terminal terminal_type;
+ typedef Actor actor_type;
+ static int const arity = Arity;
+
+ lazy_terminal(Actor const& actor)
+ : actor(actor) {}
+ lazy_terminal(Actor const& actor, Terminal const& term)
+ : actor(actor), term(term) {}
+
+ Actor actor;
+ Terminal term;
+ };
+
+ template <typename Domain, typename Terminal, int Arity, typename Enable = void>
+ struct use_lazy_terminal : mpl::false_ {};
+
+ template <typename Domain, typename Terminal, int Arity, typename Enable = void>
+ struct use_lazy_directive : mpl::false_ {};
+
+ template <typename Terminal>
+ struct terminal;
+
+ template <typename Domain, typename Terminal>
+ struct use_terminal<Domain, terminal<Terminal> >
+ : use_terminal<Domain, Terminal> {};
+
+ template <typename Domain, typename Terminal, int Arity, typename Actor>
+ struct use_terminal<Domain, lazy_terminal<Terminal, Actor, Arity> >
+ : use_lazy_terminal<Domain, Terminal, Arity> {};
+
+ template <typename Domain, typename Terminal, int Arity, typename Actor>
+ struct use_directive<Domain, lazy_terminal<Terminal, Actor, Arity> >
+ : use_lazy_directive<Domain, Terminal, Arity> {};
+
+ template <
+ typename F
+ , typename A0 = unused_type
+ , typename A1 = unused_type
+ , typename A2 = unused_type
+ , typename Unused = unused_type
+ >
+ struct make_lazy;
+
+ template <typename F, typename A0>
+ struct make_lazy<F, A0>
+ {
+ typedef typename
+ proto::terminal<
+ lazy_terminal<
+ typename F::terminal_type
+ , typename phoenix::detail::expression::function_eval<F, A0>::type
+ , 1 // arity
+ >
+ >::type
+ result_type;
+ typedef result_type type;
+
+ result_type
+ operator()(F f, A0 const& _0) const
+ {
+ typedef typename result_type::proto_child0 child_type;
+ return result_type::make(child_type(
+ phoenix::detail::expression::function_eval<F, A0>::make(f, _0)
+ , f.proto_base().child0
+ ));
+ }
+ };
+
+ template <typename F, typename A0, typename A1>
+ struct make_lazy<F, A0, A1>
+ {
+ typedef typename
+ proto::terminal<
+ lazy_terminal<
+ typename F::terminal_type
+ , typename phoenix::detail::expression::function_eval<F, A0, A1>::type
+ , 2 // arity
+ >
+ >::type
+ result_type;
+ typedef result_type type;
+
+ result_type
+ operator()(F f, A0 const& _0, A1 const& _1) const
+ {
+ typedef typename result_type::proto_child0 child_type;
+ return result_type::make(child_type(
+ phoenix::detail::expression::function_eval<F, A0, A1>::make(f, _0, _1)
+ , f.proto_base().child0
+ ));
+ }
+ };
+
+ template <typename F, typename A0, typename A1, typename A2>
+ struct make_lazy<F, A0, A1, A2>
+ {
+ typedef typename
+ proto::terminal<
+ lazy_terminal<
+ typename F::terminal_type
+ , typename phoenix::detail::expression::function_eval<F, A0, A1, A2>::type
+ , 3 // arity
+ >
+ >::type
+ result_type;
+ typedef result_type type;
+
+ result_type
+ operator()(F f, A0 const& _0, A1 const& _1, A2 const& _2) const
+ {
+ typedef typename result_type::proto_child0 child_type;
+ return result_type::make(child_type(
+ phoenix::detail::expression::function_eval<F, A0, A1, A2>::make(f, _0, _1, _2)
+ , f.proto_base().child0
+ ));
+ }
+ };
+
+ namespace detail
+ {
+ // Helper struct for SFINAE purposes
+ template <bool C> struct bool_;
+
+ template <>
+ struct bool_<true> : mpl::bool_<true>
+ {
+ typedef bool_<true>* is_true;
+ };
+
+ template <>
+ struct bool_<false> : mpl::bool_<false>
+ {
+ typedef bool_<false>* is_false;
+ };
+
+ // Metafunction to detect if at least one arg is a Phoenix actor
+ template <
+ typename A0
+ , typename A1 = unused_type
+ , typename A2 = unused_type
+ >
+ struct contains_actor
+ : bool_<
+ phoenix::is_actor<A0>::value
+ || phoenix::is_actor<A1>::value
+ || phoenix::is_actor<A2>::value
+ >
+ {};
+
+ // to_lazy_arg: convert a terminal arg type to the type make_lazy needs
+ template <typename A>
+ struct to_lazy_arg
+ : phoenix::as_actor<A> // wrap A in a Phoenix actor if not already one
+ {};
+
+ template <typename A>
+ struct to_lazy_arg<const A>
+ : to_lazy_arg<A>
+ {};
+
+ template <typename A>
+ struct to_lazy_arg<A &>
+ : to_lazy_arg<A>
+ {};
+
+ template <>
+ struct to_lazy_arg<unused_type>
+ {
+ // unused arg: make_lazy wants unused_type
+ typedef unused_type type;
+ };
+
+ // to_nonlazy_arg: convert a terminal arg type to the type make_vector needs
+ template <typename A>
+ struct to_nonlazy_arg
+ {
+ // identity
+ typedef A type;
+ };
+
+ template <typename A>
+ struct to_nonlazy_arg<const A>
+ : to_nonlazy_arg<A>
+ {};
+
+ template <typename A>
+ struct to_nonlazy_arg<A &>
+ : to_nonlazy_arg<A>
+ {};
+
+ template <>
+ struct to_nonlazy_arg<unused_type>
+ {
+ // unused arg: make_vector wants fusion::void_
+ typedef fusion::void_ type;
+ };
+ }
+
+ template <typename Terminal>
+ struct terminal
+ : proto::extends<
+ typename proto::terminal<Terminal>::type
+ , terminal<Terminal>
+ >
+ {
+ typedef terminal<Terminal> this_type;
+ typedef Terminal terminal_type;
+
+ typedef proto::extends<
+ typename proto::terminal<Terminal>::type
+ , terminal<Terminal>
+ > base_type;
+
+ terminal() {}
+
+ terminal(Terminal const& t)
+ : base_type(proto::terminal<Terminal>::type::make(t))
+ {}
+
+ template <
+ bool Lazy
+ , typename A0
+ , typename A1
+ , typename A2
+ >
+ struct result_helper;
+
+ template <
+ typename A0
+ , typename A1
+ , typename A2
+ >
+ struct result_helper<false, A0, A1, A2>
+ {
+ typedef typename
+ proto::terminal<
+ terminal_ex<
+ Terminal
+ , typename detail::result_of::make_vector<
+ typename detail::to_nonlazy_arg<A0>::type
+ , typename detail::to_nonlazy_arg<A1>::type
+ , typename detail::to_nonlazy_arg<A2>::type>::type>
+ >::type
+ type;
+ };
+
+ template <
+ typename A0
+ , typename A1
+ , typename A2
+ >
+ struct result_helper<true, A0, A1, A2>
+ {
+ typedef typename
+ make_lazy<this_type
+ , typename detail::to_lazy_arg<A0>::type
+ , typename detail::to_lazy_arg<A1>::type
+ , typename detail::to_lazy_arg<A2>::type>::type
+ type;
+ };
+
+ // FIXME: we need to change this to conform to the result_of protocol
+ template <
+ typename A0
+ , typename A1 = unused_type
+ , typename A2 = unused_type // Support up to 3 args
+ >
+ struct result
+ {
+ typedef typename
+ result_helper<
+ detail::contains_actor<A0, A1, A2>::value
+ , A0, A1, A2
+ >::type
+ type;
+ };
+
+ template <typename This, typename A0>
+ struct result<This(A0)>
+ {
+ typedef typename
+ result_helper<
+ detail::contains_actor<A0, unused_type, unused_type>::value
+ , A0, unused_type, unused_type
+ >::type
+ type;
+ };
+
+ template <typename This, typename A0, typename A1>
+ struct result<This(A0, A1)>
+ {
+ typedef typename
+ result_helper<
+ detail::contains_actor<A0, A1, unused_type>::value
+ , A0, A1, unused_type
+ >::type
+ type;
+ };
+
+
+ template <typename This, typename A0, typename A1, typename A2>
+ struct result<This(A0, A1, A2)>
+ {
+ typedef typename
+ result_helper<
+ detail::contains_actor<A0, A1, A2>::value
+ , A0, A1, A2
+ >::type
+ type;
+ };
+
+ // Note: in the following overloads, SFINAE cannot
+ // be done on return type because of gcc bug #24915:
+ // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24915
+ // Hence an additional, fake argument is used for SFINAE,
+ // using a type which can never be a real argument type.
+
+ // Non-lazy overloads. Only enabled when all
+ // args are immediates (no Phoenix actor).
+
+ template <typename A0>
+ typename result<A0>::type
+ operator()(A0 const& _0
+ , typename detail::contains_actor<A0>::is_false = 0) const
+ {
+ typedef typename result<A0>::type result_type;
+ typedef typename result_type::proto_child0 child_type;
+ return result_type::make(
+ child_type(
+ detail::make_vector(_0)
+ , this->proto_base().child0)
+ );
+ }
+
+ template <typename A0, typename A1>
+ typename result<A0, A1>::type
+ operator()(A0 const& _0, A1 const& _1
+ , typename detail::contains_actor<A0, A1>::is_false = 0) const
+ {
+ typedef typename result<A0, A1>::type result_type;
+ typedef typename result_type::proto_child0 child_type;
+ return result_type::make(
+ child_type(
+ detail::make_vector(_0, _1)
+ , this->proto_base().child0)
+ );
+ }
+
+ template <typename A0, typename A1, typename A2>
+ typename result<A0, A1, A2>::type
+ operator()(A0 const& _0, A1 const& _1, A2 const& _2
+ , typename detail::contains_actor<A0, A1, A2>::is_false = 0) const
+ {
+ typedef typename result<A0, A1, A2>::type result_type;
+ typedef typename result_type::proto_child0 child_type;
+ return result_type::make(
+ child_type(
+ detail::make_vector(_0, _1, _2)
+ , this->proto_base().child0)
+ );
+ }
+
+ // Lazy overloads. Enabled when at
+ // least one arg is a Phoenix actor.
+ template <typename A0>
+ typename result<A0>::type
+ operator()(A0 const& _0
+ , typename detail::contains_actor<A0>::is_true = 0) const
+ {
+ return make_lazy<this_type
+ , typename phoenix::as_actor<A0>::type>()(*this
+ , phoenix::as_actor<A0>::convert(_0));
+ }
+
+ template <typename A0, typename A1>
+ typename result<A0, A1>::type
+ operator()(A0 const& _0, A1 const& _1
+ , typename detail::contains_actor<A0, A1>::is_true = 0) const
+ {
+ return make_lazy<this_type
+ , typename phoenix::as_actor<A0>::type
+ , typename phoenix::as_actor<A1>::type>()(*this
+ , phoenix::as_actor<A0>::convert(_0)
+ , phoenix::as_actor<A1>::convert(_1));
+ }
+
+ template <typename A0, typename A1, typename A2>
+ typename result<A0, A1, A2>::type
+ operator()(A0 const& _0, A1 const& _1, A2 const& _2
+ , typename detail::contains_actor<A0, A1, A2>::is_true = 0) const
+ {
+ return make_lazy<this_type
+ , typename phoenix::as_actor<A0>::type
+ , typename phoenix::as_actor<A1>::type
+ , typename phoenix::as_actor<A2>::type>()(*this
+ , phoenix::as_actor<A0>::convert(_0)
+ , phoenix::as_actor<A1>::convert(_1)
+ , phoenix::as_actor<A2>::convert(_2));
+ }
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ terminal& operator= (terminal const&);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace result_of
+ {
+ // Calculate the type of the compound terminal if generated by one of
+ // the spirit::terminal::operator() overloads above
+
+ // The terminal type itself is passed through without modification
+ template <typename Tag>
+ struct terminal
+ {
+ typedef spirit::terminal<Tag> type;
+ };
+
+ template <typename Tag, typename A0>
+ struct terminal<Tag(A0)>
+ {
+ typedef typename spirit::terminal<Tag>::
+ template result<A0>::type type;
+ };
+
+ template <typename Tag, typename A0, typename A1>
+ struct terminal<Tag(A0, A1)>
+ {
+ typedef typename spirit::terminal<Tag>::
+ template result<A0, A1>::type type;
+ };
+
+ template <typename Tag, typename A0, typename A1, typename A2>
+ struct terminal<Tag(A0, A1, A2)>
+ {
+ typedef typename spirit::terminal<Tag>::
+ template result<A0, A1, A2>::type type;
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // support for stateful tag types
+ namespace tag
+ {
+ template <
+ typename Data, typename Tag
+ , typename DataTag1 = unused_type, typename DataTag2 = unused_type>
+ struct stateful_tag
+ {
+ BOOST_SPIRIT_IS_TAG()
+
+ typedef Data data_type;
+
+ stateful_tag() {}
+ stateful_tag(data_type const& data) : data_(data) {}
+
+ data_type data_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ stateful_tag& operator= (stateful_tag const&);
+ };
+ }
+
+ template <
+ typename Data, typename Tag
+ , typename DataTag1 = unused_type, typename DataTag2 = unused_type>
+ struct stateful_tag_type
+ : spirit::terminal<tag::stateful_tag<Data, Tag, DataTag1, DataTag2> >
+ {
+ typedef tag::stateful_tag<Data, Tag, DataTag1, DataTag2> tag_type;
+
+ stateful_tag_type() {}
+ stateful_tag_type(Data const& data)
+ : spirit::terminal<tag_type>(data)
+ {}
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ stateful_tag_type& operator= (stateful_tag_type const&);
+ };
+
+ namespace detail
+ {
+ // extract expression if this is a Tag
+ template <typename StatefulTag>
+ struct get_stateful_data
+ {
+ typedef typename StatefulTag::data_type data_type;
+
+ // is invoked if given tag is != Tag
+ template <typename Tag_>
+ static data_type call(Tag_) { return data_type(); }
+
+ // this is invoked if given tag is same as'Tag'
+ static data_type const& call(StatefulTag const& t) { return t.data_; }
+ };
+ }
+
+}}
+
+#ifdef BOOST_SPIRIT_USE_PHOENIX_V3
+namespace boost { namespace phoenix
+{
+ template <typename Tag>
+ struct is_custom_terminal<Tag, typename Tag::is_spirit_tag>
+ : mpl::true_
+ {};
+
+ template <typename Tag>
+ struct custom_terminal<Tag, typename Tag::is_spirit_tag>
+ {
+ typedef spirit::terminal<Tag> result_type;
+
+ template <typename Context>
+ result_type operator()(Tag const & t, Context const &)
+ {
+ return spirit::terminal<Tag>(t);
+ }
+ };
+}}
+#endif
+
+// Define a spirit terminal. This macro may be placed in any namespace.
+// Common placeholders are placed in the main boost::spirit namespace
+// (see common_terminals.hpp)
+
+#define BOOST_SPIRIT_TERMINAL_X(x, y) ((x, y)) BOOST_SPIRIT_TERMINAL_Y
+#define BOOST_SPIRIT_TERMINAL_Y(x, y) ((x, y)) BOOST_SPIRIT_TERMINAL_X
+#define BOOST_SPIRIT_TERMINAL_X0
+#define BOOST_SPIRIT_TERMINAL_Y0
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+#define BOOST_SPIRIT_TERMINAL_NAME(name, type_name) \
+ namespace tag { struct name { BOOST_SPIRIT_IS_TAG() }; } \
+ typedef boost::proto::terminal<tag::name>::type type_name; \
+ type_name const name = {{}}; \
+ inline void BOOST_PP_CAT(silence_unused_warnings_, name)() { (void) name; } \
+ /***/
+
+#else
+
+#define BOOST_SPIRIT_TERMINAL_NAME(name, type_name) \
+ namespace tag { struct name { BOOST_SPIRIT_IS_TAG() }; } \
+ typedef boost::proto::terminal<tag::name>::type type_name; \
+ /***/
+
+#endif
+
+#define BOOST_SPIRIT_TERMINAL(name) \
+ BOOST_SPIRIT_TERMINAL_NAME(name, name ## _type) \
+ /***/
+
+#define BOOST_SPIRIT_DEFINE_TERMINALS_NAME_A(r, _, names) \
+ BOOST_SPIRIT_TERMINAL_NAME( \
+ BOOST_PP_TUPLE_ELEM(2, 0, names), \
+ BOOST_PP_TUPLE_ELEM(2, 1, names) \
+ ) \
+ /***/
+
+#define BOOST_SPIRIT_DEFINE_TERMINALS_NAME(seq) \
+ BOOST_PP_SEQ_FOR_EACH(BOOST_SPIRIT_DEFINE_TERMINALS_NAME_A, _, \
+ BOOST_PP_CAT(BOOST_SPIRIT_TERMINAL_X seq, 0)) \
+ /***/
+
+// Define a spirit extended terminal. This macro may be placed in any namespace.
+// Common placeholders are placed in the main boost::spirit namespace
+// (see common_terminals.hpp)
+
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+
+#define BOOST_SPIRIT_TERMINAL_NAME_EX(name, type_name) \
+ namespace tag { struct name { BOOST_SPIRIT_IS_TAG() }; } \
+ typedef boost::spirit::terminal<tag::name> type_name; \
+ type_name const name = type_name(); \
+ inline void BOOST_PP_CAT(silence_unused_warnings_, name)() { (void) name; } \
+ /***/
+
+#else
+
+#define BOOST_SPIRIT_TERMINAL_NAME_EX(name, type_name) \
+ namespace tag { struct name { BOOST_SPIRIT_IS_TAG() }; } \
+ typedef boost::spirit::terminal<tag::name> type_name; \
+ /***/
+
+#endif
+
+#define BOOST_SPIRIT_TERMINAL_EX(name) \
+ BOOST_SPIRIT_TERMINAL_NAME_EX(name, name ## _type) \
+ /***/
+
+#define BOOST_SPIRIT_DEFINE_TERMINALS_NAME_EX_A(r, _, names) \
+ BOOST_SPIRIT_TERMINAL_NAME_EX( \
+ BOOST_PP_TUPLE_ELEM(2, 0, names), \
+ BOOST_PP_TUPLE_ELEM(2, 1, names) \
+ ) \
+ /***/
+
+#define BOOST_SPIRIT_DEFINE_TERMINALS_NAME_EX(seq) \
+ BOOST_PP_SEQ_FOR_EACH(BOOST_SPIRIT_DEFINE_TERMINALS_NAME_EX_A, _, \
+ BOOST_PP_CAT(BOOST_SPIRIT_TERMINAL_X seq, 0)) \
+ /***/
+
+#endif
+
+
diff --git a/boost/spirit/home/support/terminal_expression.hpp b/boost/spirit/home/support/terminal_expression.hpp
new file mode 100644
index 0000000000..cf6bc5de54
--- /dev/null
+++ b/boost/spirit/home/support/terminal_expression.hpp
@@ -0,0 +1,75 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Thomas Heller
+
+ Distributed under the 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_SPIRIT_TERMINAL_EXPRESSION_MARCH_24_2011_1210AM)
+#define BOOST_SPIRIT_TERMINAL_EXPRESSION_MARCH_24_2011_1210AM
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+
+namespace boost { namespace phoenix { namespace detail
+{
+ namespace expression
+ {
+ template <
+ typename F, typename A0 = void, typename A1 = void
+ , typename A2 = void, typename Dummy = void>
+ struct function_eval;
+
+ template <typename F, typename A0>
+ struct function_eval<F, A0>
+ {
+ typedef phoenix::actor<
+ typename phoenix::as_composite<
+ phoenix::detail::function_eval<1>, F, A0
+ >::type
+ > type;
+
+ static type make(F f, A0 const & _0)
+ {
+ return phoenix::compose<
+ phoenix::detail::function_eval<1> >(f, _0);
+ }
+ };
+
+ template <typename F, typename A0, typename A1>
+ struct function_eval<F, A0, A1>
+ {
+ typedef phoenix::actor<
+ typename phoenix::as_composite<
+ phoenix::detail::function_eval<2>, F, A0, A1
+ >::type
+ > type;
+
+ static type make(F f, A0 const & _0, A1 const & _1)
+ {
+ return phoenix::compose<
+ phoenix::detail::function_eval<2> >(f, _0, _1);
+ }
+ };
+
+ template <typename F, typename A0, typename A1, typename A2>
+ struct function_eval<F, A0, A1, A2>
+ {
+ typedef phoenix::actor<
+ typename phoenix::as_composite<
+ phoenix::detail::function_eval<3>, F, A0, A1, A2
+ >::type
+ > type;
+
+ static type make(F f, A0 const & _0, A1 const & _1, A2 const & _2)
+ {
+ return phoenix::compose<
+ phoenix::detail::function_eval<3> >(f, _0, _1, _2);
+ }
+ };
+ }
+}}}
+
+#endif // !BOOST_SPIRIT_USE_PHOENIX_V3
+
+#endif
diff --git a/boost/spirit/home/support/unused.hpp b/boost/spirit/home/support/unused.hpp
new file mode 100644
index 0000000000..4197d6af57
--- /dev/null
+++ b/boost/spirit/home/support/unused.hpp
@@ -0,0 +1,105 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_UNUSED_APRIL_16_2006_0616PM)
+#define BOOST_SPIRIT_UNUSED_APRIL_16_2006_0616PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4522) // multiple assignment operators specified warning
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // We do not import fusion ::unused_type anymore to avoid boost::fusion
+ // being turned into an associate namespace for boost::spirit, as this
+ // interferes with ADL in unexpected ways. We rather copy the full
+ // unused_type implementation from boost::fusion.
+ ///////////////////////////////////////////////////////////////////////////
+ struct unused_type
+ {
+ unused_type()
+ {
+ }
+
+ template <typename T>
+ unused_type(T const&)
+ {
+ }
+
+ template <typename T>
+ unused_type const&
+ operator=(T const&) const
+ {
+ return *this;
+ }
+
+ template <typename T>
+ unused_type&
+ operator=(T const&)
+ {
+ return *this;
+ }
+
+ unused_type const&
+ operator=(unused_type const&) const
+ {
+ return *this;
+ }
+
+ unused_type&
+ operator=(unused_type const&)
+ {
+ return *this;
+ }
+ };
+
+ unused_type const unused = unused_type();
+
+ namespace detail
+ {
+ struct unused_only
+ {
+ unused_only(unused_type const&) {}
+ };
+ }
+
+ template <typename Out>
+ inline Out& operator<<(Out& out, detail::unused_only const&)
+ {
+ return out;
+ }
+
+ template <typename In>
+ inline In& operator>>(In& in, unused_type&)
+ {
+ return in;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace traits
+ {
+ // We use this test to detect if the argument is not an unused_type
+ template <typename T> struct not_is_unused : mpl::true_ {};
+ template <> struct not_is_unused<unused_type> : mpl::false_ {};
+ }
+}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/utf8.hpp b/boost/spirit/home/support/utf8.hpp
new file mode 100644
index 0000000000..c4883428b1
--- /dev/null
+++ b/boost/spirit/home/support/utf8.hpp
@@ -0,0 +1,72 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_UC_TYPES_NOVEMBER_23_2008_0840PM)
+#define BOOST_SPIRIT_UC_TYPES_NOVEMBER_23_2008_0840PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/cstdint.hpp>
+#include <boost/foreach.hpp>
+#include <boost/regex/pending/unicode_iterator.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <string>
+
+namespace boost { namespace spirit
+{
+ typedef ::boost::uint32_t ucs4_char;
+ typedef char utf8_char;
+ typedef std::basic_string<ucs4_char> ucs4_string;
+ typedef std::basic_string<utf8_char> utf8_string;
+
+ template <typename Char>
+ inline utf8_string to_utf8(Char value)
+ {
+ // always store as UTF8
+ utf8_string result;
+ typedef std::back_insert_iterator<utf8_string> insert_iter;
+ insert_iter out_iter(result);
+ utf8_output_iterator<insert_iter> utf8_iter(out_iter);
+ typedef typename make_unsigned<Char>::type UChar;
+ *utf8_iter = (UChar)value;
+ return result;
+ }
+
+ template <typename Char>
+ inline utf8_string to_utf8(Char const* str)
+ {
+ // always store as UTF8
+ utf8_string result;
+ typedef std::back_insert_iterator<utf8_string> insert_iter;
+ insert_iter out_iter(result);
+ utf8_output_iterator<insert_iter> utf8_iter(out_iter);
+ typedef typename make_unsigned<Char>::type UChar;
+ while (*str)
+ *utf8_iter++ = (UChar)*str++;
+ return result;
+ }
+
+ template <typename Char, typename Traits, typename Allocator>
+ inline utf8_string
+ to_utf8(std::basic_string<Char, Traits, Allocator> const& str)
+ {
+ // always store as UTF8
+ utf8_string result;
+ typedef std::back_insert_iterator<utf8_string> insert_iter;
+ insert_iter out_iter(result);
+ utf8_output_iterator<insert_iter> utf8_iter(out_iter);
+ typedef typename make_unsigned<Char>::type UChar;
+ BOOST_FOREACH(Char ch, str)
+ {
+ *utf8_iter++ = (UChar)ch;
+ }
+ return result;
+ }
+}}
+
+#endif
diff --git a/boost/spirit/home/support/utree.hpp b/boost/spirit/home/support/utree.hpp
new file mode 100644
index 0000000000..8b85047aac
--- /dev/null
+++ b/boost/spirit/home/support/utree.hpp
@@ -0,0 +1,20 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_UTREE_NOV_30_2010_1246PM)
+#define BOOST_SPIRIT_UTREE_NOV_30_2010_1246PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/utree/utree_traits_fwd.hpp>
+#include <boost/spirit/home/support/utree/utree.hpp>
+#include <boost/spirit/home/support/utree/operators.hpp>
+#include <boost/spirit/home/support/utree/detail/utree_detail2.hpp>
+#include <boost/spirit/home/support/utree/utree_traits.hpp>
+
+#endif
diff --git a/boost/spirit/home/support/utree/detail/utree_detail1.hpp b/boost/spirit/home/support/utree/detail/utree_detail1.hpp
new file mode 100644
index 0000000000..dc5a9c477c
--- /dev/null
+++ b/boost/spirit/home/support/utree/detail/utree_detail1.hpp
@@ -0,0 +1,146 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_UTREE_DETAIL1)
+#define BOOST_SPIRIT_UTREE_DETAIL1
+
+#include <boost/type_traits/alignment_of.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ template <typename UTreeX, typename UTreeY>
+ struct visit_impl;
+
+ struct index_impl;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Our POD double linked list. Straightforward implementation.
+ // This implementation is very primitive and is not meant to be
+ // used stand-alone. This is the internal data representation
+ // of lists in our utree.
+ ///////////////////////////////////////////////////////////////////////////
+ struct list // keep this a POD!
+ {
+ struct node;
+
+ template <typename Value>
+ class node_iterator;
+
+ void free();
+ void copy(list const& other);
+ void default_construct();
+
+ template <typename T, typename Iterator>
+ void insert(T const& val, Iterator pos);
+
+ template <typename T>
+ void push_front(T const& val);
+
+ template <typename T>
+ void push_back(T const& val);
+
+ void pop_front();
+ void pop_back();
+ node* erase(node* pos);
+
+ node* first;
+ node* last;
+ std::size_t size;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // A range of utree(s) using an iterator range (begin/end) of node(s)
+ ///////////////////////////////////////////////////////////////////////////
+ struct range
+ {
+ list::node* first;
+ list::node* last;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // A range of char*s
+ ///////////////////////////////////////////////////////////////////////////
+ struct string_range
+ {
+ char const* first;
+ char const* last;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // A void* plus type_info
+ ///////////////////////////////////////////////////////////////////////////
+ struct void_ptr
+ {
+ void* p;
+ std::type_info const* i;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Our POD fast string. This implementation is very primitive and is not
+ // meant to be used stand-alone. This is the internal data representation
+ // of strings in our utree. This is deliberately a POD to allow it to be
+ // placed in a union. This POD fast string specifically utilizes
+ // (sizeof(list) * alignment_of(list)) - (2 * sizeof(char)). In a 32 bit
+ // system, this is 14 bytes. The two extra bytes are used by utree to store
+ // management info.
+ //
+ // It is a const string (i.e. immutable). It stores the characters directly
+ // if possible and only uses the heap if the string does not fit. Null
+ // characters are allowed, making it suitable to encode raw binary. The
+ // string length is encoded in the first byte if the string is placed in-situ,
+ // else, the length plus a pointer to the string in the heap are stored.
+ ///////////////////////////////////////////////////////////////////////////
+ struct fast_string // Keep this a POD!
+ {
+ static std::size_t const
+ buff_size = (sizeof(list) + boost::alignment_of<list>::value)
+ / sizeof(char);
+
+ static std::size_t const
+ small_string_size = buff_size-sizeof(char);
+
+ static std::size_t const
+ max_string_len = small_string_size - 3;
+
+ struct heap_store
+ {
+ char* str;
+ std::size_t size;
+ };
+
+ union
+ {
+ char buff[buff_size];
+ long lbuff[buff_size / (sizeof(long)/sizeof(char))]; // for initialize
+ heap_store heap;
+ };
+
+ int get_type() const;
+ void set_type(int t);
+ bool is_heap_allocated() const;
+
+ std::size_t size() const;
+ char const* str() const;
+
+ template <typename Iterator>
+ void construct(Iterator f, Iterator l);
+
+ void swap(fast_string& other);
+ void free();
+ void copy(fast_string const& other);
+ void initialize();
+
+ char& info();
+ char info() const;
+
+ short tag() const;
+ void tag(short tag);
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/utree/detail/utree_detail2.hpp b/boost/spirit/home/support/utree/detail/utree_detail2.hpp
new file mode 100644
index 0000000000..f08e199cfb
--- /dev/null
+++ b/boost/spirit/home/support/utree/detail/utree_detail2.hpp
@@ -0,0 +1,1632 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_UTREE_DETAIL2)
+#define BOOST_SPIRIT_UTREE_DETAIL2
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4800)
+#endif
+
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/iterator/iterator_traits.hpp>
+
+namespace boost { namespace spirit { namespace detail
+{
+ inline char& fast_string::info()
+ {
+ return buff[small_string_size];
+ }
+
+ inline char fast_string::info() const
+ {
+ return buff[small_string_size];
+ }
+
+ inline int fast_string::get_type() const
+ {
+ return info() >> 1;
+ }
+
+ inline void fast_string::set_type(int t)
+ {
+ info() = (t << 1) | (info() & 1);
+ }
+
+ inline short fast_string::tag() const
+ {
+ return (int(buff[small_string_size-2]) << 8) + (unsigned char)buff[small_string_size-1];
+ }
+
+ inline void fast_string::tag(short tag)
+ {
+ buff[small_string_size-2] = tag >> 8;
+ buff[small_string_size-1] = tag & 0xff;
+ }
+
+ inline bool fast_string::is_heap_allocated() const
+ {
+ return info() & 1;
+ }
+
+ inline std::size_t fast_string::size() const
+ {
+ if (is_heap_allocated())
+ return heap.size;
+ else
+ return max_string_len - buff[max_string_len];
+ }
+
+ inline char const* fast_string::str() const
+ {
+ if (is_heap_allocated())
+ return heap.str;
+ else
+ return buff;
+ }
+
+ template <typename Iterator>
+ inline void fast_string::construct(Iterator f, Iterator l)
+ {
+ unsigned const size = l-f;
+ char* str;
+ if (size < max_string_len)
+ {
+ // if it fits, store it in-situ; small_string_size minus the length
+ // of the string is placed in buff[small_string_size - 1]
+ str = buff;
+ buff[max_string_len] = static_cast<char>(max_string_len - size);
+ info() &= ~0x1;
+ }
+ else
+ {
+ // else, store it in the heap
+ str = new char[size + 1]; // add one for the null char
+ heap.str = str;
+ heap.size = size;
+ info() |= 0x1;
+ }
+ for (std::size_t i = 0; i != size; ++i)
+ {
+ *str++ = *f++;
+ }
+ *str = '\0'; // add the null char
+ }
+
+ inline void fast_string::swap(fast_string& other)
+ {
+ std::swap(*this, other);
+ }
+
+ inline void fast_string::free()
+ {
+ if (is_heap_allocated())
+ {
+ delete [] heap.str;
+ }
+ }
+
+ inline void fast_string::copy(fast_string const& other)
+ {
+ construct(other.str(), other.str() + other.size());
+ }
+
+ inline void fast_string::initialize()
+ {
+ for (std::size_t i = 0; i != buff_size / (sizeof(long)/sizeof(char)); ++i)
+ lbuff[i] = 0;
+ }
+
+ struct list::node : boost::noncopyable
+ {
+ template <typename T>
+ node(T const& val, node* next, node* prev)
+ : val(val), next(next), prev(prev) {}
+
+ void unlink()
+ {
+ prev->next = next;
+ next->prev = prev;
+ }
+
+ utree val;
+ node* next;
+ node* prev;
+ };
+
+ template <typename Value>
+ class list::node_iterator
+ : public boost::iterator_facade<
+ node_iterator<Value>
+ , Value
+ , boost::bidirectional_traversal_tag>
+ {
+ public:
+
+ node_iterator()
+ : node(0), prev(0) {}
+
+ node_iterator(list::node* node, list::node* prev)
+ : node(node), prev(prev) {}
+
+ private:
+
+ friend class boost::iterator_core_access;
+ friend class boost::spirit::utree;
+ friend struct boost::spirit::detail::list;
+
+ void increment()
+ {
+ if (node != 0) // not at end
+ {
+ prev = node;
+ node = node->next;
+ }
+ }
+
+ void decrement()
+ {
+ if (prev != 0) // not at begin
+ {
+ node = prev;
+ prev = prev->prev;
+ }
+ }
+
+ bool equal(node_iterator const& other) const
+ {
+ return node == other.node;
+ }
+
+ typename node_iterator::reference dereference() const
+ {
+ return node->val;
+ }
+
+ list::node* node;
+ list::node* prev;
+ };
+
+ template <typename Value>
+ class list::node_iterator<boost::reference_wrapper<Value> >
+ : public boost::iterator_facade<
+ node_iterator<boost::reference_wrapper<Value> >
+ , boost::reference_wrapper<Value>
+ , boost::bidirectional_traversal_tag>
+ {
+ public:
+
+ node_iterator()
+ : node(0), prev(0), curr(nil_node) {}
+
+ node_iterator(list::node* node, list::node* prev)
+ : node(node), prev(prev), curr(node ? node->val : nil_node) {}
+
+ private:
+
+ friend class boost::iterator_core_access;
+ friend class boost::spirit::utree;
+ friend struct boost::spirit::detail::list;
+
+ void increment()
+ {
+ if (node != 0) // not at end
+ {
+ prev = node;
+ node = node->next;
+ curr = boost::ref(node ? node->val : nil_node);
+ }
+ }
+
+ void decrement()
+ {
+ if (prev != 0) // not at begin
+ {
+ node = prev;
+ prev = prev->prev;
+ curr = boost::ref(node ? node->val : nil_node);
+ }
+ }
+
+ bool equal(node_iterator const& other) const
+ {
+ return node == other.node;
+ }
+
+ typename node_iterator::reference dereference() const
+ {
+ return curr;
+ }
+
+ list::node* node;
+ list::node* prev;
+
+ static Value nil_node;
+ mutable boost::reference_wrapper<Value> curr;
+ };
+
+ template <typename Value>
+ Value list::node_iterator<boost::reference_wrapper<Value> >::nil_node = Value();
+
+ inline void list::free()
+ {
+ node* p = first;
+ while (p != 0)
+ {
+ node* next = p->next;
+ delete p;
+ p = next;
+ }
+ }
+
+ inline void list::copy(list const& other)
+ {
+ node* p = other.first;
+ while (p != 0)
+ {
+ push_back(p->val);
+ p = p->next;
+ }
+ }
+
+ inline void list::default_construct()
+ {
+ first = last = 0;
+ size = 0;
+ }
+
+ template <typename T, typename Iterator>
+ inline void list::insert(T const& val, Iterator pos)
+ {
+ if (!pos.node)
+ {
+ push_back(val);
+ return;
+ }
+
+ detail::list::node* new_node =
+ new detail::list::node(val, pos.node, pos.node->prev);
+
+ if (pos.node->prev)
+ pos.node->prev->next = new_node;
+ else
+ first = new_node;
+
+ pos.node->prev = new_node;
+ ++size;
+ }
+
+ template <typename T>
+ inline void list::push_front(T const& val)
+ {
+ detail::list::node* new_node;
+ if (first == 0)
+ {
+ new_node = new detail::list::node(val, 0, 0);
+ first = last = new_node;
+ ++size;
+ }
+ else
+ {
+ new_node = new detail::list::node(val, first, first->prev);
+ first->prev = new_node;
+ first = new_node;
+ ++size;
+ }
+ }
+
+ template <typename T>
+ inline void list::push_back(T const& val)
+ {
+ if (last == 0)
+ push_front(val);
+ else {
+ detail::list::node* new_node =
+ new detail::list::node(val, last->next, last);
+ last->next = new_node;
+ last = new_node;
+ ++size;
+ }
+ }
+
+ inline void list::pop_front()
+ {
+ BOOST_ASSERT(size != 0);
+ if (first == last) // there's only one item
+ {
+ delete first;
+ size = 0;
+ first = last = 0;
+ }
+ else
+ {
+ node* np = first;
+ first = first->next;
+ first->prev = 0;
+ delete np;
+ --size;
+ }
+ }
+
+ inline void list::pop_back()
+ {
+ BOOST_ASSERT(size != 0);
+ if (first == last) // there's only one item
+ {
+ delete first;
+ size = 0;
+ first = last = 0;
+ }
+ else
+ {
+ node* np = last;
+ last = last->prev;
+ last->next = 0;
+ delete np;
+ --size;
+ }
+ }
+
+ inline list::node* list::erase(node* pos)
+ {
+ BOOST_ASSERT(pos != 0);
+ if (pos == first)
+ {
+ pop_front();
+ return first;
+ }
+ else if (pos == last)
+ {
+ pop_back();
+ return 0;
+ }
+ else
+ {
+ node* next(pos->next);
+ pos->unlink();
+ delete pos;
+ --size;
+ return next;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // simple binder for binary visitation (we don't want to bring in the big guns)
+ template <typename F, typename X>
+ struct bind_impl
+ {
+ typedef typename F::result_type result_type;
+ X& x; // always by reference
+ F f;
+ bind_impl(F f, X& x) : x(x), f(f) {}
+
+ template <typename Y>
+ typename F::result_type operator()(Y& y) const
+ {
+ return f(x, y);
+ }
+
+ template <typename Y>
+ typename F::result_type operator()(Y const& y) const
+ {
+ return f(x, y);
+ }
+ };
+
+ template <typename F, typename X>
+ bind_impl<F, X const> bind(F f, X const& x)
+ {
+ return bind_impl<F, X const>(f, x);
+ }
+
+ template <typename F, typename X>
+ bind_impl<F, X> bind(F f, X& x)
+ {
+ return bind_impl<F, X>(f, x);
+ }
+
+ template <typename UTreeX, typename UTreeY = UTreeX>
+ struct visit_impl
+ {
+ template <typename F>
+ typename F::result_type
+ static apply(UTreeX& x, F f) // single dispatch
+ {
+ typedef typename
+ boost::mpl::if_<boost::is_const<UTreeX>,
+ typename UTreeX::const_iterator,
+ typename UTreeX::iterator>::type
+ iterator;
+
+ typedef boost::iterator_range<iterator> list_range;
+ typedef utree_type type;
+
+ switch (x.get_type())
+ {
+ default:
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception("corrupt utree type", x.get_type()));
+ break;
+
+ case type::invalid_type:
+ return f(invalid);
+
+ case type::nil_type:
+ return f(nil);
+
+ case type::bool_type:
+ return f(x.b);
+
+ case type::int_type:
+ return f(x.i);
+
+ case type::double_type:
+ return f(x.d);
+
+ case type::list_type:
+ return f(list_range(iterator(x.l.first, 0), iterator(0, x.l.last)));
+
+ case type::range_type:
+ return f(list_range(iterator(x.r.first, 0), iterator(0, x.r.last)));
+
+ case type::string_type:
+ return f(utf8_string_range_type(x.s.str(), x.s.size()));
+
+ case type::string_range_type:
+ return f(utf8_string_range_type(x.sr.first, x.sr.last));
+
+ case type::symbol_type:
+ return f(utf8_symbol_range_type(x.s.str(), x.s.size()));
+
+ case type::binary_type:
+ return f(binary_range_type(x.s.str(), x.s.size()));
+
+ case type::reference_type:
+ return apply(*x.p, f);
+
+ case type::any_type:
+ return f(any_ptr(x.v.p, x.v.i));
+
+ case type::function_type:
+ return f(*x.pf);
+ }
+ }
+
+ template <typename F>
+ typename F::result_type
+ static apply(UTreeX& x, UTreeY& y, F f) // double dispatch
+ {
+ typedef typename
+ boost::mpl::if_<boost::is_const<UTreeX>,
+ typename UTreeX::const_iterator,
+ typename UTreeX::iterator>::type
+ iterator;
+
+ typedef boost::iterator_range<iterator> list_range;
+ typedef utree_type type;
+
+ switch (x.get_type())
+ {
+ default:
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception("corrupt utree type", x.get_type()));
+ break;
+
+ case type::invalid_type:
+ return visit_impl::apply(y, detail::bind(f, invalid));
+
+ case type::nil_type:
+ return visit_impl::apply(y, detail::bind(f, nil));
+
+ case type::bool_type:
+ return visit_impl::apply(y, detail::bind(f, x.b));
+
+ case type::int_type:
+ return visit_impl::apply(y, detail::bind(f, x.i));
+
+ case type::double_type:
+ return visit_impl::apply(y, detail::bind(f, x.d));
+
+ case type::list_type:
+ return visit_impl::apply(
+ y, detail::bind<F, list_range>(f,
+ list_range(iterator(x.l.first, 0), iterator(0, x.l.last))));
+
+ case type::range_type:
+ return visit_impl::apply(
+ y, detail::bind<F, list_range>(f,
+ list_range(iterator(x.r.first, 0), iterator(0, x.r.last))));
+
+ case type::string_type:
+ return visit_impl::apply(y, detail::bind(
+ f, utf8_string_range_type(x.s.str(), x.s.size())));
+
+ case type::string_range_type:
+ return visit_impl::apply(y, detail::bind(
+ f, utf8_string_range_type(x.sr.first, x.sr.last)));
+
+ case type::symbol_type:
+ return visit_impl::apply(y, detail::bind(
+ f, utf8_symbol_range_type(x.s.str(), x.s.size())));
+
+ case type::binary_type:
+ return visit_impl::apply(y, detail::bind(
+ f, binary_range_type(x.s.str(), x.s.size())));
+
+ case type::reference_type:
+ return apply(*x.p, y, f);
+
+ case type::any_type:
+ return visit_impl::apply(
+ y, detail::bind(f, any_ptr(x.v.p, x.v.i)));
+
+ case type::function_type:
+ return visit_impl::apply(y, detail::bind(f, *x.pf));
+ }
+ }
+ };
+
+ struct index_impl
+ {
+ static utree& apply(utree& ut, std::size_t i)
+ {
+ switch (ut.get_type())
+ {
+ case utree_type::reference_type:
+ return apply(ut.deref(), i);
+ case utree_type::range_type:
+ return apply(ut.r.first, i);
+ case utree_type::list_type:
+ return apply(ut.l.first, i);
+ default:
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("index operation performed on non-list utree type",
+ ut.get_type()));
+ }
+ }
+
+ static utree const& apply(utree const& ut, std::size_t i)
+ {
+ switch (ut.get_type())
+ {
+ case utree_type::reference_type:
+ return apply(ut.deref(), i);
+ case utree_type::range_type:
+ return apply(ut.r.first, i);
+ case utree_type::list_type:
+ return apply(ut.l.first, i);
+ default:
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("index operation performed on non-list utree type",
+ ut.get_type()));
+ }
+ }
+
+ static utree& apply(list::node* node, std::size_t i)
+ {
+ for (; i > 0; --i)
+ node = node->next;
+ return node->val;
+ }
+
+ static utree const& apply(list::node const* node, std::size_t i)
+ {
+ for (; i > 0; --i)
+ node = node->next;
+ return node->val;
+ }
+ };
+}}}
+
+namespace boost { namespace spirit
+{
+ template <typename F>
+ stored_function<F>::stored_function(F f)
+ : f(f)
+ {
+ }
+
+ template <typename F>
+ stored_function<F>::~stored_function()
+ {
+ }
+
+ template <typename F>
+ utree stored_function<F>::operator()(utree const& env) const
+ {
+ return f(env);
+ }
+
+ template <typename F>
+ utree stored_function<F>::operator()(utree& env) const
+ {
+ return f(env);
+ }
+
+ template <typename F>
+ function_base*
+ stored_function<F>::clone() const
+ {
+ return new stored_function<F>(f);
+ }
+
+ template <typename F>
+ referenced_function<F>::referenced_function(F& f)
+ : f(f)
+ {
+ }
+
+ template <typename F>
+ referenced_function<F>::~referenced_function()
+ {
+ }
+
+ template <typename F>
+ utree referenced_function<F>::operator()(utree const& env) const
+ {
+ return f(env);
+ }
+
+ template <typename F>
+ utree referenced_function<F>::operator()(utree& env) const
+ {
+ return f(env);
+ }
+
+ template <typename F>
+ function_base*
+ referenced_function<F>::clone() const
+ {
+ return new referenced_function<F>(f);
+ }
+
+ inline utree::utree(utree::invalid_type)
+ {
+ s.initialize();
+ set_type(type::invalid_type);
+ }
+
+ inline utree::utree(utree::nil_type)
+ {
+ s.initialize();
+ set_type(type::nil_type);
+ }
+
+ inline utree::utree(bool b_)
+ {
+ s.initialize();
+ b = b_;
+ set_type(type::bool_type);
+ }
+
+ inline utree::utree(char c)
+ {
+ s.initialize();
+ // char constructs a single element string
+ s.construct(&c, &c+1);
+ set_type(type::string_type);
+ }
+
+ inline utree::utree(unsigned int i_)
+ {
+ s.initialize();
+ i = i_;
+ set_type(type::int_type);
+ }
+
+ inline utree::utree(int i_)
+ {
+ s.initialize();
+ i = i_;
+ set_type(type::int_type);
+ }
+
+ inline utree::utree(double d_)
+ {
+ s.initialize();
+ d = d_;
+ set_type(type::double_type);
+ }
+
+ inline utree::utree(char const* str)
+ {
+ s.initialize();
+ s.construct(str, str + strlen(str));
+ set_type(type::string_type);
+ }
+
+ inline utree::utree(char const* str, std::size_t len)
+ {
+ s.initialize();
+ s.construct(str, str + len);
+ set_type(type::string_type);
+ }
+
+ inline utree::utree(std::string const& str)
+ {
+ s.initialize();
+ s.construct(str.begin(), str.end());
+ set_type(type::string_type);
+ }
+
+ template <typename Base, utree_type::info type_>
+ inline utree::utree(basic_string<Base, type_> const& bin)
+ {
+ s.initialize();
+ s.construct(bin.begin(), bin.end());
+ set_type(type_);
+ }
+
+ inline utree::utree(boost::reference_wrapper<utree> ref)
+ {
+ s.initialize();
+ p = ref.get_pointer();
+ set_type(type::reference_type);
+ }
+
+ inline utree::utree(any_ptr const& p)
+ {
+ s.initialize();
+ v.p = p.p;
+ v.i = p.i;
+ set_type(type::any_type);
+ }
+
+ inline utree::utree(function_base const& pf_)
+ {
+ s.initialize();
+ pf = pf_.clone();
+ set_type(type::function_type);
+ }
+
+ inline utree::utree(function_base* pf_)
+ {
+ s.initialize();
+ pf = pf_;
+ set_type(type::function_type);
+ }
+
+ template <typename Iter>
+ inline utree::utree(boost::iterator_range<Iter> r)
+ {
+ s.initialize();
+
+ assign(r.begin(), r.end());
+ }
+
+ inline utree::utree(range r, shallow_tag)
+ {
+ s.initialize();
+ this->r.first = r.begin().node;
+ this->r.last = r.end().prev;
+ set_type(type::range_type);
+ }
+
+ inline utree::utree(const_range r, shallow_tag)
+ {
+ s.initialize();
+ this->r.first = r.begin().node;
+ this->r.last = r.end().prev;
+ set_type(type::range_type);
+ }
+
+ inline utree::utree(utf8_string_range_type const& str, shallow_tag)
+ {
+ s.initialize();
+ this->sr.first = str.begin();
+ this->sr.last = str.end();
+ set_type(type::string_range_type);
+ }
+
+ inline utree::utree(utree const& other)
+ {
+ s.initialize();
+ copy(other);
+ }
+
+ inline utree::~utree()
+ {
+ free();
+ }
+
+ inline utree& utree::operator=(utree const& other)
+ {
+ if (this != &other)
+ {
+ free();
+ copy(other);
+ }
+ return *this;
+ }
+
+ inline utree& utree::operator=(nil_type)
+ {
+ free();
+ set_type(type::nil_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(bool b_)
+ {
+ free();
+ b = b_;
+ set_type(type::bool_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(char c)
+ {
+ // char constructs a single element string
+ free();
+ s.construct(&c, &c+1);
+ set_type(type::string_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(unsigned int i_)
+ {
+ free();
+ i = i_;
+ set_type(type::int_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(int i_)
+ {
+ free();
+ i = i_;
+ set_type(type::int_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(double d_)
+ {
+ free();
+ d = d_;
+ set_type(type::double_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(char const* s_)
+ {
+ free();
+ s.construct(s_, s_ + strlen(s_));
+ set_type(type::string_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(std::string const& s_)
+ {
+ free();
+ s.construct(s_.begin(), s_.end());
+ set_type(type::string_type);
+ return *this;
+ }
+
+ template <typename Base, utree_type::info type_>
+ inline utree& utree::operator=(basic_string<Base, type_> const& bin)
+ {
+ free();
+ s.construct(bin.begin(), bin.end());
+ set_type(type_);
+ return *this;
+ }
+
+ inline utree& utree::operator=(boost::reference_wrapper<utree> ref)
+ {
+ free();
+ p = ref.get_pointer();
+ set_type(type::reference_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(any_ptr const& p)
+ {
+ free();
+ v.p = p.p;
+ v.i = p.i;
+ set_type(type::any_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(function_base const& pf_)
+ {
+ free();
+ pf = pf_.clone();
+ set_type(type::function_type);
+ return *this;
+ }
+
+ inline utree& utree::operator=(function_base* pf_)
+ {
+ free();
+ pf = pf_;
+ set_type(type::function_type);
+ return *this;
+ }
+
+ template <typename Iter>
+ inline utree& utree::operator=(boost::iterator_range<Iter> r)
+ {
+ free();
+ assign(r.begin(), r.end());
+ return *this;
+ }
+
+ template <typename F>
+ typename boost::result_of<F(utree const&)>::type
+ inline utree::visit(utree const& x, F f)
+ {
+ return detail::visit_impl<utree const>::apply(x, f);
+ }
+
+ template <typename F>
+ typename boost::result_of<F(utree&)>::type
+ inline utree::visit(utree& x, F f)
+ {
+ return detail::visit_impl<utree>::apply(x, f);
+ }
+
+ template <typename F>
+ typename boost::result_of<F(utree const&, utree const&)>::type
+ inline utree::visit(utree const& x, utree const& y, F f)
+ {
+ return detail::visit_impl<utree const, utree const>::apply(x, y, f);
+ }
+
+ template <typename F>
+ typename boost::result_of<F(utree const&, utree&)>::type
+ inline utree::visit(utree const& x, utree& y, F f)
+ {
+ return detail::visit_impl<utree const, utree>::apply(x, y, f);
+ }
+
+ template <typename F>
+ typename boost::result_of<F(utree&, utree const&)>::type
+ inline utree::visit(utree& x, utree const& y, F f)
+ {
+ return detail::visit_impl<utree, utree const>::apply(x, y, f);
+ }
+
+ template <typename F>
+ typename boost::result_of<F(utree&, utree&)>::type
+ inline utree::visit(utree& x, utree& y, F f)
+ {
+ return detail::visit_impl<utree, utree>::apply(x, y, f);
+ }
+
+ inline utree::reference get(utree::reference ut, utree::size_type i)
+ { return detail::index_impl::apply(ut, i); }
+
+ inline utree::const_reference
+ get(utree::const_reference ut, utree::size_type i)
+ { return detail::index_impl::apply(ut, i); }
+
+ template <typename T>
+ inline void utree::push_front(T const& val)
+ {
+ if (get_type() == type::reference_type)
+ return p->push_front(val);
+
+ ensure_list_type("push_front()");
+ l.push_front(val);
+ }
+
+ template <typename T>
+ inline void utree::push_back(T const& val)
+ {
+ if (get_type() == type::reference_type)
+ return p->push_back(val);
+
+ ensure_list_type("push_back()");
+ l.push_back(val);
+ }
+
+ template <typename T>
+ inline utree::iterator utree::insert(iterator pos, T const& val)
+ {
+ if (get_type() == type::reference_type)
+ return p->insert(pos, val);
+
+ ensure_list_type("insert()");
+ if (!pos.node)
+ {
+ l.push_back(val);
+ return utree::iterator(l.first, 0); // begin();
+ }
+ l.insert(val, pos);
+ return utree::iterator(pos.node->prev, pos.node->prev->prev);
+ }
+
+ template <typename T>
+ inline void utree::insert(iterator pos, std::size_t n, T const& val)
+ {
+ if (get_type() == type::reference_type)
+ return p->insert(pos, n, val);
+
+ ensure_list_type("insert()");
+ for (std::size_t i = 0; i != n; ++i)
+ insert(pos, val);
+ }
+
+ template <typename Iterator>
+ inline void utree::insert(iterator pos, Iterator first, Iterator last)
+ {
+ if (get_type() == type::reference_type)
+ return p->insert(pos, first, last);
+
+ ensure_list_type("insert()");
+ while (first != last)
+ insert(pos, *first++);
+ }
+
+ template <typename Iterator>
+ inline void utree::assign(Iterator first, Iterator last)
+ {
+ if (get_type() == type::reference_type)
+ return p->assign(first, last);
+
+ clear();
+ set_type(type::list_type);
+
+ while (first != last)
+ {
+ push_back(*first);
+ ++first;
+ }
+ }
+
+ inline void utree::clear()
+ {
+ if (get_type() == type::reference_type)
+ return p->clear();
+
+ // clear will always make this an invalid type
+ free();
+ set_type(type::invalid_type);
+ }
+
+ inline void utree::pop_front()
+ {
+ if (get_type() == type::reference_type)
+ return p->pop_front();
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("pop_front() called on non-list utree type",
+ get_type()));
+
+ l.pop_front();
+ }
+
+ inline void utree::pop_back()
+ {
+ if (get_type() == type::reference_type)
+ return p->pop_back();
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("pop_back() called on non-list utree type",
+ get_type()));
+
+ l.pop_back();
+ }
+
+ inline utree::iterator utree::erase(iterator pos)
+ {
+ if (get_type() == type::reference_type)
+ return p->erase(pos);
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("erase() called on non-list utree type",
+ get_type()));
+
+ detail::list::node* np = l.erase(pos.node);
+ return iterator(np, np?np->prev:l.last);
+ }
+
+ inline utree::iterator utree::erase(iterator first, iterator last)
+ {
+ if (get_type() == type::reference_type)
+ return p->erase(first, last);
+
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("erase() called on non-list utree type",
+ get_type()));
+ while (first != last)
+ erase(first++);
+ return last;
+ }
+
+ inline utree::iterator utree::begin()
+ {
+ if (get_type() == type::reference_type)
+ return p->begin();
+ else if (get_type() == type::range_type)
+ return iterator(r.first, 0);
+
+ // otherwise...
+ ensure_list_type("begin()");
+ return iterator(l.first, 0);
+ }
+
+ inline utree::iterator utree::end()
+ {
+ if (get_type() == type::reference_type)
+ return p->end();
+ else if (get_type() == type::range_type)
+ return iterator(0, r.first);
+
+ // otherwise...
+ ensure_list_type("end()");
+ return iterator(0, l.last);
+ }
+
+ inline utree::ref_iterator utree::ref_begin()
+ {
+ if (get_type() == type::reference_type)
+ return p->ref_begin();
+ else if (get_type() == type::range_type)
+ return ref_iterator(r.first, 0);
+
+ // otherwise...
+ ensure_list_type("ref_begin()");
+ return ref_iterator(l.first, 0);
+ }
+
+ inline utree::ref_iterator utree::ref_end()
+ {
+ if (get_type() == type::reference_type)
+ return p->ref_end();
+ else if (get_type() == type::range_type)
+ return ref_iterator(0, r.first);
+
+ // otherwise...
+ ensure_list_type("ref_end()");
+ return ref_iterator(0, l.last);
+ }
+
+ inline utree::const_iterator utree::begin() const
+ {
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->begin();
+ if (get_type() == type::range_type)
+ return const_iterator(r.first, 0);
+
+ // otherwise...
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("begin() called on non-list utree type",
+ get_type()));
+
+ return const_iterator(l.first, 0);
+ }
+
+ inline utree::const_iterator utree::end() const
+ {
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->end();
+ if (get_type() == type::range_type)
+ return const_iterator(0, r.first);
+
+ // otherwise...
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("end() called on non-list utree type",
+ get_type()));
+
+ return const_iterator(0, l.last);
+ }
+
+ inline bool utree::empty() const
+ {
+ type::info t = get_type();
+ if (t == type::reference_type)
+ return ((utree const*)p)->empty();
+
+ if (t == type::range_type)
+ return r.first == 0;
+ if (t == type::list_type)
+ return l.size == 0;
+
+ return t == type::nil_type || t == type::invalid_type;
+ }
+
+ inline std::size_t utree::size() const
+ {
+ type::info t = get_type();
+ if (t == type::reference_type)
+ return ((utree const*)p)->size();
+
+ if (t == type::range_type)
+ {
+ // FIXME: O(n), and we have the room to store the size of a range
+ // in the union if we compute it when assigned/constructed.
+ std::size_t size = 0;
+ detail::list::node* n = r.first;
+ while (n)
+ {
+ n = n->next;
+ ++size;
+ }
+ return size;
+ }
+ if (t == type::list_type)
+ return l.size;
+
+ if (t == type::string_type)
+ return s.size();
+
+ if (t == type::symbol_type)
+ return s.size();
+
+ if (t == type::binary_type)
+ return s.size();
+
+ if (t == type::string_range_type)
+ return sr.last - sr.first;
+
+ if (t != type::nil_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("size() called on non-list and non-string utree type",
+ get_type()));
+
+ return 0;
+ }
+
+ inline utree_type::info utree::which() const
+ {
+ return get_type();
+ }
+
+ inline utree& utree::front()
+ {
+ if (get_type() == type::reference_type)
+ return p->front();
+ if (get_type() == type::range_type)
+ {
+ if (!r.first)
+ BOOST_THROW_EXCEPTION(
+ empty_exception("front() called on empty utree range"));
+ return r.first->val;
+ }
+
+ // otherwise...
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("front() called on non-list utree type", get_type()));
+ else if (!l.first)
+ BOOST_THROW_EXCEPTION(
+ empty_exception("front() called on empty utree list"));
+
+ return l.first->val;
+ }
+
+ inline utree& utree::back()
+ {
+ if (get_type() == type::reference_type)
+ return p->back();
+ if (get_type() == type::range_type)
+ {
+ if (!r.last)
+ BOOST_THROW_EXCEPTION(
+ empty_exception("back() called on empty utree range"));
+ return r.last->val;
+ }
+
+ // otherwise...
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("back() called on non-list utree type", get_type()));
+ else if (!l.last)
+ BOOST_THROW_EXCEPTION(
+ empty_exception("back() called on empty utree list"));
+
+ return l.last->val;
+ }
+
+ inline utree const& utree::front() const
+ {
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->front();
+ if (get_type() == type::range_type)
+ {
+ if (!r.first)
+ BOOST_THROW_EXCEPTION(
+ empty_exception("front() called on empty utree range"));
+ return r.first->val;
+ }
+
+ // otherwise...
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("front() called on non-list utree type", get_type()));
+ else if (!l.first)
+ BOOST_THROW_EXCEPTION(
+ empty_exception("front() called on empty utree list"));
+
+ return l.first->val;
+ }
+
+ inline utree const& utree::back() const
+ {
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->back();
+ if (get_type() == type::range_type)
+ {
+ if (!r.last)
+ BOOST_THROW_EXCEPTION(
+ empty_exception("back() called on empty utree range"));
+ return r.last->val;
+ }
+
+ // otherwise...
+ if (get_type() != type::list_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception
+ ("back() called on non-list utree type", get_type()));
+ else if (!l.last)
+ BOOST_THROW_EXCEPTION(
+ empty_exception("back() called on empty utree list"));
+
+ return l.last->val;
+ }
+
+ inline void utree::swap(utree& other)
+ {
+ s.swap(other.s);
+ }
+
+ inline utree::type::info utree::get_type() const
+ {
+ // the fast string holds the type info
+ return static_cast<utree::type::info>(s.get_type());
+ }
+
+ inline void utree::set_type(type::info t)
+ {
+ // the fast string holds the type info
+ s.set_type(t);
+ }
+
+ inline void utree::ensure_list_type(char const* failed_in)
+ {
+ type::info t = get_type();
+ if (t == type::invalid_type)
+ {
+ set_type(type::list_type);
+ l.default_construct();
+ }
+ else if (get_type() != type::list_type)
+ {
+ std::string msg = failed_in;
+ msg += "called on non-list and non-invalid utree type";
+ BOOST_THROW_EXCEPTION(bad_type_exception(msg.c_str(), get_type()));
+ }
+ }
+
+ inline void utree::free()
+ {
+ switch (get_type())
+ {
+ case type::binary_type:
+ case type::symbol_type:
+ case type::string_type:
+ s.free();
+ break;
+ case type::list_type:
+ l.free();
+ break;
+ case type::function_type:
+ delete pf;
+ break;
+ default:
+ break;
+ };
+ s.initialize();
+ }
+
+ inline void utree::copy(utree const& other)
+ {
+ set_type(other.get_type());
+ switch (other.get_type())
+ {
+ default:
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception("corrupt utree type", other.get_type()));
+ break;
+ case type::invalid_type:
+ case type::nil_type:
+ s.tag(other.s.tag());
+ break;
+ case type::bool_type:
+ b = other.b;
+ s.tag(other.s.tag());
+ break;
+ case type::int_type:
+ i = other.i;
+ s.tag(other.s.tag());
+ break;
+ case type::double_type:
+ d = other.d;
+ s.tag(other.s.tag());
+ break;
+ case type::reference_type:
+ p = other.p;
+ s.tag(other.s.tag());
+ break;
+ case type::any_type:
+ v = other.v;
+ s.tag(other.s.tag());
+ break;
+ case type::range_type:
+ r = other.r;
+ s.tag(other.s.tag());
+ break;
+ case type::string_range_type:
+ sr = other.sr;
+ s.tag(other.s.tag());
+ break;
+ case type::function_type:
+ pf = other.pf->clone();
+ s.tag(other.s.tag());
+ break;
+ case type::string_type:
+ case type::symbol_type:
+ case type::binary_type:
+ s.copy(other.s);
+ s.tag(other.s.tag());
+ break;
+ case type::list_type:
+ l.copy(other.l);
+ s.tag(other.s.tag());
+ break;
+ }
+ }
+
+ template <typename T>
+ struct is_iterator_range
+ : boost::mpl::false_
+ {};
+
+ template <typename Iterator>
+ struct is_iterator_range<boost::iterator_range<Iterator> >
+ : boost::mpl::true_
+ {};
+
+ template <typename To>
+ struct utree_cast
+ {
+ typedef To result_type;
+
+ template <typename From>
+ To dispatch(From const& val, boost::mpl::true_) const
+ {
+ return To(val); // From is convertible to To
+ }
+
+ template <typename From>
+ To dispatch(From const&, boost::mpl::false_) const
+ {
+ // From is NOT convertible to To !!!
+ throw std::bad_cast();
+ return To();
+ }
+
+ template <typename From>
+ To operator()(From const& val) const
+ {
+ // boost::iterator_range has a templated constructor, accepting
+ // any argument and hence any type is 'convertible' to it.
+ typedef typename boost::mpl::eval_if<
+ is_iterator_range<To>
+ , boost::is_same<From, To>, boost::is_convertible<From, To>
+ >::type is_convertible;
+ return dispatch(val, is_convertible());
+ }
+ };
+
+ template <typename T>
+ struct utree_cast<T*>
+ {
+ typedef T* result_type;
+
+ template <typename From>
+ T* operator()(From const&) const
+ {
+ // From is NOT convertible to T !!!
+ throw std::bad_cast();
+ return 0;
+ }
+
+ T* operator()(any_ptr const& p) const
+ {
+ return p.get<T*>();
+ }
+ };
+
+ template <typename T>
+ inline T utree::get() const
+ {
+ return utree::visit(*this, utree_cast<T>());
+ }
+
+ inline utree& utree::deref()
+ {
+ return (get_type() == type::reference_type) ? *p : *this;
+ }
+
+ inline utree const& utree::deref() const
+ {
+ return (get_type() == type::reference_type) ? *p : *this;
+ }
+
+ inline short utree::tag() const
+ {
+ return s.tag();
+ }
+
+ inline void utree::tag(short tag)
+ {
+ s.tag(tag);
+ }
+
+ inline utree utree::eval(utree const& env) const
+ {
+ if (get_type() == type::reference_type)
+ return deref().eval(env);
+
+ if (get_type() != type::function_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception(
+ "eval() called on non-function utree type", get_type()));
+ return (*pf)(env);
+ }
+
+ inline utree utree::eval(utree& env) const
+ {
+ if (get_type() == type::reference_type)
+ return deref().eval(env);
+
+ if (get_type() != type::function_type)
+ BOOST_THROW_EXCEPTION(
+ bad_type_exception(
+ "eval() called on non-function utree type", get_type()));
+ return (*pf)(env);
+ }
+
+ inline utree utree::operator() (utree const& env) const
+ {
+ return eval(env);
+ }
+
+ inline utree utree::operator() (utree& env) const
+ {
+ return eval(env);
+ }
+}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+#endif
diff --git a/boost/spirit/home/support/utree/operators.hpp b/boost/spirit/home/support/utree/operators.hpp
new file mode 100644
index 0000000000..39b1d64ac5
--- /dev/null
+++ b/boost/spirit/home/support/utree/operators.hpp
@@ -0,0 +1,704 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_UTREE_OPERATORS)
+#define BOOST_SPIRIT_UTREE_OPERATORS
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4804)
+# pragma warning(disable: 4805)
+#endif
+
+#include <exception>
+#if !defined(BOOST_SPIRIT_DISABLE_UTREE_IO)
+ #include <ios>
+ #include <boost/io/ios_state.hpp>
+#endif
+#include <boost/spirit/home/support/utree/utree.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_integral.hpp>
+
+namespace boost { namespace spirit
+{
+ // Relational operators
+ bool operator==(utree const& a, utree const& b);
+ bool operator<(utree const& a, utree const& b);
+ bool operator!=(utree const& a, utree const& b);
+ bool operator>(utree const& a, utree const& b);
+ bool operator<=(utree const& a, utree const& b);
+ bool operator>=(utree const& a, utree const& b);
+
+#if !defined(BOOST_SPIRIT_DISABLE_UTREE_IO)
+ // output
+ std::ostream& operator<<(std::ostream& out, utree const& x);
+ std::ostream& operator<<(std::ostream& out, utree::invalid_type const& x);
+ std::ostream& operator<<(std::ostream& out, utree::nil_type const& x);
+#endif
+
+ // Logical operators
+ utree operator&&(utree const& a, utree const& b);
+ utree operator||(utree const& a, utree const& b);
+ utree operator!(utree const& a);
+
+ // Arithmetic operators
+ utree operator+(utree const& a, utree const& b);
+ utree operator-(utree const& a, utree const& b);
+ utree operator*(utree const& a, utree const& b);
+ utree operator/(utree const& a, utree const& b);
+ utree operator%(utree const& a, utree const& b);
+ utree operator-(utree const& a);
+
+ // Bitwise operators
+ utree operator&(utree const& a, utree const& b);
+ utree operator|(utree const& a, utree const& b);
+ utree operator^(utree const& a, utree const& b);
+ utree operator<<(utree const& a, utree const& b);
+ utree operator>>(utree const& a, utree const& b);
+ utree operator~(utree const& a);
+
+ // Implementation
+ struct utree_is_equal
+ {
+ typedef bool result_type;
+
+ template <typename A, typename B>
+ bool dispatch(const A&, const B&, boost::mpl::false_) const
+ {
+ return false; // cannot compare different types by default
+ }
+
+ template <typename A, typename B>
+ bool dispatch(const A& a, const B& b, boost::mpl::true_) const
+ {
+ return a == b; // for arithmetic types
+ }
+
+ template <typename A, typename B>
+ bool operator()(const A& a, const B& b) const
+ {
+ return dispatch(a, b,
+ boost::mpl::and_<
+ boost::is_arithmetic<A>,
+ boost::is_arithmetic<B> >());
+ }
+
+ template <typename T>
+ bool operator()(const T& a, const T& b) const
+ {
+ // This code works for lists
+ return a == b;
+ }
+
+ template <typename Base, utree_type::info type_>
+ bool operator()(
+ basic_string<Base, type_> const& a,
+ basic_string<Base, type_> const& b) const
+ {
+ return static_cast<Base const&>(a) == static_cast<Base const&>(b);
+ }
+
+ bool operator()(utree::invalid_type, utree::invalid_type) const
+ {
+ return true;
+ }
+
+ bool operator()(utree::nil_type, utree::nil_type) const
+ {
+ return true;
+ }
+
+ bool operator()(function_base const&, function_base const&) const
+ {
+ return false; // just don't allow comparison of functions
+ }
+ };
+
+ struct utree_is_less_than
+ {
+ typedef bool result_type;
+
+ template <typename A, typename B>
+ bool dispatch(const A&, const B&, boost::mpl::false_) const
+ {
+ return false; // cannot compare different types by default
+ }
+
+ template <typename A, typename B>
+ bool dispatch(const A& a, const B& b, boost::mpl::true_) const
+ {
+ return a < b; // for arithmetic types
+ }
+
+ template <typename A, typename B>
+ bool operator()(const A& a, const B& b) const
+ {
+ return dispatch(a, b,
+ boost::mpl::and_<
+ boost::is_arithmetic<A>,
+ boost::is_arithmetic<B> >());
+ }
+
+ template <typename T>
+ bool operator()(const T& a, const T& b) const
+ {
+ // This code works for lists
+ return a < b;
+ }
+
+ template <typename Base, utree_type::info type_>
+ bool operator()(
+ basic_string<Base, type_> const& a,
+ basic_string<Base, type_> const& b) const
+ {
+ return static_cast<Base const&>(a) < static_cast<Base const&>(b);
+ }
+
+ bool operator()(utree::invalid_type, utree::invalid_type) const
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("no less-than comparison for this utree type",
+ utree_type::invalid_type));
+ return false; // no less than comparison for nil
+ }
+
+ bool operator()(utree::nil_type, utree::nil_type) const
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("no less-than comparison for this utree type",
+ utree_type::nil_type));
+ return false; // no less than comparison for nil
+ }
+
+ bool operator()(any_ptr const&, any_ptr const&) const
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("no less-than comparison for this utree type",
+ utree_type::any_type));
+ return false; // no less than comparison for any_ptr
+ }
+
+ bool operator()(function_base const&, function_base const&) const
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("no less-than comparison for this utree type",
+ utree_type::function_type));
+ return false; // no less than comparison of functions
+ }
+ };
+
+#if !defined(BOOST_SPIRIT_DISABLE_UTREE_IO)
+ struct utree_print
+ {
+ typedef void result_type;
+
+ std::ostream& out;
+ utree_print(std::ostream& out) : out(out) {}
+
+ void operator()(utree::invalid_type) const
+ {
+ out << "<invalid> ";
+ }
+
+ void operator()(utree::nil_type) const
+ {
+ out << "<nil> ";
+ }
+
+ template <typename T>
+ void operator()(T val) const
+ {
+ out << val << ' ';
+ }
+
+ void operator()(bool b) const
+ {
+ out << (b ? "true" : "false") << ' ';
+ }
+
+ void operator()(binary_range_type const& b) const
+ {
+ boost::io::ios_all_saver saver(out);
+ out << "#";
+ out.width(2);
+ out.fill('0');
+
+ typedef binary_range_type::const_iterator iterator;
+ for (iterator i = b.begin(); i != b.end(); ++i)
+ out << std::hex << int((unsigned char)*i);
+ out << "# ";
+ }
+
+ void operator()(utf8_string_range_type const& str) const
+ {
+ typedef utf8_string_range_type::const_iterator iterator;
+ iterator i = str.begin();
+ out << '"';
+ for (; i != str.end(); ++i)
+ out << *i;
+ out << "\" ";
+ }
+
+ void operator()(utf8_symbol_range_type const& str) const
+ {
+ typedef utf8_symbol_range_type::const_iterator iterator;
+ iterator i = str.begin();
+ for (; i != str.end(); ++i)
+ out << *i;
+ out << ' ';
+ }
+
+ template <typename Iterator>
+ void operator()(boost::iterator_range<Iterator> const& range) const
+ {
+ typedef typename boost::iterator_range<Iterator>::const_iterator iterator;
+ (*this)('(');
+ for (iterator i = range.begin(); i != range.end(); ++i)
+ {
+ boost::spirit::utree::visit(*i, *this);
+ }
+ (*this)(')');
+ }
+
+ void operator()(any_ptr const&) const
+ {
+ return (*this)("<pointer>");
+ }
+
+ void operator()(function_base const&) const
+ {
+ return (*this)("<function>");
+ }
+ };
+#endif
+
+ template <typename Base>
+ struct logical_function
+ {
+ typedef utree result_type;
+
+ // We assume anything except false is true
+
+ // binary
+ template <typename A, typename B>
+ utree operator()(A const& a, B const& b) const
+ {
+ return dispatch(a, b
+ , boost::is_arithmetic<A>()
+ , boost::is_arithmetic<B>());
+ }
+
+ // binary
+ template <typename A, typename B>
+ utree dispatch(A const& a, B const& b, mpl::true_, mpl::true_) const
+ {
+ return Base::eval(a, b); // for arithmetic types
+ }
+
+ // binary
+ template <typename A, typename B>
+ utree dispatch(A const&, B const& b, mpl::false_, mpl::true_) const
+ {
+ return Base::eval(true, b);
+ }
+
+ // binary
+ template <typename A, typename B>
+ utree dispatch(A const& a, B const&, mpl::true_, mpl::false_) const
+ {
+ return Base::eval(a, true);
+ }
+
+ // binary
+ template <typename A, typename B>
+ utree dispatch(A const&, B const&, mpl::false_, mpl::false_) const
+ {
+ return Base::eval(true, true);
+ }
+
+ // unary
+ template <typename A>
+ utree operator()(A const& a) const
+ {
+ return dispatch(a, boost::is_arithmetic<A>());
+ }
+
+ // unary
+ template <typename A>
+ utree dispatch(A const& a, mpl::true_) const
+ {
+ return Base::eval(a);
+ }
+
+ // unary
+ template <typename A>
+ utree dispatch(A const&, mpl::false_) const
+ {
+ return Base::eval(true);
+ }
+ };
+
+ template <typename Base>
+ struct arithmetic_function
+ {
+ typedef utree result_type;
+
+ template <typename A, typename B>
+ utree dispatch(A const&, B const&, boost::mpl::false_) const
+ {
+ return utree(); // cannot apply to non-arithmetic types
+ }
+
+ template <typename A, typename B>
+ utree dispatch(A const& a, B const& b, boost::mpl::true_) const
+ {
+ return Base::eval(a, b); // for arithmetic types
+ }
+
+ // binary
+ template <typename A, typename B>
+ utree operator()(A const& a, B const& b) const
+ {
+ return dispatch(a, b,
+ boost::mpl::and_<
+ boost::is_arithmetic<A>,
+ boost::is_arithmetic<B> >());
+ }
+
+ template <typename A>
+ utree dispatch(A const&, boost::mpl::false_) const
+ {
+ return utree(); // cannot apply to non-arithmetic types
+ }
+
+ template <typename A>
+ utree dispatch(A const& a, boost::mpl::true_) const
+ {
+ return Base::eval(a); // for arithmetic types
+ }
+
+ // unary
+ template <typename A>
+ utree operator()(A const& a) const
+ {
+ return dispatch(a, boost::is_arithmetic<A>());
+ }
+ };
+
+ template <typename Base>
+ struct integral_function
+ {
+ typedef utree result_type;
+
+ template <typename A, typename B>
+ utree dispatch(A const&, B const&, boost::mpl::false_) const
+ {
+ return utree(); // cannot apply to non-integral types
+ }
+
+ template <typename A, typename B>
+ utree dispatch(A const& a, B const& b, boost::mpl::true_) const
+ {
+ return Base::eval(a, b); // for integral types
+ }
+
+ // binary
+ template <typename A, typename B>
+ utree operator()(A const& a, B const& b) const
+ {
+ return dispatch(a, b,
+ boost::mpl::and_<
+ boost::is_integral<A>,
+ boost::is_integral<B> >());
+ }
+
+ template <typename A>
+ utree dispatch(A const&, boost::mpl::false_) const
+ {
+ return utree(); // cannot apply to non-integral types
+ }
+
+ template <typename A>
+ utree dispatch(A const& a, boost::mpl::true_) const
+ {
+ return Base::eval(a); // for integral types
+ }
+
+ // unary
+ template <typename A>
+ utree operator()(A const& a) const
+ {
+ return dispatch(a, boost::is_integral<A>());
+ }
+ };
+
+#define BOOST_SPIRIT_UTREE_CREATE_FUNCTION(name, expr, base) \
+ struct BOOST_PP_CAT(function_impl_, name) \
+ { \
+ template <typename A, typename B> \
+ static utree eval(A const& a, B const& b) \
+ { \
+ return utree(expr); \
+ } \
+ template <typename A> \
+ static utree eval(A const& a) \
+ { \
+ static int b; \
+ (void) b; \
+ return utree(expr); \
+ } \
+ }; \
+ base<BOOST_PP_CAT(function_impl_, name)> const \
+ BOOST_PP_CAT(base, BOOST_PP_CAT(_, name)) = {}; \
+ /***/
+
+#define BOOST_SPIRIT_UTREE_CREATE_ARITHMETIC_FUNCTION(name, expr) \
+ BOOST_SPIRIT_UTREE_CREATE_FUNCTION(name, expr, arithmetic_function) \
+ /***/
+
+#define BOOST_SPIRIT_UTREE_CREATE_INTEGRAL_FUNCTION(name, expr) \
+ BOOST_SPIRIT_UTREE_CREATE_FUNCTION(name, expr, integral_function) \
+ /***/
+
+#define BOOST_SPIRIT_UTREE_CREATE_LOGICAL_FUNCTION(name, expr) \
+ BOOST_SPIRIT_UTREE_CREATE_FUNCTION(name, expr, logical_function) \
+ /***/
+
+ inline bool operator==(utree const& a, utree const& b)
+ {
+ return utree::visit(a, b, utree_is_equal());
+ }
+
+ inline bool operator<(utree const& a, utree const& b)
+ {
+ return utree::visit(a, b, utree_is_less_than());
+ }
+
+ inline bool operator!=(utree const& a, utree const& b)
+ {
+ return !(a == b);
+ }
+
+ inline bool operator>(utree const& a, utree const& b)
+ {
+ return b < a;
+ }
+
+ inline bool operator<=(utree const& a, utree const& b)
+ {
+ return !(b < a);
+ }
+
+ inline bool operator>=(utree const& a, utree const& b)
+ {
+ return !(a < b);
+ }
+
+#if !defined(BOOST_SPIRIT_DISABLE_UTREE_IO)
+ inline std::ostream& operator<<(std::ostream& out, utree const& x)
+ {
+ utree::visit(x, utree_print(out));
+ return out;
+ }
+
+ inline std::ostream& operator<<(std::ostream& out, utree::invalid_type const&)
+ {
+ return out;
+ }
+
+ inline std::ostream& operator<<(std::ostream& out, utree::nil_type const&)
+ {
+ return out;
+ }
+#endif
+
+ BOOST_SPIRIT_UTREE_CREATE_LOGICAL_FUNCTION(and_, a&&b)
+ BOOST_SPIRIT_UTREE_CREATE_LOGICAL_FUNCTION(or_, a||b)
+ BOOST_SPIRIT_UTREE_CREATE_LOGICAL_FUNCTION(not_, !a)
+
+ BOOST_SPIRIT_UTREE_CREATE_ARITHMETIC_FUNCTION(plus, a+b)
+ BOOST_SPIRIT_UTREE_CREATE_ARITHMETIC_FUNCTION(minus, a-b)
+ BOOST_SPIRIT_UTREE_CREATE_ARITHMETIC_FUNCTION(times, a*b)
+ BOOST_SPIRIT_UTREE_CREATE_ARITHMETIC_FUNCTION(divides, a/b)
+ BOOST_SPIRIT_UTREE_CREATE_INTEGRAL_FUNCTION(modulus, a%b)
+ BOOST_SPIRIT_UTREE_CREATE_ARITHMETIC_FUNCTION(negate, -a)
+
+ BOOST_SPIRIT_UTREE_CREATE_INTEGRAL_FUNCTION(bitand_, a&b)
+ BOOST_SPIRIT_UTREE_CREATE_INTEGRAL_FUNCTION(bitor_, a|b)
+ BOOST_SPIRIT_UTREE_CREATE_INTEGRAL_FUNCTION(bitxor_, a^b)
+ BOOST_SPIRIT_UTREE_CREATE_INTEGRAL_FUNCTION(shift_left, a<<b)
+ BOOST_SPIRIT_UTREE_CREATE_INTEGRAL_FUNCTION(shift_right, a>>b)
+ BOOST_SPIRIT_UTREE_CREATE_INTEGRAL_FUNCTION(invert, ~a)
+
+ inline utree operator&&(utree const& a, utree const& b)
+ {
+ return utree::visit(a, b, logical_function_and_);
+ }
+
+ inline utree operator||(utree const& a, utree const& b)
+ {
+ return utree::visit(a, b, logical_function_or_);
+ }
+
+ inline utree operator!(utree const& a)
+ {
+ return utree::visit(a, logical_function_not_);
+ }
+
+ inline utree operator+(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, arithmetic_function_plus);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("addition performed on non-arithmetic utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator-(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, arithmetic_function_minus);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("subtraction performed on non-arithmetic utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator*(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, arithmetic_function_times);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("multiplication performed on non-arithmetic utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator/(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, arithmetic_function_divides);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("division performed on non-arithmetic utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator%(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, integral_function_modulus);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("modulos performed on non-integral utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator-(utree const& a)
+ {
+ utree r = utree::visit(a, arithmetic_function_negate);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("negation performed on non-arithmetic utree type",
+ a.which()));
+ }
+ return r;
+ }
+
+ inline utree operator&(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, integral_function_bitand_);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("bitwise and performed on non-integral utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator|(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, integral_function_bitor_);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("bitwise or performed on non-integral utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator^(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, integral_function_bitxor_);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("bitwise xor performed on non-integral utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator<<(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, integral_function_shift_left);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("left shift performed on non-integral utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator>>(utree const& a, utree const& b)
+ {
+ utree r = utree::visit(a, b, integral_function_shift_right);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("right shift performed on non-integral utree types",
+ a.which(), b.which()));
+ }
+ return r;
+ }
+
+ inline utree operator~(utree const& a)
+ {
+ utree r = utree::visit(a, integral_function_invert);
+ if (r.which() == utree_type::invalid_type)
+ {
+ BOOST_THROW_EXCEPTION(bad_type_exception
+ ("inversion performed on non-integral utree type",
+ a.which()));
+ }
+ return r;
+ }
+}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/home/support/utree/utree.hpp b/boost/spirit/home/support/utree/utree.hpp
new file mode 100644
index 0000000000..67120e90aa
--- /dev/null
+++ b/boost/spirit/home/support/utree/utree.hpp
@@ -0,0 +1,642 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_UTREE)
+#define BOOST_SPIRIT_UTREE
+
+#include <cstddef>
+#include <algorithm>
+#include <string>
+#include <iostream>
+#include <ios>
+#include <sstream>
+#include <typeinfo>
+
+#include <boost/io/ios_state.hpp>
+#include <boost/integer.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/assert.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/utility/result_of.hpp>
+#include <boost/ref.hpp>
+
+#include <boost/spirit/home/support/utree/detail/utree_detail1.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4804)
+# pragma warning(disable: 4805)
+# pragma warning(disable: 4244)
+#endif
+
+namespace boost { namespace spirit
+{
+ //[utree_exceptions
+ /*` All exceptions thrown by utree are derived from utree_exception. */
+ struct utree_exception : std::exception {};
+
+ /*`The `bad_type_exception` is thrown whenever somebody calls a member
+ function, which applies to certain stored utree_type's only, but this
+ precondition is violated as the `utree` instance holds some other type.
+ */
+ struct bad_type_exception /*: utree_exception*/;
+
+ /*`The `empty_exception` is thrown whenever a precondition of a list
+ or range utree method is violated due to the list or range being empty.
+ */
+ struct empty_exception /*: utree_exception*/;
+ //]
+
+ //[utree_types
+ /*`Each instance of an `utree` data structure can store exactly one of the
+ following data types at a time:
+ */
+ struct utree_type
+ {
+ enum info
+ {
+ invalid_type, // the utree has not been initialized (it's
+ // default constructed)
+ nil_type, // nil is the sentinel (empty) utree type.
+ list_type, // A doubly linked list of utrees.
+ range_type, // A range of list::iterators.
+ reference_type, // A reference to another utree.
+ any_type, // A pointer or reference to any C++ type.
+ function_type, // A utree holding a stored_function<F> object,
+ // where F is an unary function object taking a
+ // utree as it's parameter and returning a
+ // utree.
+
+ // numeric atoms
+ bool_type, // An utree holding a boolean value
+ int_type, // An utree holding a integer (int) value
+ double_type, // An utree holding a floating point (double) value
+
+ // text atoms (utf8)
+ string_type, // An UTF-8 string
+ string_range_type, // A pair of iterators into an UTF-8 string
+ symbol_type, // An UTF-8 symbol name
+
+ binary_type // Arbitrary binary data
+ };
+ typedef boost::uint_t<sizeof(info)*8>::exact exact_integral_type;
+ typedef boost::uint_t<sizeof(info)*8>::fast fast_integral_type;
+ };
+ //]
+
+ // streaming operator for utree types - essential for diagnostics
+ inline std::ostream& operator<<(std::ostream& out, utree_type::info t)
+ {
+ boost::io::ios_all_saver saver(out);
+ switch (t) {
+ case utree_type::invalid_type: { out << "invalid"; break; }
+ case utree_type::nil_type: { out << "nil"; break; }
+ case utree_type::list_type: { out << "list"; break; }
+ case utree_type::range_type: { out << "range"; break; }
+ case utree_type::reference_type: { out << "reference"; break; }
+ case utree_type::any_type: { out << "any"; break; }
+ case utree_type::function_type: { out << "function"; break; }
+ case utree_type::bool_type: { out << "bool"; break; }
+ case utree_type::int_type: { out << "int"; break; }
+ case utree_type::double_type: { out << "double"; break; }
+ case utree_type::string_type: { out << "string"; break; }
+ case utree_type::string_range_type: { out << "string_range"; break; }
+ case utree_type::symbol_type: { out << "symbol"; break; }
+ case utree_type::binary_type: { out << "binary"; break; }
+ default: { out << "unknown"; break; }
+ }
+ out << std::hex << "[0x"
+ << static_cast<utree_type::fast_integral_type>(t) << "]";
+ return out;
+ }
+
+ struct bad_type_exception : utree_exception
+ {
+ std::string msg;
+
+ bad_type_exception(char const* error, utree_type::info got)
+ : msg()
+ {
+ std::ostringstream oss;
+ oss << "utree: " << error
+ << " (got utree type '" << got << "')";
+ msg = oss.str();
+ }
+
+ bad_type_exception(char const* error, utree_type::info got1,
+ utree_type::info got2)
+ : msg()
+ {
+ std::ostringstream oss;
+ oss << "utree: " << error
+ << " (got utree types '" << got1 << "' and '" << got2 << "')";
+ msg = oss.str();
+ }
+
+ virtual ~bad_type_exception() throw() {}
+
+ virtual char const* what() const throw()
+ { return msg.c_str(); }
+ };
+
+ struct empty_exception : utree_exception
+ {
+ char const* msg;
+
+ empty_exception(char const* error) : msg(error) {}
+
+ virtual ~empty_exception() throw() {}
+
+ virtual char const* what() const throw()
+ { return msg; }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // A typed string with parametric Base storage. The storage can be any
+ // range or (stl container) of chars.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Base, utree_type::info type_>
+ struct basic_string : Base
+ {
+ static utree_type::info const type = type_;
+
+ basic_string()
+ : Base() {}
+
+ basic_string(Base const& base)
+ : Base(base) {}
+
+ template <typename Iterator>
+ basic_string(Iterator bits, std::size_t len)
+ : Base(bits, bits + len) {}
+
+ template <typename Iterator>
+ basic_string(Iterator first, Iterator last)
+ : Base(first, last) {}
+
+ basic_string& operator=(basic_string const& other)
+ {
+ Base::operator=(other);
+ return *this;
+ }
+
+ basic_string& operator=(Base const& other)
+ {
+ Base::operator=(other);
+ return *this;
+ }
+ };
+
+ //[utree_strings
+ /*`The `utree` string types described below are used by the `utree` API
+ only. These are not used to store information in the `utree` itself.
+ Their purpose is to refer to different internal `utree` node types
+ only. For instance, creating a `utree` from a binary data type will
+ create a `binary_type` utree node (see above).
+ */
+ /*`The binary data type can be represented either verbatim as a sequence
+ of bytes or as a pair of iterators into some other stored binary data
+ sequence. Use this string type to access/create a `binary_type` `utree`.
+ */
+ typedef basic_string<
+ boost::iterator_range<char const*>, utree_type::binary_type
+ > binary_range_type;
+ typedef basic_string<
+ std::string, utree_type::binary_type
+ > binary_string_type;
+
+ /*`The UTF-8 string can be represented either verbatim as a sequence of
+ characters or as a pair of iterators into some other stored binary data
+ sequence. Use this string type to access/create a `string_type` `utree`.
+ */
+ typedef basic_string<
+ boost::iterator_range<char const*>, utree_type::string_type
+ > utf8_string_range_type;
+ typedef basic_string<
+ std::string, utree_type::string_type
+ > utf8_string_type;
+
+ /*`The UTF-8 symbol can be represented either verbatim as a sequence of
+ characters or as a pair of iterators into some other stored binary data
+ sequence. Use this string type to access/create a `symbol_type` `utree`.
+ */
+ typedef basic_string<
+ boost::iterator_range<char const*>, utree_type::symbol_type
+ > utf8_symbol_range_type;
+ typedef basic_string<
+ std::string, utree_type::symbol_type
+ > utf8_symbol_type;
+ //]
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Our function type
+ ///////////////////////////////////////////////////////////////////////////
+ class utree;
+
+ //[utree_function_object_interface
+ struct function_base
+ {
+ virtual ~function_base() {}
+ virtual utree operator()(utree const& env) const = 0;
+ virtual utree operator()(utree& env) const = 0;
+
+ // Calling f.clone() must return a newly allocated function_base
+ // instance that is equal to f.
+ virtual function_base* clone() const = 0;
+ };
+
+ template <typename F>
+ struct stored_function : function_base
+ {
+ F f;
+ stored_function(F f = F());
+ virtual ~stored_function();
+ virtual utree operator()(utree const& env) const;
+ virtual utree operator()(utree& env) const;
+ virtual function_base* clone() const;
+ };
+
+ template <typename F>
+ struct referenced_function : function_base
+ {
+ F& f;
+ referenced_function(F& f);
+ virtual ~referenced_function();
+ virtual utree operator()(utree const& env) const;
+ virtual utree operator()(utree& env) const;
+ virtual function_base* clone() const;
+ };
+ //]
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Shallow tag. Instructs utree to hold an iterator_range
+ // as-is without deep copying the range.
+ ///////////////////////////////////////////////////////////////////////////
+ struct shallow_tag {};
+ shallow_tag const shallow = {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // A void* plus type_info
+ ///////////////////////////////////////////////////////////////////////////
+ class any_ptr
+ {
+ public:
+ template <typename Ptr>
+ typename boost::disable_if<
+ boost::is_polymorphic<
+ typename boost::remove_pointer<Ptr>::type>,
+ Ptr>::type
+ get() const
+ {
+ if (*i == typeid(Ptr))
+ {
+ return static_cast<Ptr>(p);
+ }
+ boost::throw_exception(std::bad_cast());
+ }
+
+ template <typename T>
+ any_ptr(T* p)
+ : p(p), i(&typeid(T*))
+ {}
+
+ friend bool operator==(any_ptr const& a, any_ptr const& b)
+ {
+ return (a.p == b.p) && (*a.i == *b.i);
+ }
+
+ private:
+ // constructor is private
+ any_ptr(void* p, std::type_info const* i)
+ : p(p), i(i) {}
+
+ template <typename UTreeX, typename UTreeY>
+ friend struct detail::visit_impl;
+
+ friend class utree;
+
+ void* p;
+ std::type_info const* i;
+ };
+
+ //[utree
+ class utree {
+ public:
+ ///////////////////////////////////////////////////////////////////////
+ // The invalid type
+ struct invalid_type {};
+
+ ///////////////////////////////////////////////////////////////////////
+ // The nil type
+ struct nil_type {};
+
+ ///////////////////////////////////////////////////////////////////////
+ // The list type, this can be used to initialize an utree to hold an
+ // empty list
+ struct list_type;
+
+ //[utree_container_types
+ typedef utree value_type;
+ typedef utree& reference;
+ typedef utree const& const_reference;
+ typedef std::ptrdiff_t difference_type;
+ typedef std::size_t size_type;
+
+ typedef detail::list::node_iterator<utree> iterator;
+ typedef detail::list::node_iterator<utree const> const_iterator;
+ //]
+
+ typedef detail::list::node_iterator<boost::reference_wrapper<utree> >
+ ref_iterator;
+
+ typedef boost::iterator_range<iterator> range;
+ typedef boost::iterator_range<const_iterator> const_range;
+
+ // dtor
+ ~utree();
+
+ ////////////////////////////////////////////////////////////////////////
+ //[utree_initialization
+ /*`A `utree` can be constructed or initialized from a wide range of
+ data types, allowing to create `utree` instances for every
+ possible node type (see the description of `utree_type::info` above).
+ For this reason it exposes a constructor and an assignment operator
+ for each of the allowed node types as shown below. All constructors
+ are non-explicit on purpose, allowing to use an utree instance as
+ the attribute to almost any Qi parser.
+ */
+ // This constructs an `invalid_type` node. When used in places
+ // where a boost::optional is expected (i.e. as an attribute for the
+ // optional component), this represents the 'empty' state.
+ utree(invalid_type = invalid_type());
+
+ // This initializes a `nil_type` node, which represents a valid,
+ // 'initialized empty' utree (different from invalid_type!).
+ utree(nil_type);
+ reference operator=(nil_type);
+
+ // This initializes a `boolean_type` node, which can hold 'true' or
+ // 'false' only.
+ explicit utree(bool);
+ reference operator=(bool);
+
+ // This initializes an `integer_type` node, which can hold arbitrary
+ // integers. For convenience these functions are overloaded for signed
+ // and unsigned integer types.
+ utree(unsigned int);
+ utree(int);
+ reference operator=(unsigned int);
+ reference operator=(int);
+
+ // This initializes a `double_type` node, which can hold arbitrary
+ // floating point (double) values.
+ utree(double);
+ reference operator=(double);
+
+ // This initializes a `string_type` node, which can hold a narrow
+ // character sequence (usually an UTF-8 string).
+ utree(char);
+ utree(char const*);
+ utree(char const*, std::size_t);
+ utree(std::string const&);
+ reference operator=(char);
+ reference operator=(char const*);
+ reference operator=(std::string const&);
+
+ // This constructs a `string_range_type` node, which does not copy the
+ // data but stores the iterator range to the character sequence the
+ // range has been initialized from.
+ utree(utf8_string_range_type const&, shallow_tag);
+
+ // This initializes a `reference_type` node, which holds a reference to
+ // another utree node. All operations on such a node are automatically
+ // forwarded to the referenced utree instance.
+ utree(boost::reference_wrapper<utree>);
+ reference operator=(boost::reference_wrapper<utree>);
+
+ // This initializes an `any_type` node, which can hold a pointer to an
+ // instance of any type together with the typeid of that type. When
+ // accessing that pointer the typeid will be checked, causing a
+ // std::bad_cast to be thrown if the typeids do not match.
+ utree(any_ptr const&);
+ reference operator=(any_ptr const&);
+
+ // This initializes a `range_type` node, which holds an utree list node
+ // the elements of which are copy constructed (assigned) from the
+ // elements referenced by the given range of iterators.
+ template <class Iterator>
+ utree(boost::iterator_range<Iterator>);
+ template <class Iterator>
+ reference operator=(boost::iterator_range<Iterator>);
+
+ // This initializes a `function_type` node from a polymorphic function
+ // object pointer (takes ownership) or reference.
+ utree(function_base const&);
+ reference operator=(function_base const&);
+ utree(function_base*);
+ reference operator=(function_base*);
+
+ // This initializes either a `string_type`, a `symbol_type`, or a
+ // `binary_type` node (depending on the template parameter `type_`),
+ // which will hold the corresponding narrow character sequence (usually
+ // an UTF-8 string).
+ template <class Base, utree_type::info type_>
+ utree(basic_string<Base, type_> const&);
+ template <class Base, utree_type::info type_>
+ reference operator=(basic_string<Base, type_> const&);
+ //]
+
+ // copy
+ utree(const_reference);
+ reference operator=(const_reference);
+
+ // range
+ utree(range, shallow_tag);
+ utree(const_range, shallow_tag);
+
+ // assign dispatch
+ template <class Iterator>
+ void assign(Iterator, Iterator);
+
+ ////////////////////////////////////////////////////////////////////////
+
+ ////////////////////////////////////////////////////////////////////////
+ // function object visitation interface
+
+ // single dispatch
+ template <class F>
+ typename boost::result_of<F(utree const&)>::type
+ static visit(utree const&, F);
+
+ template <class F>
+ typename boost::result_of<F(utree&)>::type
+ static visit(utree&, F);
+
+ // double dispatch
+ template <class F>
+ typename boost::result_of<F(utree const&, utree const&)>::type
+ static visit(utree const&, utree const&, F);
+
+ template <class F>
+ typename boost::result_of<F(utree&, utree const&)>::type
+ static visit(utree&, utree const&, F);
+
+ template <class F>
+ typename boost::result_of<F(utree const&, utree&)>::type
+ static visit(utree const&, utree&, F);
+
+ template <class F>
+ typename boost::result_of<F(utree&, utree&)>::type
+ static visit(utree&, utree&, F);
+
+ ////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////
+ //[utree_container_functions
+ // STL Container interface
+
+ // insertion
+ template <class T>
+ void push_back(T const&);
+ template <class T>
+ void push_front(T const&);
+ template <class T>
+ iterator insert(iterator, T const&);
+ template <class T>
+ void insert(iterator, std::size_t, T const&);
+ template <class Iterator>
+ void insert(iterator, Iterator, Iterator);
+
+ // erasure
+ void pop_front();
+ void pop_back();
+ iterator erase(iterator);
+ iterator erase(iterator, iterator);
+
+ // front access
+ reference front();
+ const_reference front() const;
+ iterator begin();
+ const_iterator begin() const;
+ ref_iterator ref_begin();
+
+ // back access
+ reference back();
+ const_reference back() const;
+ iterator end();
+ const_iterator end() const;
+ ref_iterator ref_end();
+ //]
+
+ // This clears the utree instance and resets its type to `invalid_type`
+ void clear();
+
+ void swap(utree&);
+
+ bool empty() const;
+
+ size_type size() const;
+ /*`[warning `size()` has O(n) complexity on `utree` ranges. On utree
+ lists, it has O(1) complexity.]`*/
+
+ ////////////////////////////////////////////////////////////////////////
+
+ //[utree_variant_functions
+ // return the data type (`utree_type::info`) of the currently stored
+ // data item
+ utree_type::info which() const;
+
+ // access the currently stored data in a type safe manner, this will
+ // throw a `std::bad_cast()` if the currently stored data item is not
+ // default convertible to `T`.
+ template <class T>
+ T get() const;
+ //]
+
+ reference deref();
+ const_reference deref() const;
+
+ short tag() const;
+ void tag(short);
+
+ utree eval(utree const&) const;
+ utree eval(utree&) const;
+
+ utree operator() (utree const&) const;
+ utree operator() (utree&) const;
+ //<-
+ protected:
+ void ensure_list_type(char const* failed_in = "ensure_list_type()");
+
+ private:
+ typedef utree_type type;
+
+ template <class UTreeX, class UTreeY>
+ friend struct detail::visit_impl;
+ friend struct detail::index_impl;
+
+ type::info get_type() const;
+ void set_type(type::info);
+ void free();
+ void copy(const_reference);
+
+ union {
+ detail::fast_string s;
+ detail::list l;
+ detail::range r;
+ detail::string_range sr;
+ detail::void_ptr v;
+ bool b;
+ int i;
+ double d;
+ utree* p;
+ function_base* pf;
+ };
+ //->
+ };
+ //]
+
+ //[utree_tuple_interface
+ /*<-*/inline/*->*/
+ utree::reference get(utree::reference, utree::size_type);
+ /*<-*/inline/*->*/
+ utree::const_reference get(utree::const_reference, utree::size_type);
+ /*`[warning `get()` has O(n) complexity.]`*/
+ //]
+
+ struct utree::list_type : utree
+ {
+ using utree::operator=;
+
+ list_type() : utree() { ensure_list_type("list_type()"); }
+
+ template <typename T0>
+ list_type(T0 t0) : utree(t0) {}
+
+ template <typename T0, typename T1>
+ list_type(T0 t0, T1 t1) : utree(t0, t1) {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // predefined instances for singular types
+ utree::invalid_type const invalid = {};
+ utree::nil_type const nil = {};
+ utree::list_type const empty_list = utree::list_type();
+}}
+
+#if defined(BOOST_MSVC)
+ #pragma warning(pop)
+#endif
+
+#endif
+
diff --git a/boost/spirit/home/support/utree/utree_traits.hpp b/boost/spirit/home/support/utree/utree_traits.hpp
new file mode 100644
index 0000000000..4f9f46f026
--- /dev/null
+++ b/boost/spirit/home/support/utree/utree_traits.hpp
@@ -0,0 +1,1294 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_OUTPUT_UTREE_TRAITS_APR_16_2010_0655AM)
+#define BOOST_SPIRIT_OUTPUT_UTREE_TRAITS_APR_16_2010_0655AM
+
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/support/utree.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/qi/nonterminal/nonterminal_fwd.hpp>
+#include <boost/spirit/home/karma/nonterminal/nonterminal_fwd.hpp>
+
+#include <string>
+
+#include <boost/cstdint.hpp>
+#include <boost/variant.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost
+{
+ template <typename T>
+ inline T get(boost::spirit::utree const& x)
+ {
+ return x.get<T>();
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace traits
+{
+ namespace detail
+ {
+ inline bool is_list(utree const& ut)
+ {
+ switch (traits::which(ut))
+ {
+ case utree_type::reference_type:
+ return is_list(ut.deref());
+
+ case utree_type::list_type:
+ case utree_type::range_type:
+ return true;
+
+ default:
+ break;
+ }
+ return false;
+ }
+
+ inline bool is_uninitialized(utree const& ut)
+ {
+ return traits::which(ut) == utree_type::invalid_type;
+ }
+ }
+
+ // this specialization tells Spirit how to extract the type of the value
+ // stored in the given utree node
+ template <>
+ struct variant_which<utree>
+ {
+ static int call(utree const& u) { return u.which(); }
+ };
+
+ template <>
+ struct variant_which<utree::list_type>
+ {
+ static int call(utree::list_type const& u) { return u.which(); }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Make sure all components of an alternative expose utree, even if they
+ // actually expose a utree::list_type
+ template <typename Domain>
+ struct alternative_attribute_transform<utree::list_type, Domain>
+ : mpl::identity<utree>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Make sure all components of a sequence expose utree, even if they
+ // actually expose a utree::list_type
+ template <typename Domain>
+ struct sequence_attribute_transform<utree::list_type, Domain>
+ : mpl::identity<utree>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // this specialization lets Spirit know that typed basic_strings
+ // are strings
+ template <typename Base, utree_type::info I>
+ struct is_string<spirit::basic_string<Base, I> >
+ : mpl::true_
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // these specializations extract the character type of a utree typed string
+ template <typename T, utree_type::info I>
+ struct char_type_of<spirit::basic_string<iterator_range<T>, I> >
+ : char_type_of<T>
+ {};
+
+ template <utree_type::info I>
+ struct char_type_of<spirit::basic_string<std::string, I> >
+ : mpl::identity<char>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // these specializations extract a c string from a utree typed string
+ template <typename String>
+ struct extract_c_string;
+
+ template <typename T, utree_type::info I>
+ struct extract_c_string<
+ spirit::basic_string<iterator_range<T const*>, I>
+ > {
+ typedef T char_type;
+
+ typedef spirit::basic_string<iterator_range<T const*>, I> string;
+
+ static T const* call (string& s)
+ {
+ return s.begin();
+ }
+
+ static T const* call (string const& s)
+ {
+ return s.begin();
+ }
+ };
+
+ template <utree_type::info I>
+ struct extract_c_string<spirit::basic_string<std::string, I> >
+ {
+ typedef char char_type;
+
+ typedef spirit::basic_string<std::string, I> string;
+
+ static char const* call (string& s)
+ {
+ return s.c_str();
+ }
+
+ static char const* call (string const& s)
+ {
+ return s.c_str();
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // these specializations are needed because utree::value_type == utree
+ template <>
+ struct is_substitute<utree, utree>
+ : mpl::true_
+ {};
+
+ template <>
+ struct is_weak_substitute<utree, utree>
+ : mpl::true_
+ {};
+
+ template <>
+ struct is_substitute<utree::list_type, utree::list_type>
+ : mpl::true_
+ {};
+
+ template <>
+ struct is_weak_substitute<utree::list_type, utree::list_type>
+ : mpl::true_
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // this specialization tells Spirit.Qi to allow assignment to an utree from
+ // a variant
+ namespace detail
+ {
+ struct assign_to_utree_visitor : static_visitor<>
+ {
+ assign_to_utree_visitor(utree& ut) : ut_(ut) {}
+
+ template <typename T>
+ void operator()(T& val) const
+ {
+ ut_ = val;
+ }
+
+ utree& ut_;
+ };
+ }
+
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct assign_to_container_from_value<
+ utree, variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ {
+ static void
+ call(variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& val, utree& attr)
+ {
+ apply_visitor(detail::assign_to_utree_visitor(attr), val);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // this specialization tells Spirit.Qi to allow assignment to an utree from
+ // a STL container
+ template <typename Attribute>
+ struct assign_to_container_from_value<utree, Attribute>
+ {
+ // any non-container type will be either directly assigned or appended
+ static void call(Attribute const& val, utree& attr, mpl::false_)
+ {
+ if (attr.empty())
+ attr = val;
+ else
+ push_back(attr, val);
+ }
+
+ // any container type will be converted into a list_type utree
+ static void call(Attribute const& val, utree& attr, mpl::true_)
+ {
+ typedef typename traits::container_iterator<Attribute const>::type
+ iterator_type;
+
+ // make sure the attribute is a list, at least an empty one
+ if (attr.empty())
+ attr = empty_list;
+
+ iterator_type end = traits::end(val);
+ for (iterator_type i = traits::begin(val); i != end; traits::next(i))
+ push_back(attr, traits::deref(i));
+ }
+
+ static void call(Attribute const& val, utree& attr)
+ {
+ call(val, attr, is_container<Attribute>());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // this specialization is required to disambiguate the specializations
+ // related to utree
+ template <>
+ struct assign_to_container_from_value<utree, utree>
+ {
+ static void call(utree const& val, utree& attr)
+ {
+ if (attr.empty()) {
+ attr = val;
+ }
+ else if (detail::is_list(val)) {
+ typedef utree::const_iterator iterator_type;
+
+ iterator_type end = traits::end(val);
+ for (iterator_type i = traits::begin(val); i != end; traits::next(i))
+ push_back(attr, traits::deref(i));
+ }
+ else {
+ push_back(attr, val);
+ }
+ }
+ };
+
+ template <>
+ struct assign_to_container_from_value<utree, utree::list_type>
+ : assign_to_container_from_value<utree, utree>
+ {};
+
+ // If the destination is a utree_list, we need to force the right hand side
+ // value into a new sub-node, always, no questions asked.
+ template <>
+ struct assign_to_container_from_value<utree::list_type, utree>
+ {
+ static void call(utree const& val, utree& attr)
+ {
+ push_back(attr, val);
+ }
+ };
+
+ // If both, the right hand side and the left hand side are utree_lists
+ // we have a lhs rule which has a single rule exposing a utree_list as its
+ // rhs (optionally wrapped into a directive or other unary parser). In this
+ // case we do not create a new sub-node.
+ template <>
+ struct assign_to_container_from_value<utree::list_type, utree::list_type>
+ : assign_to_container_from_value<utree, utree>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // this specialization makes sure strings get assigned as a whole and are
+ // not converted into a utree list
+ template <>
+ struct assign_to_container_from_value<utree, utf8_string_type>
+ {
+ static void call(utf8_string_type const& val, utree& attr)
+ {
+ if (attr.empty())
+ attr = val;
+ else
+ push_back(attr, val);
+ }
+ };
+
+ // this specialization keeps symbols from being transformed into strings
+ template<>
+ struct assign_to_container_from_value<utree, utf8_symbol_type>
+ {
+ static void call (utf8_symbol_type const& val, utree& attr)
+ {
+ if (attr.empty())
+ attr = val;
+ else
+ push_back(attr, val);
+ }
+ };
+
+ template <>
+ struct assign_to_container_from_value<utree, binary_string_type>
+ {
+ static void call(binary_string_type const& val, utree& attr)
+ {
+ if (attr.empty())
+ attr = val;
+ else
+ push_back(attr, val);
+ }
+ };
+
+ template<>
+ struct assign_to_container_from_value<utree, utf8_symbol_range_type>
+ {
+ static void call (utf8_symbol_range_type const& val, utree& attr)
+ {
+ if (attr.empty())
+ attr = val;
+ else
+ push_back(attr, val);
+ }
+ };
+
+ template <>
+ struct assign_to_container_from_value<utree, binary_range_type>
+ {
+ static void call(binary_range_type const& val, utree& attr)
+ {
+ if (attr.empty())
+ attr = val;
+ else
+ push_back(attr, val);
+ }
+ };
+
+ template <>
+ struct assign_to_container_from_value<utree, std::string>
+ {
+ static void call(std::string const& val, utree& attr)
+ {
+ if (attr.empty())
+ attr = val;
+ else
+ push_back(attr, val);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // this specialization tells Spirit.Qi to allow assignment to an utree from
+ // generic iterators
+ template <typename Iterator>
+ struct assign_to_attribute_from_iterators<utree, Iterator>
+ {
+ static void
+ call(Iterator const& first, Iterator const& last, utree& attr)
+ {
+ if (attr.empty())
+ attr.assign(first, last);
+ else {
+ for (Iterator i = first; i != last; ++i)
+ push_back(attr, traits::deref(i));
+ }
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Karma only: convert utree node to string
+ namespace detail
+ {
+ struct attribute_as_string_type
+ {
+ typedef utf8_string_range_type type;
+
+ static type call(utree const& attr)
+ {
+ return boost::get<utf8_string_range_type>(attr);
+ }
+
+ static bool is_valid(utree const& attr)
+ {
+ switch (traits::which(attr))
+ {
+ case utree_type::reference_type:
+ return is_valid(attr.deref());
+
+ case utree_type::string_range_type:
+ case utree_type::string_type:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+ };
+ }
+
+ template <>
+ struct attribute_as<std::string, utree>
+ : detail::attribute_as_string_type
+ {};
+
+ template <>
+ struct attribute_as<utf8_string_type, utree>
+ : detail::attribute_as_string_type
+ {};
+
+ template <>
+ struct attribute_as<utf8_string_range_type, utree>
+ : detail::attribute_as_string_type
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ struct attribute_as_symbol_type
+ {
+ typedef utf8_symbol_range_type type;
+
+ static type call(utree const& attr)
+ {
+ return boost::get<utf8_symbol_range_type>(attr);
+ }
+
+ static bool is_valid(utree const& attr)
+ {
+ switch (traits::which(attr))
+ {
+ case utree_type::reference_type:
+ return is_valid(attr.deref());
+
+ case utree_type::symbol_type:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+ };
+ }
+
+ template <>
+ struct attribute_as<utf8_symbol_type, utree>
+ : detail::attribute_as_symbol_type
+ {};
+
+ template <>
+ struct attribute_as<utf8_symbol_range_type, utree>
+ : detail::attribute_as_symbol_type
+ {};
+
+ template <typename Attribute>
+ struct attribute_as<Attribute, utree::list_type>
+ : attribute_as<Attribute, utree>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ struct attribute_as_binary_string_type
+ {
+ typedef binary_range_type type;
+
+ static type call(utree const& attr)
+ {
+ return boost::get<binary_range_type>(attr);
+ }
+
+ static bool is_valid(utree const& attr)
+ {
+ switch (traits::which(attr))
+ {
+ case utree_type::reference_type:
+ return is_valid(attr.deref());
+
+ case utree_type::binary_type:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+ };
+ }
+
+ template <>
+ struct attribute_as<binary_string_type, utree>
+ : detail::attribute_as_binary_string_type
+ {};
+
+ template <>
+ struct attribute_as<binary_range_type, utree>
+ : detail::attribute_as_binary_string_type
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // push_back support for utree
+ template <typename T>
+ struct push_back_container<utree, T>
+ {
+ static bool call(utree& c, T const& val)
+ {
+ switch (traits::which(c))
+ {
+ case utree_type::invalid_type:
+ case utree_type::nil_type:
+ case utree_type::list_type:
+ c.push_back(val);
+ break;
+
+ default:
+ {
+ utree ut;
+ ut.push_back(c);
+ ut.push_back(val);
+ c.swap(ut);
+ }
+ break;
+ }
+ return true;
+ }
+ };
+
+ template <typename T>
+ struct push_back_container<utree::list_type, T>
+ : push_back_container<utree, T>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // ensure the utree attribute is an empty list
+ template <>
+ struct make_container_attribute<utree>
+ {
+ static void call(utree& ut)
+ {
+ if (!detail::is_list(ut)) {
+ if (detail::is_uninitialized(ut))
+ ut = empty_list;
+ else {
+ utree retval (empty_list);
+ retval.push_back(ut);
+ ut.swap(retval);
+ }
+ }
+ }
+ };
+
+ template <>
+ struct make_container_attribute<utree::list_type>
+ : make_container_attribute<utree>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // an utree is a container on its own
+ template <>
+ struct build_std_vector<utree>
+ {
+ typedef utree type;
+ };
+
+ template <>
+ struct build_std_vector<utree::list_type>
+ {
+ typedef utree::list_type type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // debug support for utree
+ template <typename Out>
+ struct print_attribute_debug<Out, utree>
+ {
+ static void call(Out& out, utree const& val)
+ {
+ out << val;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // force utree list attribute in a sequence to be dereferenced if a rule
+ // or a grammar exposes an utree as it's attribute
+ namespace detail
+ {
+ // Checks whether the exposed Attribute allows to handle utree or
+ // utree::list_type directly. Returning mpl::false_ from this meta
+ // function will force a new utree instance to be created for each
+ // invocation of the embedded parser.
+
+ // The purpose of using utree::list_type as an attribute is to force a
+ // new sub-node in the result.
+ template <typename Attribute, typename Enable = void>
+ struct handles_utree_list_container
+ : mpl::and_<
+ mpl::not_<is_same<utree::list_type, Attribute> >,
+ traits::is_container<Attribute> >
+ {};
+
+ // The following specializations make sure that the actual handling of
+ // an utree (or utree::list_type) attribute is deferred to the embedded
+ // parsers of a sequence, alternative or optional component.
+ template <typename Attribute>
+ struct handles_utree_list_container<Attribute
+ , typename enable_if<fusion::traits::is_sequence<Attribute> >::type>
+ : mpl::true_
+ {};
+
+ template <typename Attribute>
+ struct handles_utree_list_container<boost::optional<Attribute> >
+ : mpl::true_
+ {};
+
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct handles_utree_list_container<
+ boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ : mpl::true_
+ {};
+ }
+
+ template <
+ typename IteratorA, typename IteratorB, typename Context
+ , typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<qi::rule<IteratorA, T1, T2, T3, T4>
+ , utree, Context, IteratorB>
+ : detail::handles_utree_list_container<typename attribute_of<
+ qi::rule<IteratorA, T1, T2, T3, T4>, Context, IteratorB
+ >::type>
+ {};
+
+ template <
+ typename IteratorA, typename IteratorB, typename Context
+ , typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<qi::grammar<IteratorA, T1, T2, T3, T4>
+ , utree, Context, IteratorB>
+ : detail::handles_utree_list_container<typename attribute_of<
+ qi::grammar<IteratorA, T1, T2, T3, T4>, Context, IteratorB
+ >::type>
+ {};
+
+ template <
+ typename IteratorA, typename IteratorB, typename Context
+ , typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<qi::rule<IteratorA, T1, T2, T3, T4>
+ , utree::list_type, Context, IteratorB>
+ : detail::handles_utree_list_container<typename attribute_of<
+ qi::rule<IteratorA, T1, T2, T3, T4>, Context, IteratorB
+ >::type>
+ {};
+
+ template <
+ typename IteratorA, typename IteratorB, typename Context
+ , typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<qi::grammar<IteratorA, T1, T2, T3, T4>
+ , utree::list_type, Context, IteratorB>
+ : detail::handles_utree_list_container<typename attribute_of<
+ qi::grammar<IteratorA, T1, T2, T3, T4>, Context, IteratorB
+ >::type>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Sequence>
+ struct pass_through_container<
+ utree, utree, Attribute, Sequence, qi::domain>
+ : detail::handles_utree_list_container<Attribute>
+ {};
+
+ template <typename Attribute, typename Sequence>
+ struct pass_through_container<
+ utree::list_type, utree, Attribute, Sequence, qi::domain>
+ : detail::handles_utree_list_container<Attribute>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ // Checks whether the exposed Attribute allows to handle utree or
+ // utree::list_type directly. Returning mpl::false_ from this meta
+ // function will force a new utree instance to be created for each
+ // invocation of the embedded parser.
+
+ // The purpose of using utree::list_type as an attribute is to force a
+ // new sub-node in the result.
+ template <typename Attribute, typename Enable = void>
+ struct handles_utree_container
+ : mpl::and_<
+ mpl::not_<is_same<utree, Attribute> >,
+ traits::is_container<Attribute> >
+ {};
+
+ // The following specializations make sure that the actual handling of
+ // an utree (or utree::list_type) attribute is deferred to the embedded
+ // parsers of a sequence, alternative or optional component.
+ template <typename Attribute>
+ struct handles_utree_container<Attribute
+ , typename enable_if<fusion::traits::is_sequence<Attribute> >::type>
+ : mpl::true_
+ {};
+
+ template <typename Attribute>
+ struct handles_utree_container<boost::optional<Attribute> >
+ : mpl::true_
+ {};
+
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ struct handles_utree_container<
+ boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ : mpl::true_
+ {};
+ }
+
+ template <
+ typename IteratorA, typename IteratorB, typename Context
+ , typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<karma::rule<IteratorA, T1, T2, T3, T4>
+ , utree, Context, IteratorB>
+ : detail::handles_utree_container<typename attribute_of<
+ karma::rule<IteratorA, T1, T2, T3, T4>, Context, IteratorB
+ >::type>
+ {};
+
+ template <
+ typename IteratorA, typename IteratorB, typename Context
+ , typename T1, typename T2, typename T3, typename T4>
+ struct handles_container<karma::grammar<IteratorA, T1, T2, T3, T4>
+ , utree, Context, IteratorB>
+ : detail::handles_utree_container<typename attribute_of<
+ karma::grammar<IteratorA, T1, T2, T3, T4>, Context, IteratorB
+ >::type>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Attribute, typename Sequence>
+ struct pass_through_container<
+ utree, utree, Attribute, Sequence, karma::domain>
+ : detail::handles_utree_container<Attribute>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // the specialization below tells Spirit how to handle utree if it is used
+ // with an optional component
+ template <>
+ struct optional_attribute<utree>
+ {
+ typedef utree const& type;
+
+ static type call(utree const& val)
+ {
+ return val;
+ }
+
+ // only 'invalid_type' utree nodes are not valid
+ static bool is_valid(utree const& val)
+ {
+ return !detail::is_uninitialized(val);
+ }
+ };
+
+ template <>
+ struct build_optional<utree>
+ {
+ typedef utree type;
+ };
+
+ template <>
+ struct build_optional<utree::list_type>
+ {
+ typedef utree::list_type type;
+ };
+
+ // an utree is an optional (in any domain)
+ template <>
+ struct not_is_optional<utree, qi::domain>
+ : mpl::false_
+ {};
+
+ template <>
+ struct not_is_optional<utree::list_type, qi::domain>
+ : mpl::false_
+ {};
+
+ template <>
+ struct not_is_optional<utree, karma::domain>
+ : mpl::false_
+ {};
+
+ template <>
+ struct not_is_optional<utree::list_type, karma::domain>
+ : mpl::false_
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ // the specialization below tells Spirit to handle utree as if it
+ // where a 'real' variant (in the context of karma)
+ template <>
+ struct not_is_variant<utree, karma::domain>
+ : mpl::false_
+ {};
+
+ template <>
+ struct not_is_variant<utree::list_type, karma::domain>
+ : mpl::false_
+ {};
+
+ // The specializations below tell Spirit to verify whether an attribute
+ // type is compatible with a given variant type
+ template <>
+ struct compute_compatible_component_variant<
+ utree, iterator_range<utree::iterator> >
+ : mpl::true_
+ {
+ typedef iterator_range<utree::iterator> compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::list_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<
+ utree, iterator_range<utree::const_iterator> >
+ : mpl::true_
+ {
+ typedef iterator_range<utree::const_iterator> compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::list_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<utree, utree::invalid_type>
+ : mpl::true_
+ {
+ typedef utree::invalid_type compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::invalid_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<utree, utree::nil_type>
+ : mpl::true_
+ {
+ typedef utree::nil_type compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::nil_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<utree, bool>
+ : mpl::true_
+ {
+ typedef bool compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::bool_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<utree, int>
+ : mpl::true_
+ {
+ typedef int compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::int_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<utree, double>
+ : mpl::true_
+ {
+ typedef double compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::double_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<
+ utree, utf8_string_range_type>
+ : mpl::true_
+ {
+ typedef utf8_string_range_type compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::string_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<
+ utree, utf8_string_type>
+ : mpl::true_
+ {
+ typedef utf8_string_type compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::string_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<
+ utree, utf8_symbol_range_type>
+ : mpl::true_
+ {
+ typedef utf8_symbol_range_type compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::symbol_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<
+ utree, utf8_symbol_type>
+ : mpl::true_
+ {
+ typedef utf8_symbol_type compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::symbol_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<
+ utree, binary_range_type>
+ : mpl::true_
+ {
+ typedef binary_range_type compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::binary_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<
+ utree, binary_string_type>
+ : mpl::true_
+ {
+ typedef binary_string_type compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::binary_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<utree, utree>
+ : mpl::true_
+ {
+ typedef utree compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d >= utree_type::invalid_type &&
+ d <= utree_type::reference_type;
+ }
+ };
+
+ template <>
+ struct compute_compatible_component_variant<
+ utree, std::vector<utree> >
+ : mpl::true_
+ {
+ typedef utree compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d >= utree_type::invalid_type &&
+ d <= utree_type::reference_type;
+ }
+ };
+
+ template <typename Sequence>
+ struct compute_compatible_component_variant<utree, Sequence
+ , mpl::false_
+ , typename enable_if<fusion::traits::is_sequence<Sequence> >::type>
+ : mpl::true_
+ {
+ typedef iterator_range<utree::const_iterator> compatible_type;
+
+ static bool is_compatible(int d)
+ {
+ return d == utree_type::list_type;
+ }
+ };
+
+ template <typename Attribute>
+ struct compute_compatible_component_variant<utree::list_type, Attribute>
+ : compute_compatible_component_variant<utree, Attribute>
+ {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct symbols_lookup<utree, utf8_symbol_type>
+ {
+ typedef std::string type;
+
+ static type call(utree const& t)
+ {
+ utf8_symbol_range_type r = boost::get<utf8_symbol_range_type>(t);
+ return std::string(traits::begin(r), traits::end(r));
+ }
+ };
+
+ template <>
+ struct symbols_lookup<utf8_symbol_type, utf8_symbol_type>
+ {
+ typedef std::string type;
+
+ static type call(utf8_symbol_type const& t)
+ {
+ return t;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ namespace detail
+ {
+ template <typename T>
+ inline T get_or_deref(utree const& t)
+ {
+ if (detail::is_list(t))
+ return boost::get<T>(t.front());
+ return boost::get<T>(t);
+ }
+ }
+
+ template <>
+ struct extract_from_container<utree, utree::nil_type>
+ {
+ typedef utree::nil_type type;
+
+ template <typename Context>
+ static type call(utree const&, Context&)
+ {
+ return nil;
+ }
+ };
+
+ template <>
+ struct extract_from_container<utree, char>
+ {
+ typedef char type;
+
+ template <typename Context>
+ static type call(utree const& t, Context&)
+ {
+ utf8_symbol_range_type r = detail::get_or_deref<utf8_symbol_range_type>(t);
+ return r.front();
+ }
+ };
+
+ template <>
+ struct extract_from_container<utree, bool>
+ {
+ typedef bool type;
+
+ template <typename Context>
+ static type call(utree const& t, Context&)
+ {
+ return detail::get_or_deref<bool>(t);
+ }
+ };
+
+ template <>
+ struct extract_from_container<utree, int>
+ {
+ typedef int type;
+
+ template <typename Context>
+ static type call(utree const& t, Context&)
+ {
+ return detail::get_or_deref<int>(t);
+ }
+ };
+
+ template <>
+ struct extract_from_container<utree, double>
+ {
+ typedef double type;
+
+ template <typename Context>
+ static type call(utree const& t, Context&)
+ {
+ return detail::get_or_deref<double>(t);
+ }
+ };
+
+ template <typename Traits, typename Alloc>
+ struct extract_from_container<utree, std::basic_string<char, Traits, Alloc> >
+ {
+ typedef std::basic_string<char, Traits, Alloc> type;
+
+ template <typename Context>
+ static type call(utree const& t, Context&)
+ {
+ utf8_string_range_type r = detail::get_or_deref<utf8_string_range_type>(t);
+ return type(traits::begin(r), traits::end(r));
+ }
+ };
+
+ template <>
+ struct extract_from_container<utree, utf8_symbol_type>
+ {
+ typedef std::string type;
+
+ template <typename Context>
+ static type call(utree const& t, Context&)
+ {
+ utf8_symbol_range_type r = detail::get_or_deref<utf8_symbol_range_type>(t);
+ return std::string(traits::begin(r), traits::end(r));
+ }
+ };
+
+ template <>
+ struct extract_from_container<utree, utf8_string_type>
+ {
+ typedef std::string type;
+
+ template <typename Context>
+ static type call(utree const& t, Context&)
+ {
+ utf8_string_range_type r = detail::get_or_deref<utf8_string_range_type>(t);
+ return std::string(traits::begin(r), traits::end(r));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct transform_attribute<utree const, utree::nil_type, karma::domain>
+ {
+ typedef utree::nil_type type;
+
+ static type pre(utree const&)
+ {
+ return nil;
+ }
+ };
+
+ template <>
+ struct transform_attribute<utree const, char, karma::domain>
+ {
+ typedef char type;
+
+ static type pre(utree const& t)
+ {
+ utf8_string_range_type r = detail::get_or_deref<utf8_string_range_type>(t);
+ return r.front();
+ }
+ };
+
+ template <>
+ struct transform_attribute<utree const, bool, karma::domain>
+ {
+ typedef bool type;
+
+ static type pre(utree const& t)
+ {
+ return detail::get_or_deref<bool>(t);
+ }
+ };
+
+ template <>
+ struct transform_attribute<utree const, int, karma::domain>
+ {
+ typedef int type;
+
+ static type pre(utree const& t)
+ {
+ return detail::get_or_deref<int>(t);
+ }
+ };
+
+ template <>
+ struct transform_attribute<utree const, double, karma::domain>
+ {
+ typedef double type;
+
+ static type pre(utree const& t)
+ {
+ return detail::get_or_deref<double>(t);
+ }
+ };
+
+ template <typename Traits, typename Alloc>
+ struct transform_attribute<
+ utree const, std::basic_string<char, Traits, Alloc>, karma::domain>
+ {
+ typedef std::basic_string<char, Traits, Alloc> type;
+
+ static type pre(utree const& t)
+ {
+ utf8_string_range_type r = detail::get_or_deref<utf8_string_range_type>(t);
+ return type(traits::begin(r), traits::end(r));
+ }
+ };
+
+ // this specialization is used whenever a utree is passed to a rule as part
+ // of a sequence
+ template <typename Iterator>
+ struct transform_attribute<
+ iterator_range<Iterator> const, utree, karma::domain>
+ {
+ typedef utree type;
+
+ static type pre(iterator_range<Iterator> const& t)
+ {
+ // return utree the begin iterator points to
+ Iterator it = boost::begin(t);
+ utree result(boost::ref(*it));
+ ++it;
+ return result;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct transform_attribute<utree const, utf8_string_type, karma::domain>
+ {
+ typedef std::string type;
+
+ static type pre(utree const& t)
+ {
+ utf8_string_range_type r = detail::get_or_deref<utf8_string_range_type>(t);
+ return std::string(traits::begin(r), traits::end(r));
+ }
+ };
+
+ template <>
+ struct transform_attribute<utree const, utf8_symbol_type, karma::domain>
+ {
+ typedef std::string type;
+
+ static type pre(utree const& t)
+ {
+ utf8_symbol_range_type r = detail::get_or_deref<utf8_symbol_range_type>(t);
+ return std::string(traits::begin(r), traits::end(r));
+ }
+ };
+
+ template <typename Attribute>
+ struct transform_attribute<utree::list_type const, Attribute, karma::domain>
+ : transform_attribute<utree const, Attribute, karma::domain>
+ {};
+}}}
+
+#endif
diff --git a/boost/spirit/home/support/utree/utree_traits_fwd.hpp b/boost/spirit/home/support/utree/utree_traits_fwd.hpp
new file mode 100644
index 0000000000..7830c7950f
--- /dev/null
+++ b/boost/spirit/home/support/utree/utree_traits_fwd.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_OUTPUT_UTREE_TRAITS_FWD_FEB_14_2011_0632AM)
+#define BOOST_SPIRIT_OUTPUT_UTREE_TRAITS_FWD_FEB_14_2011_0632AM
+
+///////////////////////////////////////////////////////////////////////////////
+// forward declarations only
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ class utree;
+}}
+
+namespace boost
+{
+ template <typename T>
+ inline T get(boost::spirit::utree const& x);
+}
+
+#endif
diff --git a/boost/spirit/include/classic.hpp b/boost/spirit/include/classic.hpp
new file mode 100644
index 0000000000..c3b0dd8e55
--- /dev/null
+++ b/boost/spirit/include/classic.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC
+#define BOOST_SPIRIT_INCLUDE_CLASSIC
+#include <boost/spirit/home/classic.hpp>
+#endif
diff --git a/boost/spirit/include/classic_actions.hpp b/boost/spirit/include/classic_actions.hpp
new file mode 100644
index 0000000000..a37d631b56
--- /dev/null
+++ b/boost/spirit/include/classic_actions.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CLASSIC_ACTIONS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CLASSIC_ACTIONS
+#include <boost/spirit/home/classic/core/composite/actions.hpp>
+#endif
diff --git a/boost/spirit/include/classic_actor.hpp b/boost/spirit/include/classic_actor.hpp
new file mode 100644
index 0000000000..a4c991419c
--- /dev/null
+++ b/boost/spirit/include/classic_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ACTOR
+#include <boost/spirit/home/classic/actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_alternative.hpp b/boost/spirit/include/classic_alternative.hpp
new file mode 100644
index 0000000000..d23aa32be9
--- /dev/null
+++ b/boost/spirit/include/classic_alternative.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ALTERNATIVE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ALTERNATIVE
+#include <boost/spirit/home/classic/core/composite/alternative.hpp>
+#endif
diff --git a/boost/spirit/include/classic_as_parser.hpp b/boost/spirit/include/classic_as_parser.hpp
new file mode 100644
index 0000000000..da55d40f4c
--- /dev/null
+++ b/boost/spirit/include/classic_as_parser.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_AS_PARSER
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_AS_PARSER
+#include <boost/spirit/home/classic/meta/as_parser.hpp>
+#endif
diff --git a/boost/spirit/include/classic_assert.hpp b/boost/spirit/include/classic_assert.hpp
new file mode 100644
index 0000000000..f6c4383cbc
--- /dev/null
+++ b/boost/spirit/include/classic_assert.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ASSERT
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ASSERT
+#include <boost/spirit/home/classic/core/assert.hpp>
+#endif
diff --git a/boost/spirit/include/classic_assign_actor.hpp b/boost/spirit/include/classic_assign_actor.hpp
new file mode 100644
index 0000000000..d85e19931f
--- /dev/null
+++ b/boost/spirit/include/classic_assign_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ASSIGN_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ASSIGN_ACTOR
+#include <boost/spirit/home/classic/actor/assign_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_assign_key_actor.hpp b/boost/spirit/include/classic_assign_key_actor.hpp
new file mode 100644
index 0000000000..38a81fee28
--- /dev/null
+++ b/boost/spirit/include/classic_assign_key_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ASSIGN_KEY_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ASSIGN_KEY_ACTOR
+#include <boost/spirit/home/classic/actor/assign_key_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_ast.hpp b/boost/spirit/include/classic_ast.hpp
new file mode 100644
index 0000000000..d70876c3b2
--- /dev/null
+++ b/boost/spirit/include/classic_ast.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_AST
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_AST
+#include <boost/spirit/home/classic/tree/ast.hpp>
+#endif
diff --git a/boost/spirit/include/classic_ast_fwd.hpp b/boost/spirit/include/classic_ast_fwd.hpp
new file mode 100644
index 0000000000..311859b099
--- /dev/null
+++ b/boost/spirit/include/classic_ast_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_AST_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_AST_FWD
+#include <boost/spirit/home/classic/tree/ast_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_attribute.hpp b/boost/spirit/include/classic_attribute.hpp
new file mode 100644
index 0000000000..033e484641
--- /dev/null
+++ b/boost/spirit/include/classic_attribute.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ATTRIBUTE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ATTRIBUTE
+#include <boost/spirit/home/classic/attribute.hpp>
+#endif
diff --git a/boost/spirit/include/classic_basic_chset.hpp b/boost/spirit/include/classic_basic_chset.hpp
new file mode 100644
index 0000000000..0a919c99c5
--- /dev/null
+++ b/boost/spirit/include/classic_basic_chset.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_BASIC_CHSET
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_BASIC_CHSET
+#include <boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp>
+#endif
diff --git a/boost/spirit/include/classic_chset.hpp b/boost/spirit/include/classic_chset.hpp
new file mode 100644
index 0000000000..2f8df490da
--- /dev/null
+++ b/boost/spirit/include/classic_chset.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CHSET
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CHSET
+#include <boost/spirit/home/classic/utility/chset.hpp>
+#endif
diff --git a/boost/spirit/include/classic_chset_operators.hpp b/boost/spirit/include/classic_chset_operators.hpp
new file mode 100644
index 0000000000..0bf8ea77ca
--- /dev/null
+++ b/boost/spirit/include/classic_chset_operators.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CHSET_OPERATORS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CHSET_OPERATORS
+#include <boost/spirit/home/classic/utility/chset_operators.hpp>
+#endif
diff --git a/boost/spirit/include/classic_clear_actor.hpp b/boost/spirit/include/classic_clear_actor.hpp
new file mode 100644
index 0000000000..289d4aac2a
--- /dev/null
+++ b/boost/spirit/include/classic_clear_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CLEAR_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CLEAR_ACTOR
+#include <boost/spirit/home/classic/actor/clear_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_closure.hpp b/boost/spirit/include/classic_closure.hpp
new file mode 100644
index 0000000000..977b923729
--- /dev/null
+++ b/boost/spirit/include/classic_closure.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CLOSURE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CLOSURE
+#include <boost/spirit/home/classic/attribute/closure.hpp>
+#endif
diff --git a/boost/spirit/include/classic_closure_context.hpp b/boost/spirit/include/classic_closure_context.hpp
new file mode 100644
index 0000000000..f2d6bc4a08
--- /dev/null
+++ b/boost/spirit/include/classic_closure_context.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CLOSURE_CONTEXT
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CLOSURE_CONTEXT
+#include <boost/spirit/home/classic/attribute/closure_context.hpp>
+#endif
diff --git a/boost/spirit/include/classic_closure_fwd.hpp b/boost/spirit/include/classic_closure_fwd.hpp
new file mode 100644
index 0000000000..428ba37933
--- /dev/null
+++ b/boost/spirit/include/classic_closure_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CLOSURE_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CLOSURE_FWD
+#include <boost/spirit/home/classic/attribute/closure_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_common.hpp b/boost/spirit/include/classic_common.hpp
new file mode 100644
index 0000000000..855f6be0fe
--- /dev/null
+++ b/boost/spirit/include/classic_common.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_COMMON
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_COMMON
+#include <boost/spirit/home/classic/tree/common.hpp>
+#endif
diff --git a/boost/spirit/include/classic_common_fwd.hpp b/boost/spirit/include/classic_common_fwd.hpp
new file mode 100644
index 0000000000..56f3abdff7
--- /dev/null
+++ b/boost/spirit/include/classic_common_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_COMMON_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_COMMON_FWD
+#include <boost/spirit/home/classic/tree/common_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_composite.hpp b/boost/spirit/include/classic_composite.hpp
new file mode 100644
index 0000000000..67a8c29394
--- /dev/null
+++ b/boost/spirit/include/classic_composite.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_COMPOSITE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_COMPOSITE
+#include <boost/spirit/home/classic/core/composite/composite.hpp>
+#endif
diff --git a/boost/spirit/include/classic_config.hpp b/boost/spirit/include/classic_config.hpp
new file mode 100644
index 0000000000..3462417942
--- /dev/null
+++ b/boost/spirit/include/classic_config.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CONFIG
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CONFIG
+#include <boost/spirit/home/classic/core/config.hpp>
+#endif
diff --git a/boost/spirit/include/classic_confix.hpp b/boost/spirit/include/classic_confix.hpp
new file mode 100644
index 0000000000..0c390da9ab
--- /dev/null
+++ b/boost/spirit/include/classic_confix.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CONFIX
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CONFIX
+#include <boost/spirit/home/classic/utility/confix.hpp>
+#endif
diff --git a/boost/spirit/include/classic_confix_fwd.hpp b/boost/spirit/include/classic_confix_fwd.hpp
new file mode 100644
index 0000000000..99b5a1a5f0
--- /dev/null
+++ b/boost/spirit/include/classic_confix_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CONFIX_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CONFIX_FWD
+#include <boost/spirit/home/classic/utility/confix_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_core.hpp b/boost/spirit/include/classic_core.hpp
new file mode 100644
index 0000000000..ba6aacbe7b
--- /dev/null
+++ b/boost/spirit/include/classic_core.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_CORE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_CORE
+#include <boost/spirit/home/classic/core.hpp>
+#endif
diff --git a/boost/spirit/include/classic_debug.hpp b/boost/spirit/include/classic_debug.hpp
new file mode 100644
index 0000000000..da5622d5a6
--- /dev/null
+++ b/boost/spirit/include/classic_debug.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_DEBUG
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_DEBUG
+#include <boost/spirit/home/classic/debug.hpp>
+#endif
diff --git a/boost/spirit/include/classic_debug_node.hpp b/boost/spirit/include/classic_debug_node.hpp
new file mode 100644
index 0000000000..bf127b3617
--- /dev/null
+++ b/boost/spirit/include/classic_debug_node.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_DEBUG_NODE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_DEBUG_NODE
+#include <boost/spirit/home/classic/debug/debug_node.hpp>
+#endif
diff --git a/boost/spirit/include/classic_decrement_actor.hpp b/boost/spirit/include/classic_decrement_actor.hpp
new file mode 100644
index 0000000000..4088d0e41d
--- /dev/null
+++ b/boost/spirit/include/classic_decrement_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_DECREMENT_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_DECREMENT_ACTOR
+#include <boost/spirit/home/classic/actor/decrement_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_difference.hpp b/boost/spirit/include/classic_difference.hpp
new file mode 100644
index 0000000000..e9f5451129
--- /dev/null
+++ b/boost/spirit/include/classic_difference.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_DIFFERENCE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_DIFFERENCE
+#include <boost/spirit/home/classic/core/composite/difference.hpp>
+#endif
diff --git a/boost/spirit/include/classic_directives.hpp b/boost/spirit/include/classic_directives.hpp
new file mode 100644
index 0000000000..b139a70e63
--- /dev/null
+++ b/boost/spirit/include/classic_directives.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_DIRECTIVES
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_DIRECTIVES
+#include <boost/spirit/home/classic/core/composite/directives.hpp>
+#endif
diff --git a/boost/spirit/include/classic_distinct.hpp b/boost/spirit/include/classic_distinct.hpp
new file mode 100644
index 0000000000..a0f6ce54f0
--- /dev/null
+++ b/boost/spirit/include/classic_distinct.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_DISTINCT
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_DISTINCT
+#include <boost/spirit/home/classic/utility/distinct.hpp>
+#endif
diff --git a/boost/spirit/include/classic_distinct_fwd.hpp b/boost/spirit/include/classic_distinct_fwd.hpp
new file mode 100644
index 0000000000..dd78230a92
--- /dev/null
+++ b/boost/spirit/include/classic_distinct_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_DISTINCT_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_DISTINCT_FWD
+#include <boost/spirit/home/classic/utility/distinct_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_dynamic.hpp b/boost/spirit/include/classic_dynamic.hpp
new file mode 100644
index 0000000000..91a772e55a
--- /dev/null
+++ b/boost/spirit/include/classic_dynamic.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_DYNAMIC
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_DYNAMIC
+#include <boost/spirit/home/classic/dynamic.hpp>
+#endif
diff --git a/boost/spirit/include/classic_epsilon.hpp b/boost/spirit/include/classic_epsilon.hpp
new file mode 100644
index 0000000000..00e2e1f8c9
--- /dev/null
+++ b/boost/spirit/include/classic_epsilon.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_EPSILON
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_EPSILON
+#include <boost/spirit/home/classic/core/composite/epsilon.hpp>
+#endif
diff --git a/boost/spirit/include/classic_erase_actor.hpp b/boost/spirit/include/classic_erase_actor.hpp
new file mode 100644
index 0000000000..9d79a2e9ef
--- /dev/null
+++ b/boost/spirit/include/classic_erase_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ERASE_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ERASE_ACTOR
+#include <boost/spirit/home/classic/actor/erase_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_error_handling.hpp b/boost/spirit/include/classic_error_handling.hpp
new file mode 100644
index 0000000000..307127852d
--- /dev/null
+++ b/boost/spirit/include/classic_error_handling.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ERROR_HANDLING
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ERROR_HANDLING
+#include <boost/spirit/home/classic/error_handling.hpp>
+#endif
diff --git a/boost/spirit/include/classic_escape_char.hpp b/boost/spirit/include/classic_escape_char.hpp
new file mode 100644
index 0000000000..08468cc9ef
--- /dev/null
+++ b/boost/spirit/include/classic_escape_char.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ESCAPE_CHAR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ESCAPE_CHAR
+#include <boost/spirit/home/classic/utility/escape_char.hpp>
+#endif
diff --git a/boost/spirit/include/classic_escape_char_fwd.hpp b/boost/spirit/include/classic_escape_char_fwd.hpp
new file mode 100644
index 0000000000..746ed3ee9d
--- /dev/null
+++ b/boost/spirit/include/classic_escape_char_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ESCAPE_CHAR_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ESCAPE_CHAR_FWD
+#include <boost/spirit/home/classic/utility/escape_char_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_exceptions.hpp b/boost/spirit/include/classic_exceptions.hpp
new file mode 100644
index 0000000000..1ad41099de
--- /dev/null
+++ b/boost/spirit/include/classic_exceptions.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_EXCEPTIONS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_EXCEPTIONS
+#include <boost/spirit/home/classic/error_handling/exceptions.hpp>
+#endif
diff --git a/boost/spirit/include/classic_exceptions_fwd.hpp b/boost/spirit/include/classic_exceptions_fwd.hpp
new file mode 100644
index 0000000000..ae923f54fc
--- /dev/null
+++ b/boost/spirit/include/classic_exceptions_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_EXCEPTIONS_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_EXCEPTIONS_FWD
+#include <boost/spirit/home/classic/error_handling/exceptions_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_exclusive_or.hpp b/boost/spirit/include/classic_exclusive_or.hpp
new file mode 100644
index 0000000000..ea2e13b72c
--- /dev/null
+++ b/boost/spirit/include/classic_exclusive_or.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_EXCLUSIVE_OR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_EXCLUSIVE_OR
+#include <boost/spirit/home/classic/core/composite/exclusive_or.hpp>
+#endif
diff --git a/boost/spirit/include/classic_file_iterator.hpp b/boost/spirit/include/classic_file_iterator.hpp
new file mode 100644
index 0000000000..11e5efeb00
--- /dev/null
+++ b/boost/spirit/include/classic_file_iterator.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_FILE_ITERATOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_FILE_ITERATOR
+#include <boost/spirit/home/classic/iterator/file_iterator.hpp>
+#endif
diff --git a/boost/spirit/include/classic_file_iterator_fwd.hpp b/boost/spirit/include/classic_file_iterator_fwd.hpp
new file mode 100644
index 0000000000..61505ceef3
--- /dev/null
+++ b/boost/spirit/include/classic_file_iterator_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_FILE_ITERATOR_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_FILE_ITERATOR_FWD
+#include <boost/spirit/home/classic/iterator/file_iterator_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_fixed_size_queue.hpp b/boost/spirit/include/classic_fixed_size_queue.hpp
new file mode 100644
index 0000000000..4caf7146b9
--- /dev/null
+++ b/boost/spirit/include/classic_fixed_size_queue.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_FIXED_SIZE_QUEUE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_FIXED_SIZE_QUEUE
+#include <boost/spirit/home/classic/iterator/fixed_size_queue.hpp>
+#endif
diff --git a/boost/spirit/include/classic_flush_multi_pass.hpp b/boost/spirit/include/classic_flush_multi_pass.hpp
new file mode 100644
index 0000000000..6dd78f6108
--- /dev/null
+++ b/boost/spirit/include/classic_flush_multi_pass.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_FLUSH_MULTI_PASS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_FLUSH_MULTI_PASS
+#include <boost/spirit/home/classic/utility/flush_multi_pass.hpp>
+#endif
diff --git a/boost/spirit/include/classic_for.hpp b/boost/spirit/include/classic_for.hpp
new file mode 100644
index 0000000000..9b18f94a87
--- /dev/null
+++ b/boost/spirit/include/classic_for.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_FOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_FOR
+#include <boost/spirit/home/classic/dynamic/for.hpp>
+#endif
diff --git a/boost/spirit/include/classic_functor_parser.hpp b/boost/spirit/include/classic_functor_parser.hpp
new file mode 100644
index 0000000000..f0bfb904ef
--- /dev/null
+++ b/boost/spirit/include/classic_functor_parser.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_FUNCTOR_PARSER
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_FUNCTOR_PARSER
+#include <boost/spirit/home/classic/utility/functor_parser.hpp>
+#endif
diff --git a/boost/spirit/include/classic_fundamental.hpp b/boost/spirit/include/classic_fundamental.hpp
new file mode 100644
index 0000000000..bced502c30
--- /dev/null
+++ b/boost/spirit/include/classic_fundamental.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_FUNDAMENTAL
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_FUNDAMENTAL
+#include <boost/spirit/home/classic/meta/fundamental.hpp>
+#endif
diff --git a/boost/spirit/include/classic_grammar.hpp b/boost/spirit/include/classic_grammar.hpp
new file mode 100644
index 0000000000..a1528af691
--- /dev/null
+++ b/boost/spirit/include/classic_grammar.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_GRAMMAR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_GRAMMAR
+#include <boost/spirit/home/classic/core/non_terminal/grammar.hpp>
+#endif
diff --git a/boost/spirit/include/classic_grammar_def.hpp b/boost/spirit/include/classic_grammar_def.hpp
new file mode 100644
index 0000000000..1af6b6a6e1
--- /dev/null
+++ b/boost/spirit/include/classic_grammar_def.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_GRAMMAR_DEF
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_GRAMMAR_DEF
+#include <boost/spirit/home/classic/utility/grammar_def.hpp>
+#endif
diff --git a/boost/spirit/include/classic_grammar_def_fwd.hpp b/boost/spirit/include/classic_grammar_def_fwd.hpp
new file mode 100644
index 0000000000..c07cd73f6a
--- /dev/null
+++ b/boost/spirit/include/classic_grammar_def_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_GRAMMAR_DEF_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_GRAMMAR_DEF_FWD
+#include <boost/spirit/home/classic/utility/grammar_def_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_if.hpp b/boost/spirit/include/classic_if.hpp
new file mode 100644
index 0000000000..14a84c80de
--- /dev/null
+++ b/boost/spirit/include/classic_if.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_IF
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_IF
+#include <boost/spirit/home/classic/dynamic/if.hpp>
+#endif
diff --git a/boost/spirit/include/classic_increment_actor.hpp b/boost/spirit/include/classic_increment_actor.hpp
new file mode 100644
index 0000000000..af0c3b51de
--- /dev/null
+++ b/boost/spirit/include/classic_increment_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_INCREMENT_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_INCREMENT_ACTOR
+#include <boost/spirit/home/classic/actor/increment_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_insert_at_actor.hpp b/boost/spirit/include/classic_insert_at_actor.hpp
new file mode 100644
index 0000000000..9c75afc098
--- /dev/null
+++ b/boost/spirit/include/classic_insert_at_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_INSERT_AT_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_INSERT_AT_ACTOR
+#include <boost/spirit/home/classic/actor/insert_at_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_insert_key_actor.hpp b/boost/spirit/include/classic_insert_key_actor.hpp
new file mode 100644
index 0000000000..d7ce5e84b9
--- /dev/null
+++ b/boost/spirit/include/classic_insert_key_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_INSERT_KEY_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_INSERT_KEY_ACTOR
+#include <boost/spirit/home/classic/actor/insert_key_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_intersection.hpp b/boost/spirit/include/classic_intersection.hpp
new file mode 100644
index 0000000000..386f3f74d6
--- /dev/null
+++ b/boost/spirit/include/classic_intersection.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_INTERSECTION
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_INTERSECTION
+#include <boost/spirit/home/classic/core/composite/intersection.hpp>
+#endif
diff --git a/boost/spirit/include/classic_iterator.hpp b/boost/spirit/include/classic_iterator.hpp
new file mode 100644
index 0000000000..67eb7e8d85
--- /dev/null
+++ b/boost/spirit/include/classic_iterator.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_ITERATOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_ITERATOR
+#include <boost/spirit/home/classic/iterator.hpp>
+#endif
diff --git a/boost/spirit/include/classic_kleene_star.hpp b/boost/spirit/include/classic_kleene_star.hpp
new file mode 100644
index 0000000000..829318ad99
--- /dev/null
+++ b/boost/spirit/include/classic_kleene_star.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_KLEENE_STAR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_KLEENE_STAR
+#include <boost/spirit/home/classic/core/composite/kleene_star.hpp>
+#endif
diff --git a/boost/spirit/include/classic_lazy.hpp b/boost/spirit/include/classic_lazy.hpp
new file mode 100644
index 0000000000..8f8b3444ee
--- /dev/null
+++ b/boost/spirit/include/classic_lazy.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_LAZY
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_LAZY
+#include <boost/spirit/home/classic/dynamic/lazy.hpp>
+#endif
diff --git a/boost/spirit/include/classic_list.hpp b/boost/spirit/include/classic_list.hpp
new file mode 100644
index 0000000000..e3ddaf3184
--- /dev/null
+++ b/boost/spirit/include/classic_list.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_LIST
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_LIST
+#include <boost/spirit/home/classic/core/composite/list.hpp>
+#endif
diff --git a/boost/spirit/include/classic_lists.hpp b/boost/spirit/include/classic_lists.hpp
new file mode 100644
index 0000000000..f5d4b2693d
--- /dev/null
+++ b/boost/spirit/include/classic_lists.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_LISTS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_LISTS
+#include <boost/spirit/home/classic/utility/lists.hpp>
+#endif
diff --git a/boost/spirit/include/classic_lists_fwd.hpp b/boost/spirit/include/classic_lists_fwd.hpp
new file mode 100644
index 0000000000..bd95132b68
--- /dev/null
+++ b/boost/spirit/include/classic_lists_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_LISTS_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_LISTS_FWD
+#include <boost/spirit/home/classic/utility/lists_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_loops.hpp b/boost/spirit/include/classic_loops.hpp
new file mode 100644
index 0000000000..bd5255b09c
--- /dev/null
+++ b/boost/spirit/include/classic_loops.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_LOOPS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_LOOPS
+#include <boost/spirit/home/classic/utility/loops.hpp>
+#endif
diff --git a/boost/spirit/include/classic_match.hpp b/boost/spirit/include/classic_match.hpp
new file mode 100644
index 0000000000..a8e4218ffe
--- /dev/null
+++ b/boost/spirit/include/classic_match.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_MATCH
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_MATCH
+#include <boost/spirit/home/classic/core/match.hpp>
+#endif
diff --git a/boost/spirit/include/classic_meta.hpp b/boost/spirit/include/classic_meta.hpp
new file mode 100644
index 0000000000..aa604a2e10
--- /dev/null
+++ b/boost/spirit/include/classic_meta.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_META
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_META
+#include <boost/spirit/home/classic/meta.hpp>
+#endif
diff --git a/boost/spirit/include/classic_minimal.hpp b/boost/spirit/include/classic_minimal.hpp
new file mode 100644
index 0000000000..c4757c87d2
--- /dev/null
+++ b/boost/spirit/include/classic_minimal.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_MINIMAL
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_MINIMAL
+#include <boost/spirit/home/classic/debug/minimal.hpp>
+#endif
diff --git a/boost/spirit/include/classic_multi_pass.hpp b/boost/spirit/include/classic_multi_pass.hpp
new file mode 100644
index 0000000000..4d4c0765c2
--- /dev/null
+++ b/boost/spirit/include/classic_multi_pass.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_MULTI_PASS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_MULTI_PASS
+#include <boost/spirit/home/classic/iterator/multi_pass.hpp>
+#endif
diff --git a/boost/spirit/include/classic_multi_pass_fwd.hpp b/boost/spirit/include/classic_multi_pass_fwd.hpp
new file mode 100644
index 0000000000..7e5675c46a
--- /dev/null
+++ b/boost/spirit/include/classic_multi_pass_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_MULTI_PASS_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_MULTI_PASS_FWD
+#include <boost/spirit/home/classic/iterator/multi_pass_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_nil.hpp b/boost/spirit/include/classic_nil.hpp
new file mode 100644
index 0000000000..ae47dc2e12
--- /dev/null
+++ b/boost/spirit/include/classic_nil.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_NIL
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_NIL
+#include <boost/spirit/home/classic/core/nil.hpp>
+#endif
diff --git a/boost/spirit/include/classic_no_actions.hpp b/boost/spirit/include/classic_no_actions.hpp
new file mode 100644
index 0000000000..7fc244a919
--- /dev/null
+++ b/boost/spirit/include/classic_no_actions.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_NO_ACTIONS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_NO_ACTIONS
+#include <boost/spirit/home/classic/core/composite/no_actions.hpp>
+#endif
diff --git a/boost/spirit/include/classic_numerics.hpp b/boost/spirit/include/classic_numerics.hpp
new file mode 100644
index 0000000000..75f7c053b5
--- /dev/null
+++ b/boost/spirit/include/classic_numerics.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_NUMERICS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_NUMERICS
+#include <boost/spirit/home/classic/core/primitives/numerics.hpp>
+#endif
diff --git a/boost/spirit/include/classic_numerics_fwd.hpp b/boost/spirit/include/classic_numerics_fwd.hpp
new file mode 100644
index 0000000000..b881dfca03
--- /dev/null
+++ b/boost/spirit/include/classic_numerics_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_NUMERICS_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_NUMERICS_FWD
+#include <boost/spirit/home/classic/core/primitives/numerics_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_operators.hpp b/boost/spirit/include/classic_operators.hpp
new file mode 100644
index 0000000000..c05d947796
--- /dev/null
+++ b/boost/spirit/include/classic_operators.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_OPERATORS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_OPERATORS
+#include <boost/spirit/home/classic/core/composite/operators.hpp>
+#endif
diff --git a/boost/spirit/include/classic_optional.hpp b/boost/spirit/include/classic_optional.hpp
new file mode 100644
index 0000000000..d1bb3db837
--- /dev/null
+++ b/boost/spirit/include/classic_optional.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_OPTIONAL
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_OPTIONAL
+#include <boost/spirit/home/classic/core/composite/optional.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parametric.hpp b/boost/spirit/include/classic_parametric.hpp
new file mode 100644
index 0000000000..38f4cae916
--- /dev/null
+++ b/boost/spirit/include/classic_parametric.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARAMETRIC
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARAMETRIC
+#include <boost/spirit/home/classic/attribute/parametric.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parse_tree.hpp b/boost/spirit/include/classic_parse_tree.hpp
new file mode 100644
index 0000000000..566297bc90
--- /dev/null
+++ b/boost/spirit/include/classic_parse_tree.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARSE_TREE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARSE_TREE
+#include <boost/spirit/home/classic/tree/parse_tree.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parse_tree_fwd.hpp b/boost/spirit/include/classic_parse_tree_fwd.hpp
new file mode 100644
index 0000000000..f993262f67
--- /dev/null
+++ b/boost/spirit/include/classic_parse_tree_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARSE_TREE_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARSE_TREE_FWD
+#include <boost/spirit/home/classic/tree/parse_tree_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parse_tree_utils.hpp b/boost/spirit/include/classic_parse_tree_utils.hpp
new file mode 100644
index 0000000000..32bb9d4ef8
--- /dev/null
+++ b/boost/spirit/include/classic_parse_tree_utils.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARSE_TREE_UTILS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARSE_TREE_UTILS
+#include <boost/spirit/home/classic/tree/parse_tree_utils.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parser.hpp b/boost/spirit/include/classic_parser.hpp
new file mode 100644
index 0000000000..51051ccc30
--- /dev/null
+++ b/boost/spirit/include/classic_parser.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARSER
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARSER
+#include <boost/spirit/home/classic/core/parser.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parser_context.hpp b/boost/spirit/include/classic_parser_context.hpp
new file mode 100644
index 0000000000..68a9e56edf
--- /dev/null
+++ b/boost/spirit/include/classic_parser_context.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARSER_CONTEXT
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARSER_CONTEXT
+#include <boost/spirit/home/classic/core/non_terminal/parser_context.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parser_id.hpp b/boost/spirit/include/classic_parser_id.hpp
new file mode 100644
index 0000000000..128a5a4840
--- /dev/null
+++ b/boost/spirit/include/classic_parser_id.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARSER_ID
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARSER_ID
+#include <boost/spirit/home/classic/core/non_terminal/parser_id.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parser_names.hpp b/boost/spirit/include/classic_parser_names.hpp
new file mode 100644
index 0000000000..da4fe801b2
--- /dev/null
+++ b/boost/spirit/include/classic_parser_names.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARSER_NAMES
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARSER_NAMES
+#include <boost/spirit/home/classic/debug/parser_names.hpp>
+#endif
diff --git a/boost/spirit/include/classic_parser_traits.hpp b/boost/spirit/include/classic_parser_traits.hpp
new file mode 100644
index 0000000000..76b8275da8
--- /dev/null
+++ b/boost/spirit/include/classic_parser_traits.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PARSER_TRAITS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PARSER_TRAITS
+#include <boost/spirit/home/classic/meta/parser_traits.hpp>
+#endif
diff --git a/boost/spirit/include/classic_position_iterator.hpp b/boost/spirit/include/classic_position_iterator.hpp
new file mode 100644
index 0000000000..441b682c72
--- /dev/null
+++ b/boost/spirit/include/classic_position_iterator.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_POSITION_ITERATOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_POSITION_ITERATOR
+#include <boost/spirit/home/classic/iterator/position_iterator.hpp>
+#endif
diff --git a/boost/spirit/include/classic_position_iterator_fwd.hpp b/boost/spirit/include/classic_position_iterator_fwd.hpp
new file mode 100644
index 0000000000..fe4849d11c
--- /dev/null
+++ b/boost/spirit/include/classic_position_iterator_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_POSITION_ITERATOR_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_POSITION_ITERATOR_FWD
+#include <boost/spirit/home/classic/iterator/position_iterator_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_positive.hpp b/boost/spirit/include/classic_positive.hpp
new file mode 100644
index 0000000000..9f4a467715
--- /dev/null
+++ b/boost/spirit/include/classic_positive.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_POSITIVE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_POSITIVE
+#include <boost/spirit/home/classic/core/composite/positive.hpp>
+#endif
diff --git a/boost/spirit/include/classic_primitives.hpp b/boost/spirit/include/classic_primitives.hpp
new file mode 100644
index 0000000000..02650dd81c
--- /dev/null
+++ b/boost/spirit/include/classic_primitives.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PRIMITIVES
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PRIMITIVES
+#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
+#endif
diff --git a/boost/spirit/include/classic_push_back_actor.hpp b/boost/spirit/include/classic_push_back_actor.hpp
new file mode 100644
index 0000000000..c849a1299d
--- /dev/null
+++ b/boost/spirit/include/classic_push_back_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PUSH_BACK_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PUSH_BACK_ACTOR
+#include <boost/spirit/home/classic/actor/push_back_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_push_front_actor.hpp b/boost/spirit/include/classic_push_front_actor.hpp
new file mode 100644
index 0000000000..432fbd4c57
--- /dev/null
+++ b/boost/spirit/include/classic_push_front_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_PUSH_FRONT_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_PUSH_FRONT_ACTOR
+#include <boost/spirit/home/classic/actor/push_front_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_range_run.hpp b/boost/spirit/include/classic_range_run.hpp
new file mode 100644
index 0000000000..20f3a278e0
--- /dev/null
+++ b/boost/spirit/include/classic_range_run.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_RANGE_RUN
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_RANGE_RUN
+#include <boost/spirit/home/classic/utility/impl/chset/range_run.hpp>
+#endif
diff --git a/boost/spirit/include/classic_ref_actor.hpp b/boost/spirit/include/classic_ref_actor.hpp
new file mode 100644
index 0000000000..d0c9a7bfea
--- /dev/null
+++ b/boost/spirit/include/classic_ref_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_REF_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_REF_ACTOR
+#include <boost/spirit/home/classic/actor/ref_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_ref_const_ref_actor.hpp b/boost/spirit/include/classic_ref_const_ref_actor.hpp
new file mode 100644
index 0000000000..95b85a605d
--- /dev/null
+++ b/boost/spirit/include/classic_ref_const_ref_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_REF_CONST_REF_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_REF_CONST_REF_ACTOR
+#include <boost/spirit/home/classic/actor/ref_const_ref_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_ref_const_ref_const_ref_a.hpp b/boost/spirit/include/classic_ref_const_ref_const_ref_a.hpp
new file mode 100644
index 0000000000..5293ee86d8
--- /dev/null
+++ b/boost/spirit/include/classic_ref_const_ref_const_ref_a.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_REF_CONST_REF_CONST_REF_A
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_REF_CONST_REF_CONST_REF_A
+#include <boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp>
+#endif
diff --git a/boost/spirit/include/classic_ref_const_ref_value_actor.hpp b/boost/spirit/include/classic_ref_const_ref_value_actor.hpp
new file mode 100644
index 0000000000..880fa7f8a2
--- /dev/null
+++ b/boost/spirit/include/classic_ref_const_ref_value_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_REF_CONST_REF_VALUE_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_REF_CONST_REF_VALUE_ACTOR
+#include <boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_ref_value_actor.hpp b/boost/spirit/include/classic_ref_value_actor.hpp
new file mode 100644
index 0000000000..3ed730dde2
--- /dev/null
+++ b/boost/spirit/include/classic_ref_value_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_REF_VALUE_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_REF_VALUE_ACTOR
+#include <boost/spirit/home/classic/actor/ref_value_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_refactoring.hpp b/boost/spirit/include/classic_refactoring.hpp
new file mode 100644
index 0000000000..94f54879cc
--- /dev/null
+++ b/boost/spirit/include/classic_refactoring.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_REFACTORING
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_REFACTORING
+#include <boost/spirit/home/classic/meta/refactoring.hpp>
+#endif
diff --git a/boost/spirit/include/classic_regex.hpp b/boost/spirit/include/classic_regex.hpp
new file mode 100644
index 0000000000..18f05a14a1
--- /dev/null
+++ b/boost/spirit/include/classic_regex.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_REGEX
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_REGEX
+#include <boost/spirit/home/classic/utility/regex.hpp>
+#endif
diff --git a/boost/spirit/include/classic_rule.hpp b/boost/spirit/include/classic_rule.hpp
new file mode 100644
index 0000000000..c2e0df1d34
--- /dev/null
+++ b/boost/spirit/include/classic_rule.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_RULE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_RULE
+#include <boost/spirit/home/classic/core/non_terminal/rule.hpp>
+#endif
diff --git a/boost/spirit/include/classic_rule_alias.hpp b/boost/spirit/include/classic_rule_alias.hpp
new file mode 100644
index 0000000000..6577ab5185
--- /dev/null
+++ b/boost/spirit/include/classic_rule_alias.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_RULE_ALIAS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_RULE_ALIAS
+#include <boost/spirit/home/classic/dynamic/rule_alias.hpp>
+#endif
diff --git a/boost/spirit/include/classic_rule_parser.hpp b/boost/spirit/include/classic_rule_parser.hpp
new file mode 100644
index 0000000000..b1775186ef
--- /dev/null
+++ b/boost/spirit/include/classic_rule_parser.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_RULE_PARSER
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_RULE_PARSER
+#include <boost/spirit/home/classic/utility/rule_parser.hpp>
+#endif
diff --git a/boost/spirit/include/classic_safe_bool.hpp b/boost/spirit/include/classic_safe_bool.hpp
new file mode 100644
index 0000000000..a7e470a5c7
--- /dev/null
+++ b/boost/spirit/include/classic_safe_bool.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SAFE_BOOL
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SAFE_BOOL
+#include <boost/spirit/home/classic/core/safe_bool.hpp>
+#endif
diff --git a/boost/spirit/include/classic_scanner.hpp b/boost/spirit/include/classic_scanner.hpp
new file mode 100644
index 0000000000..9088d78b13
--- /dev/null
+++ b/boost/spirit/include/classic_scanner.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SCANNER
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SCANNER
+#include <boost/spirit/home/classic/core/scanner/scanner.hpp>
+#endif
diff --git a/boost/spirit/include/classic_scanner_fwd.hpp b/boost/spirit/include/classic_scanner_fwd.hpp
new file mode 100644
index 0000000000..972dca715c
--- /dev/null
+++ b/boost/spirit/include/classic_scanner_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SCANNER_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SCANNER_FWD
+#include <boost/spirit/home/classic/core/scanner/scanner_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_scoped_lock.hpp b/boost/spirit/include/classic_scoped_lock.hpp
new file mode 100644
index 0000000000..6e1a3e0404
--- /dev/null
+++ b/boost/spirit/include/classic_scoped_lock.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SCOPED_LOCK
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SCOPED_LOCK
+#include <boost/spirit/home/classic/utility/scoped_lock.hpp>
+#endif
diff --git a/boost/spirit/include/classic_select.hpp b/boost/spirit/include/classic_select.hpp
new file mode 100644
index 0000000000..d7514f3284
--- /dev/null
+++ b/boost/spirit/include/classic_select.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SELECT
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SELECT
+#include <boost/spirit/home/classic/dynamic/select.hpp>
+#endif
diff --git a/boost/spirit/include/classic_sequence.hpp b/boost/spirit/include/classic_sequence.hpp
new file mode 100644
index 0000000000..babe66b340
--- /dev/null
+++ b/boost/spirit/include/classic_sequence.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SEQUENCE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SEQUENCE
+#include <boost/spirit/home/classic/core/composite/sequence.hpp>
+#endif
diff --git a/boost/spirit/include/classic_sequential_and.hpp b/boost/spirit/include/classic_sequential_and.hpp
new file mode 100644
index 0000000000..67465cee61
--- /dev/null
+++ b/boost/spirit/include/classic_sequential_and.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SEQUENTIAL_AND
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SEQUENTIAL_AND
+#include <boost/spirit/home/classic/core/composite/sequential_and.hpp>
+#endif
diff --git a/boost/spirit/include/classic_sequential_or.hpp b/boost/spirit/include/classic_sequential_or.hpp
new file mode 100644
index 0000000000..f8b6f3d246
--- /dev/null
+++ b/boost/spirit/include/classic_sequential_or.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SEQUENTIAL_OR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SEQUENTIAL_OR
+#include <boost/spirit/home/classic/core/composite/sequential_or.hpp>
+#endif
diff --git a/boost/spirit/include/classic_skipper.hpp b/boost/spirit/include/classic_skipper.hpp
new file mode 100644
index 0000000000..b8faf9aa0f
--- /dev/null
+++ b/boost/spirit/include/classic_skipper.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SKIPPER
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SKIPPER
+#include <boost/spirit/home/classic/core/scanner/skipper.hpp>
+#endif
diff --git a/boost/spirit/include/classic_skipper_fwd.hpp b/boost/spirit/include/classic_skipper_fwd.hpp
new file mode 100644
index 0000000000..6837973bb9
--- /dev/null
+++ b/boost/spirit/include/classic_skipper_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SKIPPER_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SKIPPER_FWD
+#include <boost/spirit/home/classic/core/scanner/skipper_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_spirit.hpp b/boost/spirit/include/classic_spirit.hpp
new file mode 100644
index 0000000000..fcfc851617
--- /dev/null
+++ b/boost/spirit/include/classic_spirit.hpp
@@ -0,0 +1,13 @@
+/*=============================================================================
+ Copyright (c) 1998-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+
+ Distributed under the 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_SPIRIT_CLASSIC_APR_12_2008_0949AM)
+#define BOOST_SPIRIT_CLASSIC_APR_12_2008_0949AM
+
+#include <boost/spirit/home/classic.hpp>
+
+#endif // !defined(SPIRIT_CLASSIC_HPP)
diff --git a/boost/spirit/include/classic_static.hpp b/boost/spirit/include/classic_static.hpp
new file mode 100644
index 0000000000..bd12e0e257
--- /dev/null
+++ b/boost/spirit/include/classic_static.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_STATIC
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_STATIC
+#include <boost/spirit/home/classic/core/non_terminal/impl/static.hpp>
+#endif
diff --git a/boost/spirit/include/classic_stored_rule.hpp b/boost/spirit/include/classic_stored_rule.hpp
new file mode 100644
index 0000000000..c7370ee7a5
--- /dev/null
+++ b/boost/spirit/include/classic_stored_rule.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_STORED_RULE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_STORED_RULE
+#include <boost/spirit/home/classic/dynamic/stored_rule.hpp>
+#endif
diff --git a/boost/spirit/include/classic_stored_rule_fwd.hpp b/boost/spirit/include/classic_stored_rule_fwd.hpp
new file mode 100644
index 0000000000..0e7b9c67f0
--- /dev/null
+++ b/boost/spirit/include/classic_stored_rule_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_STORED_RULE_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_STORED_RULE_FWD
+#include <boost/spirit/home/classic/dynamic/stored_rule_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_subrule.hpp b/boost/spirit/include/classic_subrule.hpp
new file mode 100644
index 0000000000..e16db05354
--- /dev/null
+++ b/boost/spirit/include/classic_subrule.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SUBRULE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SUBRULE
+#include <boost/spirit/home/classic/core/non_terminal/subrule.hpp>
+#endif
diff --git a/boost/spirit/include/classic_subrule_fwd.hpp b/boost/spirit/include/classic_subrule_fwd.hpp
new file mode 100644
index 0000000000..012693f31c
--- /dev/null
+++ b/boost/spirit/include/classic_subrule_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SUBRULE_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SUBRULE_FWD
+#include <boost/spirit/home/classic/core/non_terminal/subrule_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_swap_actor.hpp b/boost/spirit/include/classic_swap_actor.hpp
new file mode 100644
index 0000000000..ad60ebb007
--- /dev/null
+++ b/boost/spirit/include/classic_swap_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SWAP_ACTOR
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SWAP_ACTOR
+#include <boost/spirit/home/classic/actor/swap_actor.hpp>
+#endif
diff --git a/boost/spirit/include/classic_switch.hpp b/boost/spirit/include/classic_switch.hpp
new file mode 100644
index 0000000000..ad6b9bafbf
--- /dev/null
+++ b/boost/spirit/include/classic_switch.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SWITCH
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SWITCH
+#include <boost/spirit/home/classic/dynamic/switch.hpp>
+#endif
diff --git a/boost/spirit/include/classic_symbols.hpp b/boost/spirit/include/classic_symbols.hpp
new file mode 100644
index 0000000000..ff16ff4f3e
--- /dev/null
+++ b/boost/spirit/include/classic_symbols.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SYMBOLS
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SYMBOLS
+#include <boost/spirit/home/classic/symbols.hpp>
+#endif
diff --git a/boost/spirit/include/classic_symbols_fwd.hpp b/boost/spirit/include/classic_symbols_fwd.hpp
new file mode 100644
index 0000000000..da2dbff2bd
--- /dev/null
+++ b/boost/spirit/include/classic_symbols_fwd.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_SYMBOLS_FWD
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_SYMBOLS_FWD
+#include <boost/spirit/home/classic/symbols/symbols_fwd.hpp>
+#endif
diff --git a/boost/spirit/include/classic_traverse.hpp b/boost/spirit/include/classic_traverse.hpp
new file mode 100644
index 0000000000..a7642346be
--- /dev/null
+++ b/boost/spirit/include/classic_traverse.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_TRAVERSE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_TRAVERSE
+#include <boost/spirit/home/classic/meta/traverse.hpp>
+#endif
diff --git a/boost/spirit/include/classic_tree_to_xml.hpp b/boost/spirit/include/classic_tree_to_xml.hpp
new file mode 100644
index 0000000000..29dc2edadb
--- /dev/null
+++ b/boost/spirit/include/classic_tree_to_xml.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_TREE_TO_XML
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_TREE_TO_XML
+#include <boost/spirit/home/classic/tree/tree_to_xml.hpp>
+#endif
diff --git a/boost/spirit/include/classic_typeof.hpp b/boost/spirit/include/classic_typeof.hpp
new file mode 100644
index 0000000000..fc9b6965f3
--- /dev/null
+++ b/boost/spirit/include/classic_typeof.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_TYPEOF
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_TYPEOF
+#include <boost/spirit/home/classic/actor/typeof.hpp>
+#endif
diff --git a/boost/spirit/include/classic_utility.hpp b/boost/spirit/include/classic_utility.hpp
new file mode 100644
index 0000000000..e4d1b8105a
--- /dev/null
+++ b/boost/spirit/include/classic_utility.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_UTILITY
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_UTILITY
+#include <boost/spirit/home/classic/utility.hpp>
+#endif
diff --git a/boost/spirit/include/classic_version.hpp b/boost/spirit/include/classic_version.hpp
new file mode 100644
index 0000000000..7944af13b1
--- /dev/null
+++ b/boost/spirit/include/classic_version.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_VERSION
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_VERSION
+#include <boost/spirit/home/classic/version.hpp>
+#endif
diff --git a/boost/spirit/include/classic_while.hpp b/boost/spirit/include/classic_while.hpp
new file mode 100644
index 0000000000..e383d40ff3
--- /dev/null
+++ b/boost/spirit/include/classic_while.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_CLASSIC_WHILE
+#define BOOST_SPIRIT_INCLUDE_CLASSIC_WHILE
+#include <boost/spirit/home/classic/dynamic/while.hpp>
+#endif
diff --git a/boost/spirit/include/karma.hpp b/boost/spirit/include/karma.hpp
new file mode 100644
index 0000000000..281250b869
--- /dev/null
+++ b/boost/spirit/include/karma.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA
+#define BOOST_SPIRIT_INCLUDE_KARMA
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_action.hpp b/boost/spirit/include/karma_action.hpp
new file mode 100644
index 0000000000..690017c673
--- /dev/null
+++ b/boost/spirit/include/karma_action.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_ACTION
+#define BOOST_SPIRIT_INCLUDE_KARMA_ACTION
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/action.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_alternative.hpp b/boost/spirit/include/karma_alternative.hpp
new file mode 100644
index 0000000000..c8708a00aa
--- /dev/null
+++ b/boost/spirit/include/karma_alternative.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_ALTERNATIVE
+#define BOOST_SPIRIT_INCLUDE_KARMA_ALTERNATIVE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/alternative.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_and_predicate.hpp b/boost/spirit/include/karma_and_predicate.hpp
new file mode 100644
index 0000000000..ee81faac38
--- /dev/null
+++ b/boost/spirit/include/karma_and_predicate.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_AND_PREDICATE
+#define BOOST_SPIRIT_INCLUDE_KARMA_AND_PREDICATE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/and_predicate.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_as.hpp b/boost/spirit/include/karma_as.hpp
new file mode 100644
index 0000000000..48b7372f5f
--- /dev/null
+++ b/boost/spirit/include/karma_as.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2010 Bryce Lelbach
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_AS
+#define BOOST_SPIRIT_INCLUDE_KARMA_AS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/as.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_attr_cast.hpp b/boost/spirit/include/karma_attr_cast.hpp
new file mode 100644
index 0000000000..0699f2cab3
--- /dev/null
+++ b/boost/spirit/include/karma_attr_cast.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_ATTR_CAST
+#define BOOST_SPIRIT_INCLUDE_KARMA_ATTR_CAST
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auxiliary/attr_cast.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_auto.hpp b/boost/spirit/include/karma_auto.hpp
new file mode 100644
index 0000000000..c71779316d
--- /dev/null
+++ b/boost/spirit/include/karma_auto.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_AUTO
+#define BOOST_SPIRIT_INCLUDE_KARMA_AUTO
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auto.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_auxiliary.hpp b/boost/spirit/include/karma_auxiliary.hpp
new file mode 100644
index 0000000000..94b9976875
--- /dev/null
+++ b/boost/spirit/include/karma_auxiliary.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_AUXILIARY
+#define BOOST_SPIRIT_INCLUDE_KARMA_AUXILIARY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auxiliary.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_binary.hpp b/boost/spirit/include/karma_binary.hpp
new file mode 100644
index 0000000000..85679a8651
--- /dev/null
+++ b/boost/spirit/include/karma_binary.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_BINARY
+#define BOOST_SPIRIT_INCLUDE_KARMA_BINARY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/binary.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_bool.hpp b/boost/spirit/include/karma_bool.hpp
new file mode 100644
index 0000000000..e76de1bd77
--- /dev/null
+++ b/boost/spirit/include/karma_bool.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_BOOL
+#define BOOST_SPIRIT_INCLUDE_KARMA_BOOL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/numeric/bool.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_buffer.hpp b/boost/spirit/include/karma_buffer.hpp
new file mode 100644
index 0000000000..c4252a28c8
--- /dev/null
+++ b/boost/spirit/include/karma_buffer.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_BUFFER
+#define BOOST_SPIRIT_INCLUDE_KARMA_BUFFER
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/buffer.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_center_alignment.hpp b/boost/spirit/include/karma_center_alignment.hpp
new file mode 100644
index 0000000000..77fc006596
--- /dev/null
+++ b/boost/spirit/include/karma_center_alignment.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_CENTER_ALIGNMENT
+#define BOOST_SPIRIT_INCLUDE_KARMA_CENTER_ALIGNMENT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/center_alignment.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_char.hpp b/boost/spirit/include/karma_char.hpp
new file mode 100644
index 0000000000..e129f3e08f
--- /dev/null
+++ b/boost/spirit/include/karma_char.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_CHAR
+#define BOOST_SPIRIT_INCLUDE_KARMA_CHAR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/char.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_char_.hpp b/boost/spirit/include/karma_char_.hpp
new file mode 100644
index 0000000000..018a097775
--- /dev/null
+++ b/boost/spirit/include/karma_char_.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_CHAR_
+#define BOOST_SPIRIT_INCLUDE_KARMA_CHAR_
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/char/char.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_char_class.hpp b/boost/spirit/include/karma_char_class.hpp
new file mode 100644
index 0000000000..a26ceb98d8
--- /dev/null
+++ b/boost/spirit/include/karma_char_class.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_CHAR_CLASS
+#define BOOST_SPIRIT_INCLUDE_KARMA_CHAR_CLASS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/char/char_class.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_columns.hpp b/boost/spirit/include/karma_columns.hpp
new file mode 100644
index 0000000000..87feb2fa6b
--- /dev/null
+++ b/boost/spirit/include/karma_columns.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_COLUMNS
+#define BOOST_SPIRIT_INCLUDE_KARMA_COLUMNS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/columns.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_delimit.hpp b/boost/spirit/include/karma_delimit.hpp
new file mode 100644
index 0000000000..177925f964
--- /dev/null
+++ b/boost/spirit/include/karma_delimit.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_DELIMIT
+#define BOOST_SPIRIT_INCLUDE_KARMA_DELIMIT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/delimit.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_directive.hpp b/boost/spirit/include/karma_directive.hpp
new file mode 100644
index 0000000000..bfc4b3f7f7
--- /dev/null
+++ b/boost/spirit/include/karma_directive.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_DIRECTIVE
+#define BOOST_SPIRIT_INCLUDE_KARMA_DIRECTIVE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_domain.hpp b/boost/spirit/include/karma_domain.hpp
new file mode 100644
index 0000000000..cb33991328
--- /dev/null
+++ b/boost/spirit/include/karma_domain.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_DOMAIN
+#define BOOST_SPIRIT_INCLUDE_KARMA_DOMAIN
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_duplicate.hpp b/boost/spirit/include/karma_duplicate.hpp
new file mode 100644
index 0000000000..7607301727
--- /dev/null
+++ b/boost/spirit/include/karma_duplicate.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_DUPLICATE
+#define BOOST_SPIRIT_INCLUDE_KARMA_DUPLICATE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/duplicate.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_eol.hpp b/boost/spirit/include/karma_eol.hpp
new file mode 100644
index 0000000000..b720bc285c
--- /dev/null
+++ b/boost/spirit/include/karma_eol.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_EOL
+#define BOOST_SPIRIT_INCLUDE_KARMA_EOL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auxiliary/eol.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_eps.hpp b/boost/spirit/include/karma_eps.hpp
new file mode 100644
index 0000000000..82d4cceb7f
--- /dev/null
+++ b/boost/spirit/include/karma_eps.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_EPS
+#define BOOST_SPIRIT_INCLUDE_KARMA_EPS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auxiliary/eps.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_format.hpp b/boost/spirit/include/karma_format.hpp
new file mode 100644
index 0000000000..3fb071a7b9
--- /dev/null
+++ b/boost/spirit/include/karma_format.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_FORMAT
+#define BOOST_SPIRIT_INCLUDE_KARMA_FORMAT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/format.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_format_attr.hpp b/boost/spirit/include/karma_format_attr.hpp
new file mode 100644
index 0000000000..88fbd60578
--- /dev/null
+++ b/boost/spirit/include/karma_format_attr.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_FORMAT_ATTR
+#define BOOST_SPIRIT_INCLUDE_KARMA_FORMAT_ATTR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/stream/format_manip_attr.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_format_auto.hpp b/boost/spirit/include/karma_format_auto.hpp
new file mode 100644
index 0000000000..fffa730acd
--- /dev/null
+++ b/boost/spirit/include/karma_format_auto.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_FORMAT_AUTO
+#define BOOST_SPIRIT_INCLUDE_KARMA_FORMAT_AUTO
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/format_auto.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_generate.hpp b/boost/spirit/include/karma_generate.hpp
new file mode 100644
index 0000000000..4ad2f15272
--- /dev/null
+++ b/boost/spirit/include/karma_generate.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_GENERATE
+#define BOOST_SPIRIT_INCLUDE_KARMA_GENERATE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/generate.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_generate_attr.hpp b/boost/spirit/include/karma_generate_attr.hpp
new file mode 100644
index 0000000000..09e0e18112
--- /dev/null
+++ b/boost/spirit/include/karma_generate_attr.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_GENERATE_ATTR
+#define BOOST_SPIRIT_INCLUDE_KARMA_GENERATE_ATTR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/generate_attr.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_generate_auto.hpp b/boost/spirit/include/karma_generate_auto.hpp
new file mode 100644
index 0000000000..97abd8161f
--- /dev/null
+++ b/boost/spirit/include/karma_generate_auto.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_GENERATE_AUTO
+#define BOOST_SPIRIT_INCLUDE_KARMA_GENERATE_AUTO
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/generate.hpp>
+#include <boost/spirit/home/karma/detail/generate_auto.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_grammar.hpp b/boost/spirit/include/karma_grammar.hpp
new file mode 100644
index 0000000000..a389831aba
--- /dev/null
+++ b/boost/spirit/include/karma_grammar.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_NONTERMINAL_GRAMMAR
+#define BOOST_SPIRIT_INCLUDE_KARMA_NONTERMINAL_GRAMMAR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/nonterminal/grammar.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_int.hpp b/boost/spirit/include/karma_int.hpp
new file mode 100644
index 0000000000..79b7bb12b8
--- /dev/null
+++ b/boost/spirit/include/karma_int.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_INT
+#define BOOST_SPIRIT_INCLUDE_KARMA_INT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/numeric/int.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_kleene.hpp b/boost/spirit/include/karma_kleene.hpp
new file mode 100644
index 0000000000..344b84b32f
--- /dev/null
+++ b/boost/spirit/include/karma_kleene.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_KLEENE
+#define BOOST_SPIRIT_INCLUDE_KARMA_KLEENE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/kleene.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_lazy.hpp b/boost/spirit/include/karma_lazy.hpp
new file mode 100644
index 0000000000..1b7f638579
--- /dev/null
+++ b/boost/spirit/include/karma_lazy.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_LAZY
+#define BOOST_SPIRIT_INCLUDE_KARMA_LAZY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_left_alignment.hpp b/boost/spirit/include/karma_left_alignment.hpp
new file mode 100644
index 0000000000..59c022ded4
--- /dev/null
+++ b/boost/spirit/include/karma_left_alignment.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_LEFT_ALIGNMENT
+#define BOOST_SPIRIT_INCLUDE_KARMA_LEFT_ALIGNMENT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/left_alignment.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_list.hpp b/boost/spirit/include/karma_list.hpp
new file mode 100644
index 0000000000..c5e235bf09
--- /dev/null
+++ b/boost/spirit/include/karma_list.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_LIST
+#define BOOST_SPIRIT_INCLUDE_KARMA_LIST
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/list.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_maxwidth.hpp b/boost/spirit/include/karma_maxwidth.hpp
new file mode 100644
index 0000000000..f7a27414b0
--- /dev/null
+++ b/boost/spirit/include/karma_maxwidth.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_MAXWIDTH
+#define BOOST_SPIRIT_INCLUDE_KARMA_MAXWIDTH
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/maxwidth.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_no_delimit.hpp b/boost/spirit/include/karma_no_delimit.hpp
new file mode 100644
index 0000000000..4d31b22e3d
--- /dev/null
+++ b/boost/spirit/include/karma_no_delimit.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_NO_DELIMIT
+#define BOOST_SPIRIT_INCLUDE_KARMA_NO_DELIMIT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/no_delimit.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_nonterminal.hpp b/boost/spirit/include/karma_nonterminal.hpp
new file mode 100644
index 0000000000..1b77e3481b
--- /dev/null
+++ b/boost/spirit/include/karma_nonterminal.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_NONTERMINAL
+#define BOOST_SPIRIT_INCLUDE_KARMA_NONTERMINAL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/nonterminal.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_not_predicate.hpp b/boost/spirit/include/karma_not_predicate.hpp
new file mode 100644
index 0000000000..924b911b25
--- /dev/null
+++ b/boost/spirit/include/karma_not_predicate.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_NOT_PREDICATE
+#define BOOST_SPIRIT_INCLUDE_KARMA_NOT_PREDICATE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/not_predicate.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_numeric.hpp b/boost/spirit/include/karma_numeric.hpp
new file mode 100644
index 0000000000..c76dcd1916
--- /dev/null
+++ b/boost/spirit/include/karma_numeric.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_NUMERIC
+#define BOOST_SPIRIT_INCLUDE_KARMA_NUMERIC
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/numeric.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_omit.hpp b/boost/spirit/include/karma_omit.hpp
new file mode 100644
index 0000000000..8d54c62633
--- /dev/null
+++ b/boost/spirit/include/karma_omit.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_OMIT
+#define BOOST_SPIRIT_INCLUDE_KARMA_OMIT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/omit.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_operator.hpp b/boost/spirit/include/karma_operator.hpp
new file mode 100644
index 0000000000..5aece79b05
--- /dev/null
+++ b/boost/spirit/include/karma_operator.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_OPERATOR
+#define BOOST_SPIRIT_INCLUDE_KARMA_OPERATOR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_optional.hpp b/boost/spirit/include/karma_optional.hpp
new file mode 100644
index 0000000000..85143714d4
--- /dev/null
+++ b/boost/spirit/include/karma_optional.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_OPTIONAL
+#define BOOST_SPIRIT_INCLUDE_KARMA_OPTIONAL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/optional.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_phoenix_attributes.hpp b/boost/spirit/include/karma_phoenix_attributes.hpp
new file mode 100644
index 0000000000..f7f88f9938
--- /dev/null
+++ b/boost/spirit/include/karma_phoenix_attributes.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_PHOENIX_ATTRIBUTES
+#define BOOST_SPIRIT_INCLUDE_KARMA_PHOENIX_ATTRIBUTES
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/phoenix_attributes.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_plus.hpp b/boost/spirit/include/karma_plus.hpp
new file mode 100644
index 0000000000..925a25e32a
--- /dev/null
+++ b/boost/spirit/include/karma_plus.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_PLUS
+#define BOOST_SPIRIT_INCLUDE_KARMA_PLUS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/plus.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_real.hpp b/boost/spirit/include/karma_real.hpp
new file mode 100644
index 0000000000..e6f55856c2
--- /dev/null
+++ b/boost/spirit/include/karma_real.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_REAL
+#define BOOST_SPIRIT_INCLUDE_KARMA_REAL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/numeric/real.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_repeat.hpp b/boost/spirit/include/karma_repeat.hpp
new file mode 100644
index 0000000000..b1723403ae
--- /dev/null
+++ b/boost/spirit/include/karma_repeat.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_REPEAT
+#define BOOST_SPIRIT_INCLUDE_KARMA_REPEAT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/repeat.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_right_alignment.hpp b/boost/spirit/include/karma_right_alignment.hpp
new file mode 100644
index 0000000000..15bc145e25
--- /dev/null
+++ b/boost/spirit/include/karma_right_alignment.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_RIGHT_ALIGNMENT
+#define BOOST_SPIRIT_INCLUDE_KARMA_RIGHT_ALIGNMENT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/right_alignment.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_rule.hpp b/boost/spirit/include/karma_rule.hpp
new file mode 100644
index 0000000000..ca9ffb6b7d
--- /dev/null
+++ b/boost/spirit/include/karma_rule.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_NONTERMINAL_RULE
+#define BOOST_SPIRIT_INCLUDE_KARMA_NONTERMINAL_RULE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/nonterminal/rule.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_sequence.hpp b/boost/spirit/include/karma_sequence.hpp
new file mode 100644
index 0000000000..8f49f91799
--- /dev/null
+++ b/boost/spirit/include/karma_sequence.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_SEQUENCE
+#define BOOST_SPIRIT_INCLUDE_KARMA_SEQUENCE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/operator/sequence.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_stream.hpp b/boost/spirit/include/karma_stream.hpp
new file mode 100644
index 0000000000..3b3bd9d49d
--- /dev/null
+++ b/boost/spirit/include/karma_stream.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_STREAM
+#define BOOST_SPIRIT_INCLUDE_KARMA_STREAM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/stream.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_strict_relaxed.hpp b/boost/spirit/include/karma_strict_relaxed.hpp
new file mode 100644
index 0000000000..6b901d8f47
--- /dev/null
+++ b/boost/spirit/include/karma_strict_relaxed.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_STRICT_RELAXED
+#define BOOST_SPIRIT_INCLUDE_KARMA_STRICT_RELAXED
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/strict_relaxed.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_string.hpp b/boost/spirit/include/karma_string.hpp
new file mode 100644
index 0000000000..08ff0858d4
--- /dev/null
+++ b/boost/spirit/include/karma_string.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_STRING
+#define BOOST_SPIRIT_INCLUDE_KARMA_STRING
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/string.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_symbols.hpp b/boost/spirit/include/karma_symbols.hpp
new file mode 100644
index 0000000000..f51a5fc859
--- /dev/null
+++ b/boost/spirit/include/karma_symbols.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_SYMBOLS
+#define BOOST_SPIRIT_INCLUDE_KARMA_SYMBOLS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/string/symbols.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_uint.hpp b/boost/spirit/include/karma_uint.hpp
new file mode 100644
index 0000000000..ca66c26081
--- /dev/null
+++ b/boost/spirit/include/karma_uint.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_UINT
+#define BOOST_SPIRIT_INCLUDE_KARMA_UINT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/numeric/uint.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_upper_lower_case.hpp b/boost/spirit/include/karma_upper_lower_case.hpp
new file mode 100644
index 0000000000..07e2617e5f
--- /dev/null
+++ b/boost/spirit/include/karma_upper_lower_case.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_UPPER_LOWER_CASE
+#define BOOST_SPIRIT_INCLUDE_KARMA_UPPER_LOWER_CASE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/upper_lower_case.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_verbatim.hpp b/boost/spirit/include/karma_verbatim.hpp
new file mode 100644
index 0000000000..87977a4832
--- /dev/null
+++ b/boost/spirit/include/karma_verbatim.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_VERBATIM
+#define BOOST_SPIRIT_INCLUDE_KARMA_VERBATIM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/directive/verbatim.hpp>
+
+#endif
diff --git a/boost/spirit/include/karma_what.hpp b/boost/spirit/include/karma_what.hpp
new file mode 100644
index 0000000000..f81d18032c
--- /dev/null
+++ b/boost/spirit/include/karma_what.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_WHAT
+#define BOOST_SPIRIT_INCLUDE_KARMA_WHAT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/what.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex.hpp b/boost/spirit/include/lex.hpp
new file mode 100644
index 0000000000..e0759c8299
--- /dev/null
+++ b/boost/spirit/include/lex.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX
+#define BOOST_SPIRIT_INCLUDE_LEX
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_char_token_def.hpp b/boost/spirit/include/lex_char_token_def.hpp
new file mode 100644
index 0000000000..0345e0d28e
--- /dev/null
+++ b/boost/spirit/include/lex_char_token_def.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_CHAR_TOKEN_DEF
+#define BOOST_SPIRIT_INCLUDE_LEX_CHAR_TOKEN_DEF
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer/char_token_def.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_domain.hpp b/boost/spirit/include/lex_domain.hpp
new file mode 100644
index 0000000000..f5f8a9a3cc
--- /dev/null
+++ b/boost/spirit/include/lex_domain.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_DOMAIN
+#define BOOST_SPIRIT_INCLUDE_LEX_DOMAIN
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/domain.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_generate_static_lexertl.hpp b/boost/spirit/include/lex_generate_static_lexertl.hpp
new file mode 100644
index 0000000000..777ade2dd7
--- /dev/null
+++ b/boost/spirit/include/lex_generate_static_lexertl.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_LEXER_GENERATE_STATIC_LEXERTL
+#define BOOST_SPIRIT_INCLUDE_LEX_LEXER_GENERATE_STATIC_LEXERTL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer/lexertl/generate_static.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_lexer.hpp b/boost/spirit/include/lex_lexer.hpp
new file mode 100644
index 0000000000..051d08a59c
--- /dev/null
+++ b/boost/spirit/include/lex_lexer.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_LEXER
+#define BOOST_SPIRIT_INCLUDE_LEX_LEXER
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_lexertl.hpp b/boost/spirit/include/lex_lexertl.hpp
new file mode 100644
index 0000000000..8c0e17d387
--- /dev/null
+++ b/boost/spirit/include/lex_lexertl.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_LEXERTL
+#define BOOST_SPIRIT_INCLUDE_LEX_LEXERTL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer_lexertl.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_lexertl_position_token.hpp b/boost/spirit/include/lex_lexertl_position_token.hpp
new file mode 100644
index 0000000000..79bb98cca0
--- /dev/null
+++ b/boost/spirit/include/lex_lexertl_position_token.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_LEXERTL_POSITION_TOKEN
+#define BOOST_SPIRIT_INCLUDE_LEX_LEXERTL_POSITION_TOKEN
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer/lexertl/position_token.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_lexertl_token.hpp b/boost/spirit/include/lex_lexertl_token.hpp
new file mode 100644
index 0000000000..0d82098ae2
--- /dev/null
+++ b/boost/spirit/include/lex_lexertl_token.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_LEXERTL_TOKEN
+#define BOOST_SPIRIT_INCLUDE_LEX_LEXERTL_TOKEN
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer/lexertl/token.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_plain_token.hpp b/boost/spirit/include/lex_plain_token.hpp
new file mode 100644
index 0000000000..a94045a6a9
--- /dev/null
+++ b/boost/spirit/include/lex_plain_token.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_PLAIN_TOKEN
+#define BOOST_SPIRIT_INCLUDE_LEX_PLAIN_TOKEN
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/qi.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_primitives.hpp b/boost/spirit/include/lex_primitives.hpp
new file mode 100644
index 0000000000..03044956ce
--- /dev/null
+++ b/boost/spirit/include/lex_primitives.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_PRIMITIVES
+#define BOOST_SPIRIT_INCLUDE_LEX_PRIMITIVES
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/primitives.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_static_lexertl.hpp b/boost/spirit/include/lex_static_lexertl.hpp
new file mode 100644
index 0000000000..ce06d5db7f
--- /dev/null
+++ b/boost/spirit/include/lex_static_lexertl.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_LEXER_STATIC_LEXERTL
+#define BOOST_SPIRIT_INCLUDE_LEX_LEXER_STATIC_LEXERTL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/lexer_static_lexertl.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_tokenize_and_parse.hpp b/boost/spirit/include/lex_tokenize_and_parse.hpp
new file mode 100644
index 0000000000..9223594cb4
--- /dev/null
+++ b/boost/spirit/include/lex_tokenize_and_parse.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_TOKENIZE_AND_PARSE
+#define BOOST_SPIRIT_INCLUDE_LEX_TOKENIZE_AND_PARSE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/tokenize_and_parse.hpp>
+
+#endif
diff --git a/boost/spirit/include/lex_tokenize_and_parse_attr.hpp b/boost/spirit/include/lex_tokenize_and_parse_attr.hpp
new file mode 100644
index 0000000000..9f3a034e77
--- /dev/null
+++ b/boost/spirit/include/lex_tokenize_and_parse_attr.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_LEX_TOKENIZE_AND_PARSE_ATTR
+#define BOOST_SPIRIT_INCLUDE_LEX_TOKENIZE_AND_PARSE_ATTR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/lex/tokenize_and_parse_attr.hpp>
+
+#endif
diff --git a/boost/spirit/include/phoenix.hpp b/boost/spirit/include/phoenix.hpp
new file mode 100644
index 0000000000..f60958739a
--- /dev/null
+++ b/boost/spirit/include/phoenix.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX
+#define BOOST_SPIRIT_INCLUDE_PHOENIX
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix.hpp>
+#else
+#include <boost/phoenix.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix1.hpp b/boost/spirit/include/phoenix1.hpp
new file mode 100644
index 0000000000..fb75af1b2f
--- /dev/null
+++ b/boost/spirit/include/phoenix1.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1
+#include <boost/spirit/home/classic/phoenix.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_actor.hpp b/boost/spirit/include/phoenix1_actor.hpp
new file mode 100644
index 0000000000..746d529317
--- /dev/null
+++ b/boost/spirit/include/phoenix1_actor.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_ACTOR
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_ACTOR
+#include <boost/spirit/home/classic/phoenix/actor.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_binders.hpp b/boost/spirit/include/phoenix1_binders.hpp
new file mode 100644
index 0000000000..f7b0220819
--- /dev/null
+++ b/boost/spirit/include/phoenix1_binders.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_BINDERS
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_BINDERS
+#include <boost/spirit/home/classic/phoenix/binders.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_casts.hpp b/boost/spirit/include/phoenix1_casts.hpp
new file mode 100644
index 0000000000..baee6241fb
--- /dev/null
+++ b/boost/spirit/include/phoenix1_casts.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_CASTS
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_CASTS
+#include <boost/spirit/home/classic/phoenix/casts.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_closures.hpp b/boost/spirit/include/phoenix1_closures.hpp
new file mode 100644
index 0000000000..532bfa2357
--- /dev/null
+++ b/boost/spirit/include/phoenix1_closures.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_CLOSURES
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_CLOSURES
+#include <boost/spirit/home/classic/phoenix/closures.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_composite.hpp b/boost/spirit/include/phoenix1_composite.hpp
new file mode 100644
index 0000000000..14669dde65
--- /dev/null
+++ b/boost/spirit/include/phoenix1_composite.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_COMPOSITE
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_COMPOSITE
+#include <boost/spirit/home/classic/phoenix/composite.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_functions.hpp b/boost/spirit/include/phoenix1_functions.hpp
new file mode 100644
index 0000000000..42caf55fa4
--- /dev/null
+++ b/boost/spirit/include/phoenix1_functions.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_FUNCTIONS
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_FUNCTIONS
+#include <boost/spirit/home/classic/phoenix/functions.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_new.hpp b/boost/spirit/include/phoenix1_new.hpp
new file mode 100644
index 0000000000..4dbfad2745
--- /dev/null
+++ b/boost/spirit/include/phoenix1_new.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_NEW
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_NEW
+#include <boost/spirit/home/classic/phoenix/new.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_operators.hpp b/boost/spirit/include/phoenix1_operators.hpp
new file mode 100644
index 0000000000..ce5faae770
--- /dev/null
+++ b/boost/spirit/include/phoenix1_operators.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_OPERATORS
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_OPERATORS
+#include <boost/spirit/home/classic/phoenix/operators.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_primitives.hpp b/boost/spirit/include/phoenix1_primitives.hpp
new file mode 100644
index 0000000000..6097b74614
--- /dev/null
+++ b/boost/spirit/include/phoenix1_primitives.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_PRIMITIVES
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_PRIMITIVES
+#include <boost/spirit/home/classic/phoenix/primitives.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_special_ops.hpp b/boost/spirit/include/phoenix1_special_ops.hpp
new file mode 100644
index 0000000000..be9437cc98
--- /dev/null
+++ b/boost/spirit/include/phoenix1_special_ops.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_SPECIAL_OPS
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_SPECIAL_OPS
+#include <boost/spirit/home/classic/phoenix/special_ops.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_statements.hpp b/boost/spirit/include/phoenix1_statements.hpp
new file mode 100644
index 0000000000..9592f6db2f
--- /dev/null
+++ b/boost/spirit/include/phoenix1_statements.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_STATEMENTS
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_STATEMENTS
+#include <boost/spirit/home/classic/phoenix/statements.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_tuple_helpers.hpp b/boost/spirit/include/phoenix1_tuple_helpers.hpp
new file mode 100644
index 0000000000..d27530285c
--- /dev/null
+++ b/boost/spirit/include/phoenix1_tuple_helpers.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_TUPLE_HELPERS
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_TUPLE_HELPERS
+#include <boost/spirit/home/classic/phoenix/tuple_helpers.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix1_tuples.hpp b/boost/spirit/include/phoenix1_tuples.hpp
new file mode 100644
index 0000000000..7a0b5f4062
--- /dev/null
+++ b/boost/spirit/include/phoenix1_tuples.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX1_TUPLES
+#define BOOST_SPIRIT_INCLUDE_PHOENIX1_TUPLES
+#include <boost/spirit/home/classic/phoenix/tuples.hpp>
+#endif
diff --git a/boost/spirit/include/phoenix_algorithm.hpp b/boost/spirit/include/phoenix_algorithm.hpp
new file mode 100644
index 0000000000..4b97d4cf4c
--- /dev/null
+++ b/boost/spirit/include/phoenix_algorithm.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_ALGORITHM
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_ALGORITHM
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/algorithm.hpp>
+#else
+#include <boost/phoenix/stl/algorithm.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_bind.hpp b/boost/spirit/include/phoenix_bind.hpp
new file mode 100644
index 0000000000..f289ac02ca
--- /dev/null
+++ b/boost/spirit/include/phoenix_bind.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_BIND
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_BIND
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/bind.hpp>
+#else
+#include <boost/phoenix/bind.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_container.hpp b/boost/spirit/include/phoenix_container.hpp
new file mode 100644
index 0000000000..95b13a25aa
--- /dev/null
+++ b/boost/spirit/include/phoenix_container.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_CONTAINER
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_CONTAINER
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/container.hpp>
+#else
+#include <boost/phoenix/stl/container.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_core.hpp b/boost/spirit/include/phoenix_core.hpp
new file mode 100644
index 0000000000..55b5010ec3
--- /dev/null
+++ b/boost/spirit/include/phoenix_core.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_CORE
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_CORE
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#define BOOST_PHOENIX_DEFINE_CUSTOM_TERMINAL(A,B,C,D)
+#include <boost/spirit/home/phoenix/core.hpp>
+#else
+#include <boost/phoenix/core.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_function.hpp b/boost/spirit/include/phoenix_function.hpp
new file mode 100644
index 0000000000..76c244d975
--- /dev/null
+++ b/boost/spirit/include/phoenix_function.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_FUNCTION
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_FUNCTION
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/function.hpp>
+#else
+#include <boost/phoenix/function.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_fusion.hpp b/boost/spirit/include/phoenix_fusion.hpp
new file mode 100644
index 0000000000..8ab422a5b0
--- /dev/null
+++ b/boost/spirit/include/phoenix_fusion.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_FUSION
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_FUSION
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/fusion.hpp>
+#else
+#include <boost/phoenix/fusion.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_limits.hpp b/boost/spirit/include/phoenix_limits.hpp
new file mode 100644
index 0000000000..3d9ed3a4ee
--- /dev/null
+++ b/boost/spirit/include/phoenix_limits.hpp
@@ -0,0 +1,16 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_LIMITS
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_LIMITS
+
+#ifdef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/phoenix/core/limits.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_object.hpp b/boost/spirit/include/phoenix_object.hpp
new file mode 100644
index 0000000000..5bb6dd469c
--- /dev/null
+++ b/boost/spirit/include/phoenix_object.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_OBJECT
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_OBJECT
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/object.hpp>
+#else
+#include <boost/phoenix/object.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_operator.hpp b/boost/spirit/include/phoenix_operator.hpp
new file mode 100644
index 0000000000..03c66c9d12
--- /dev/null
+++ b/boost/spirit/include/phoenix_operator.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_OPERATOR
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_OPERATOR
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/operator.hpp>
+#else
+#include <boost/phoenix/operator.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_scope.hpp b/boost/spirit/include/phoenix_scope.hpp
new file mode 100644
index 0000000000..c71533e90d
--- /dev/null
+++ b/boost/spirit/include/phoenix_scope.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_SCOPE
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_SCOPE
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/scope.hpp>
+#else
+#include <boost/phoenix/scope.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_statement.hpp b/boost/spirit/include/phoenix_statement.hpp
new file mode 100644
index 0000000000..e6729b2ec5
--- /dev/null
+++ b/boost/spirit/include/phoenix_statement.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_STATEMENT
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_STATEMENT
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/statement.hpp>
+#else
+#include <boost/phoenix/statement.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_stl.hpp b/boost/spirit/include/phoenix_stl.hpp
new file mode 100644
index 0000000000..63656357cd
--- /dev/null
+++ b/boost/spirit/include/phoenix_stl.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_STL
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_STL
+
+#ifndef BOOST_SPIRIT_USE_PHOENIX_V3
+#include <boost/spirit/home/phoenix/stl.hpp>
+#else
+#include <boost/phoenix/stl.hpp>
+#endif
+
+#endif
diff --git a/boost/spirit/include/phoenix_version.hpp b/boost/spirit/include/phoenix_version.hpp
new file mode 100644
index 0000000000..acc3fdf192
--- /dev/null
+++ b/boost/spirit/include/phoenix_version.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_PHOENIX_VERSION
+#define BOOST_SPIRIT_INCLUDE_PHOENIX_VERSION
+#include <boost/spirit/home/phoenix/version.hpp>
+#endif
diff --git a/boost/spirit/include/qi.hpp b/boost/spirit/include/qi.hpp
new file mode 100644
index 0000000000..58da629666
--- /dev/null
+++ b/boost/spirit/include/qi.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI
+#define BOOST_SPIRIT_INCLUDE_QI
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_action.hpp b/boost/spirit/include/qi_action.hpp
new file mode 100644
index 0000000000..27a7c30cd8
--- /dev/null
+++ b/boost/spirit/include/qi_action.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_ACTION
+#define BOOST_SPIRIT_INCLUDE_QI_ACTION
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/action.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_alternative.hpp b/boost/spirit/include/qi_alternative.hpp
new file mode 100644
index 0000000000..c7979c2318
--- /dev/null
+++ b/boost/spirit/include/qi_alternative.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_ALTERNATIVE
+#define BOOST_SPIRIT_INCLUDE_QI_ALTERNATIVE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/alternative.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_and_predicate.hpp b/boost/spirit/include/qi_and_predicate.hpp
new file mode 100644
index 0000000000..3718353e91
--- /dev/null
+++ b/boost/spirit/include/qi_and_predicate.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_AND_PREDICATE
+#define BOOST_SPIRIT_INCLUDE_QI_AND_PREDICATE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/and_predicate.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_as.hpp b/boost/spirit/include/qi_as.hpp
new file mode 100644
index 0000000000..ef8ec31f98
--- /dev/null
+++ b/boost/spirit/include/qi_as.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2010 Bryce Lelbach
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_AS
+#define BOOST_SPIRIT_INCLUDE_QI_AS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/as.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_as_string.hpp b/boost/spirit/include/qi_as_string.hpp
new file mode 100644
index 0000000000..06edff6bbf
--- /dev/null
+++ b/boost/spirit/include/qi_as_string.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_AS_STRING
+#define BOOST_SPIRIT_INCLUDE_QI_AS_STRING
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/as.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_attr.hpp b/boost/spirit/include/qi_attr.hpp
new file mode 100644
index 0000000000..c7f8b8a331
--- /dev/null
+++ b/boost/spirit/include/qi_attr.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_ATTR
+#define BOOST_SPIRIT_INCLUDE_QI_ATTR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auxiliary/attr.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_attr_cast.hpp b/boost/spirit/include/qi_attr_cast.hpp
new file mode 100644
index 0000000000..bf89a2192b
--- /dev/null
+++ b/boost/spirit/include/qi_attr_cast.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_ATTR_CAST
+#define BOOST_SPIRIT_INCLUDE_QI_ATTR_CAST
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auxiliary/attr_cast.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_auto.hpp b/boost/spirit/include/qi_auto.hpp
new file mode 100644
index 0000000000..c0a0a42529
--- /dev/null
+++ b/boost/spirit/include/qi_auto.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_AUTO
+#define BOOST_SPIRIT_INCLUDE_QI_AUTO
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auto.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_auxiliary.hpp b/boost/spirit/include/qi_auxiliary.hpp
new file mode 100644
index 0000000000..7f3972822e
--- /dev/null
+++ b/boost/spirit/include/qi_auxiliary.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_AUXILIARY
+#define BOOST_SPIRIT_INCLUDE_QI_AUXILIARY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auxiliary.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_binary.hpp b/boost/spirit/include/qi_binary.hpp
new file mode 100644
index 0000000000..4920a4a2d2
--- /dev/null
+++ b/boost/spirit/include/qi_binary.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_BINARY
+#define BOOST_SPIRIT_INCLUDE_QI_BINARY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/binary.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_bool.hpp b/boost/spirit/include/qi_bool.hpp
new file mode 100644
index 0000000000..a70ad4ff6c
--- /dev/null
+++ b/boost/spirit/include/qi_bool.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_BOOL
+#define BOOST_SPIRIT_INCLUDE_QI_BOOL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/numeric/bool.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_char.hpp b/boost/spirit/include/qi_char.hpp
new file mode 100644
index 0000000000..c5197f5b33
--- /dev/null
+++ b/boost/spirit/include/qi_char.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_CHAR
+#define BOOST_SPIRIT_INCLUDE_QI_CHAR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/char.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_char_.hpp b/boost/spirit/include/qi_char_.hpp
new file mode 100644
index 0000000000..ea4fc5757b
--- /dev/null
+++ b/boost/spirit/include/qi_char_.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_CHAR_
+#define BOOST_SPIRIT_INCLUDE_QI_CHAR_
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/char/char.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_char_class.hpp b/boost/spirit/include/qi_char_class.hpp
new file mode 100644
index 0000000000..f062d5d28b
--- /dev/null
+++ b/boost/spirit/include/qi_char_class.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_CHAR_CLASS
+#define BOOST_SPIRIT_INCLUDE_QI_CHAR_CLASS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/char/char_class.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_core.hpp b/boost/spirit/include/qi_core.hpp
new file mode 100644
index 0000000000..0cf618106d
--- /dev/null
+++ b/boost/spirit/include/qi_core.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_CORE
+#define BOOST_SPIRIT_INCLUDE_QI_CORE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/parse.hpp>
+#include <boost/spirit/home/qi/what.hpp>
+#include <boost/spirit/home/qi/action.hpp>
+#include <boost/spirit/home/qi/char.hpp>
+#include <boost/spirit/home/qi/directive.hpp>
+#include <boost/spirit/home/qi/nonterminal.hpp>
+#include <boost/spirit/home/qi/numeric.hpp>
+#include <boost/spirit/home/qi/operator.hpp>
+#include <boost/spirit/home/qi/string.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_difference.hpp b/boost/spirit/include/qi_difference.hpp
new file mode 100644
index 0000000000..2ad5f25447
--- /dev/null
+++ b/boost/spirit/include/qi_difference.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_DIFFERENCE
+#define BOOST_SPIRIT_INCLUDE_QI_DIFFERENCE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/difference.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_directive.hpp b/boost/spirit/include/qi_directive.hpp
new file mode 100644
index 0000000000..7cb06af877
--- /dev/null
+++ b/boost/spirit/include/qi_directive.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_DIRECTIVE
+#define BOOST_SPIRIT_INCLUDE_QI_DIRECTIVE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_domain.hpp b/boost/spirit/include/qi_domain.hpp
new file mode 100644
index 0000000000..ed1eaaa1a0
--- /dev/null
+++ b/boost/spirit/include/qi_domain.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_DOMAIN
+#define BOOST_SPIRIT_INCLUDE_QI_DOMAIN
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_eoi.hpp b/boost/spirit/include/qi_eoi.hpp
new file mode 100644
index 0000000000..017c57419b
--- /dev/null
+++ b/boost/spirit/include/qi_eoi.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_EOI
+#define BOOST_SPIRIT_INCLUDE_QI_EOI
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auxiliary/eoi.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_eol.hpp b/boost/spirit/include/qi_eol.hpp
new file mode 100644
index 0000000000..94a262e7ae
--- /dev/null
+++ b/boost/spirit/include/qi_eol.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_EOL
+#define BOOST_SPIRIT_INCLUDE_QI_EOL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auxiliary/eol.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_eps.hpp b/boost/spirit/include/qi_eps.hpp
new file mode 100644
index 0000000000..3bb2dcc7aa
--- /dev/null
+++ b/boost/spirit/include/qi_eps.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_EPS
+#define BOOST_SPIRIT_INCLUDE_QI_EPS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auxiliary/eps.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_expect.hpp b/boost/spirit/include/qi_expect.hpp
new file mode 100644
index 0000000000..bfcd7396f7
--- /dev/null
+++ b/boost/spirit/include/qi_expect.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_EXPECT
+#define BOOST_SPIRIT_INCLUDE_QI_EXPECT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/expect.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_grammar.hpp b/boost/spirit/include/qi_grammar.hpp
new file mode 100644
index 0000000000..7289842c84
--- /dev/null
+++ b/boost/spirit/include/qi_grammar.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_GRAMMAR
+#define BOOST_SPIRIT_INCLUDE_QI_GRAMMAR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/nonterminal/grammar.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_hold.hpp b/boost/spirit/include/qi_hold.hpp
new file mode 100644
index 0000000000..78a4bb56a3
--- /dev/null
+++ b/boost/spirit/include/qi_hold.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_HOLD
+#define BOOST_SPIRIT_INCLUDE_QI_HOLD
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/hold.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_int.hpp b/boost/spirit/include/qi_int.hpp
new file mode 100644
index 0000000000..a2bbd6606a
--- /dev/null
+++ b/boost/spirit/include/qi_int.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_INT
+#define BOOST_SPIRIT_INCLUDE_QI_INT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/numeric/int.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_kleene.hpp b/boost/spirit/include/qi_kleene.hpp
new file mode 100644
index 0000000000..64360d6aae
--- /dev/null
+++ b/boost/spirit/include/qi_kleene.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_KLEENE
+#define BOOST_SPIRIT_INCLUDE_QI_KLEENE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/kleene.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_lazy.hpp b/boost/spirit/include/qi_lazy.hpp
new file mode 100644
index 0000000000..bfb2bcb080
--- /dev/null
+++ b/boost/spirit/include/qi_lazy.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_LAZY
+#define BOOST_SPIRIT_INCLUDE_QI_LAZY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_lexeme.hpp b/boost/spirit/include/qi_lexeme.hpp
new file mode 100644
index 0000000000..bfda35de8c
--- /dev/null
+++ b/boost/spirit/include/qi_lexeme.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_LEXEME
+#define BOOST_SPIRIT_INCLUDE_QI_LEXEME
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/lexeme.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_list.hpp b/boost/spirit/include/qi_list.hpp
new file mode 100644
index 0000000000..2e5977a680
--- /dev/null
+++ b/boost/spirit/include/qi_list.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_LIST
+#define BOOST_SPIRIT_INCLUDE_QI_LIST
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/list.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_lit.hpp b/boost/spirit/include/qi_lit.hpp
new file mode 100644
index 0000000000..89b2fbd222
--- /dev/null
+++ b/boost/spirit/include/qi_lit.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_LIT
+#define BOOST_SPIRIT_INCLUDE_QI_LIT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/string/lit.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_match.hpp b/boost/spirit/include/qi_match.hpp
new file mode 100644
index 0000000000..34d3de551b
--- /dev/null
+++ b/boost/spirit/include/qi_match.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_MATCH
+#define BOOST_SPIRIT_INCLUDE_QI_MATCH
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/match.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_match_attr.hpp b/boost/spirit/include/qi_match_attr.hpp
new file mode 100644
index 0000000000..ad34bd03e6
--- /dev/null
+++ b/boost/spirit/include/qi_match_attr.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_MATCH_ATTR
+#define BOOST_SPIRIT_INCLUDE_QI_MATCH_ATTR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/stream/match_manip_attr.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_match_auto.hpp b/boost/spirit/include/qi_match_auto.hpp
new file mode 100644
index 0000000000..c21f2176ed
--- /dev/null
+++ b/boost/spirit/include/qi_match_auto.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_MATCH_AUTO
+#define BOOST_SPIRIT_INCLUDE_QI_MATCH_AUTO
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/match_auto.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_matches.hpp b/boost/spirit/include/qi_matches.hpp
new file mode 100644
index 0000000000..57ee93e7a1
--- /dev/null
+++ b/boost/spirit/include/qi_matches.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_MATCHES
+#define BOOST_SPIRIT_INCLUDE_QI_MATCHES
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/matches.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_no_case.hpp b/boost/spirit/include/qi_no_case.hpp
new file mode 100644
index 0000000000..78a7a6e3eb
--- /dev/null
+++ b/boost/spirit/include/qi_no_case.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_NO_CASE
+#define BOOST_SPIRIT_INCLUDE_QI_NO_CASE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/no_case.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_no_skip.hpp b/boost/spirit/include/qi_no_skip.hpp
new file mode 100644
index 0000000000..1a46285fe9
--- /dev/null
+++ b/boost/spirit/include/qi_no_skip.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_NO_SKIP
+#define BOOST_SPIRIT_INCLUDE_QI_NO_SKIP
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/no_skip.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_nonterminal.hpp b/boost/spirit/include/qi_nonterminal.hpp
new file mode 100644
index 0000000000..d8f4a02f7f
--- /dev/null
+++ b/boost/spirit/include/qi_nonterminal.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_NONTERMINAL
+#define BOOST_SPIRIT_INCLUDE_QI_NONTERMINAL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/nonterminal.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_not_predicate.hpp b/boost/spirit/include/qi_not_predicate.hpp
new file mode 100644
index 0000000000..6ea2414dff
--- /dev/null
+++ b/boost/spirit/include/qi_not_predicate.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_NOT_PREDICATE
+#define BOOST_SPIRIT_INCLUDE_QI_NOT_PREDICATE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/not_predicate.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_numeric.hpp b/boost/spirit/include/qi_numeric.hpp
new file mode 100644
index 0000000000..dfe2c8d1e6
--- /dev/null
+++ b/boost/spirit/include/qi_numeric.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_NUMERIC
+#define BOOST_SPIRIT_INCLUDE_QI_NUMERIC
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/numeric.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_omit.hpp b/boost/spirit/include/qi_omit.hpp
new file mode 100644
index 0000000000..0ff74d34cc
--- /dev/null
+++ b/boost/spirit/include/qi_omit.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_OMIT
+#define BOOST_SPIRIT_INCLUDE_QI_OMIT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/omit.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_operator.hpp b/boost/spirit/include/qi_operator.hpp
new file mode 100644
index 0000000000..d58ca0ada8
--- /dev/null
+++ b/boost/spirit/include/qi_operator.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_OPERATOR
+#define BOOST_SPIRIT_INCLUDE_QI_OPERATOR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_optional.hpp b/boost/spirit/include/qi_optional.hpp
new file mode 100644
index 0000000000..da76e70709
--- /dev/null
+++ b/boost/spirit/include/qi_optional.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_OPTIONAL
+#define BOOST_SPIRIT_INCLUDE_QI_OPTIONAL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/optional.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_parse.hpp b/boost/spirit/include/qi_parse.hpp
new file mode 100644
index 0000000000..79e5e039dd
--- /dev/null
+++ b/boost/spirit/include/qi_parse.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_PARSE
+#define BOOST_SPIRIT_INCLUDE_QI_PARSE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/parse.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_parse_attr.hpp b/boost/spirit/include/qi_parse_attr.hpp
new file mode 100644
index 0000000000..51058ce139
--- /dev/null
+++ b/boost/spirit/include/qi_parse_attr.hpp
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_PARSE_ATTR
+#define BOOST_SPIRIT_INCLUDE_QI_PARSE_ATTR
+#include <boost/spirit/home/qi/parse_attr.hpp>
+#endif
diff --git a/boost/spirit/include/qi_parse_auto.hpp b/boost/spirit/include/qi_parse_auto.hpp
new file mode 100644
index 0000000000..21f784d6a2
--- /dev/null
+++ b/boost/spirit/include/qi_parse_auto.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_PARSE_AUTO
+#define BOOST_SPIRIT_INCLUDE_QI_PARSE_AUTO
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/parse.hpp>
+#include <boost/spirit/home/qi/detail/parse_auto.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_permutation.hpp b/boost/spirit/include/qi_permutation.hpp
new file mode 100644
index 0000000000..59917916b4
--- /dev/null
+++ b/boost/spirit/include/qi_permutation.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_PERMUTATION
+#define BOOST_SPIRIT_INCLUDE_QI_PERMUTATION
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/permutation.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_plus.hpp b/boost/spirit/include/qi_plus.hpp
new file mode 100644
index 0000000000..7f7a144852
--- /dev/null
+++ b/boost/spirit/include/qi_plus.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_PLUS
+#define BOOST_SPIRIT_INCLUDE_QI_PLUS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/plus.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_raw.hpp b/boost/spirit/include/qi_raw.hpp
new file mode 100644
index 0000000000..cf9a419463
--- /dev/null
+++ b/boost/spirit/include/qi_raw.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_RAW
+#define BOOST_SPIRIT_INCLUDE_QI_RAW
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/raw.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_real.hpp b/boost/spirit/include/qi_real.hpp
new file mode 100644
index 0000000000..d8c63470e0
--- /dev/null
+++ b/boost/spirit/include/qi_real.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_REAL
+#define BOOST_SPIRIT_INCLUDE_QI_REAL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/numeric/real.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_repeat.hpp b/boost/spirit/include/qi_repeat.hpp
new file mode 100644
index 0000000000..e42dff61d8
--- /dev/null
+++ b/boost/spirit/include/qi_repeat.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_REPEAT
+#define BOOST_SPIRIT_INCLUDE_QI_REPEAT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/repeat.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_rule.hpp b/boost/spirit/include/qi_rule.hpp
new file mode 100644
index 0000000000..f407da5047
--- /dev/null
+++ b/boost/spirit/include/qi_rule.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_RULE
+#define BOOST_SPIRIT_INCLUDE_QI_RULE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/nonterminal/rule.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_sequence.hpp b/boost/spirit/include/qi_sequence.hpp
new file mode 100644
index 0000000000..515ebcbb31
--- /dev/null
+++ b/boost/spirit/include/qi_sequence.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_SEQUENCE
+#define BOOST_SPIRIT_INCLUDE_QI_SEQUENCE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/sequence.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_sequential_or.hpp b/boost/spirit/include/qi_sequential_or.hpp
new file mode 100644
index 0000000000..e048716110
--- /dev/null
+++ b/boost/spirit/include/qi_sequential_or.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_SEQUENTIAL_OR
+#define BOOST_SPIRIT_INCLUDE_QI_SEQUENTIAL_OR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/operator/sequential_or.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_skip.hpp b/boost/spirit/include/qi_skip.hpp
new file mode 100644
index 0000000000..aa14070c5d
--- /dev/null
+++ b/boost/spirit/include/qi_skip.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_SKIP
+#define BOOST_SPIRIT_INCLUDE_QI_SKIP
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/directive/skip.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_stream.hpp b/boost/spirit/include/qi_stream.hpp
new file mode 100644
index 0000000000..3a5f6c5fbc
--- /dev/null
+++ b/boost/spirit/include/qi_stream.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_STREAM
+#define BOOST_SPIRIT_INCLUDE_QI_STREAM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/stream.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_string.hpp b/boost/spirit/include/qi_string.hpp
new file mode 100644
index 0000000000..74bcfe161a
--- /dev/null
+++ b/boost/spirit/include/qi_string.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_STRING
+#define BOOST_SPIRIT_INCLUDE_QI_STRING
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/string.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_symbols.hpp b/boost/spirit/include/qi_symbols.hpp
new file mode 100644
index 0000000000..34558ea708
--- /dev/null
+++ b/boost/spirit/include/qi_symbols.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_SYMBOLS
+#define BOOST_SPIRIT_INCLUDE_QI_SYMBOLS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/string/symbols.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_uint.hpp b/boost/spirit/include/qi_uint.hpp
new file mode 100644
index 0000000000..e70295e489
--- /dev/null
+++ b/boost/spirit/include/qi_uint.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_UINT
+#define BOOST_SPIRIT_INCLUDE_QI_UINT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/numeric/uint.hpp>
+
+#endif
diff --git a/boost/spirit/include/qi_what.hpp b/boost/spirit/include/qi_what.hpp
new file mode 100644
index 0000000000..2b08cddf56
--- /dev/null
+++ b/boost/spirit/include/qi_what.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_WHAT
+#define BOOST_SPIRIT_INCLUDE_QI_WHAT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/what.hpp>
+
+#endif
diff --git a/boost/spirit/include/support.hpp b/boost/spirit/include/support.hpp
new file mode 100644
index 0000000000..8089bb8856
--- /dev/null
+++ b/boost/spirit/include/support.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT
+#define BOOST_SPIRIT_INCLUDE_SUPPORT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_adapt_adt_attributes.hpp b/boost/spirit/include/support_adapt_adt_attributes.hpp
new file mode 100644
index 0000000000..b28419b13a
--- /dev/null
+++ b/boost/spirit/include/support_adapt_adt_attributes.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ADAPT_ADT_ATTRIBUTES
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ADAPT_ADT_ATTRIBUTES
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/adapt_adt_attributes.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_any.hpp b/boost/spirit/include/support_any.hpp
new file mode 100644
index 0000000000..a1979d96e0
--- /dev/null
+++ b/boost/spirit/include/support_any.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ANY
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ANY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/algorithm/any.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_any_if.hpp b/boost/spirit/include/support_any_if.hpp
new file mode 100644
index 0000000000..5fa9a58d42
--- /dev/null
+++ b/boost/spirit/include/support_any_if.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ANY_IF
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ANY_IF
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/algorithm/any_if.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_any_if_ns.hpp b/boost/spirit/include/support_any_if_ns.hpp
new file mode 100644
index 0000000000..26c6a7fc38
--- /dev/null
+++ b/boost/spirit/include/support_any_if_ns.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ANY_IF_NS
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ANY_IF_NS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/algorithm/any_if_ns.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_any_ns.hpp b/boost/spirit/include/support_any_ns.hpp
new file mode 100644
index 0000000000..3826aff6b9
--- /dev/null
+++ b/boost/spirit/include/support_any_ns.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ANY_NS
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ANY_NS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/algorithm/any_ns.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_argument.hpp b/boost/spirit/include/support_argument.hpp
new file mode 100644
index 0000000000..f45b766837
--- /dev/null
+++ b/boost/spirit/include/support_argument.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ARGUMENT
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ARGUMENT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/argument.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_ascii.hpp b/boost/spirit/include/support_ascii.hpp
new file mode 100644
index 0000000000..5c08036c4f
--- /dev/null
+++ b/boost/spirit/include/support_ascii.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ASCII
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ASCII
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_encoding/ascii.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_attributes.hpp b/boost/spirit/include/support_attributes.hpp
new file mode 100644
index 0000000000..ecb68ff321
--- /dev/null
+++ b/boost/spirit/include/support_attributes.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ATTRIBUTE_OF
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ATTRIBUTE_OF
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/attributes.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_attributes_fwd.hpp b/boost/spirit/include/support_attributes_fwd.hpp
new file mode 100644
index 0000000000..ad72ed519a
--- /dev/null
+++ b/boost/spirit/include/support_attributes_fwd.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ATTRIBUTE_FWD
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ATTRIBUTE_FWD
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/attributes_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_char_class.hpp b/boost/spirit/include/support_char_class.hpp
new file mode 100644
index 0000000000..b88346ec81
--- /dev/null
+++ b/boost/spirit/include/support_char_class.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_CHAR_CLASS
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_CHAR_CLASS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_class.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_container.hpp b/boost/spirit/include/support_container.hpp
new file mode 100644
index 0000000000..cfd6c9fcc4
--- /dev/null
+++ b/boost/spirit/include/support_container.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_CONTAINER
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_CONTAINER
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/container.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_extended_variant.hpp b/boost/spirit/include/support_extended_variant.hpp
new file mode 100644
index 0000000000..f58e843224
--- /dev/null
+++ b/boost/spirit/include/support_extended_variant.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_EXTENDED_VARIANT
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_EXTENDED_VARIANT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/extended_variant.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_info.hpp b/boost/spirit/include/support_info.hpp
new file mode 100644
index 0000000000..73c03e2539
--- /dev/null
+++ b/boost/spirit/include/support_info.hpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_INFO
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_INFO
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/info.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_iso8859_1.hpp b/boost/spirit/include/support_iso8859_1.hpp
new file mode 100644
index 0000000000..d781cd3d0f
--- /dev/null
+++ b/boost/spirit/include/support_iso8859_1.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ISO8859_1
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ISO8859_1
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_encoding/iso8859_1.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_istream_iterator.hpp b/boost/spirit/include/support_istream_iterator.hpp
new file mode 100644
index 0000000000..d1bafedd35
--- /dev/null
+++ b/boost/spirit/include/support_istream_iterator.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_ISTREAM_ITERATOR
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_ISTREAM_ITERATOR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/iterators/istream_iterator.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_line_pos_iterator.hpp b/boost/spirit/include/support_line_pos_iterator.hpp
new file mode 100644
index 0000000000..d5ed04536e
--- /dev/null
+++ b/boost/spirit/include/support_line_pos_iterator.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2010 Bryce Lelbach
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_LINE_POS_ITERATOR
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_LINE_POS_ITERATOR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/iterators/line_pos_iterator.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_locals.hpp b/boost/spirit/include/support_locals.hpp
new file mode 100644
index 0000000000..d5a88ab393
--- /dev/null
+++ b/boost/spirit/include/support_locals.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_LOCALS
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_LOCALS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/nonterminal/locals.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_look_ahead.hpp b/boost/spirit/include/support_look_ahead.hpp
new file mode 100644
index 0000000000..71dabdfec7
--- /dev/null
+++ b/boost/spirit/include/support_look_ahead.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_LOOK_AHEAD
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_LOOK_AHEAD
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/iterators/look_ahead.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_modify.hpp b/boost/spirit/include/support_modify.hpp
new file mode 100644
index 0000000000..c51f4b64e7
--- /dev/null
+++ b/boost/spirit/include/support_modify.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_MODIFY
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_MODIFY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/modify.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_multi_pass.hpp b/boost/spirit/include/support_multi_pass.hpp
new file mode 100644
index 0000000000..7888320f23
--- /dev/null
+++ b/boost/spirit/include/support_multi_pass.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_MULTI_PASS
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_MULTI_PASS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/multi_pass.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_multi_pass_fwd.hpp b/boost/spirit/include/support_multi_pass_fwd.hpp
new file mode 100644
index 0000000000..9aebbeb423
--- /dev/null
+++ b/boost/spirit/include/support_multi_pass_fwd.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_MULTI_PASS_FWD
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_MULTI_PASS_FWD
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_ostream_iterator.hpp b/boost/spirit/include/support_ostream_iterator.hpp
new file mode 100644
index 0000000000..19c0185f7f
--- /dev/null
+++ b/boost/spirit/include/support_ostream_iterator.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_OSTREAM_ITERATOR
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_OSTREAM_ITERATOR
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/iterators/ostream_iterator.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_standard.hpp b/boost/spirit/include/support_standard.hpp
new file mode 100644
index 0000000000..24ea6a7977
--- /dev/null
+++ b/boost/spirit/include/support_standard.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_STANDARD
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_STANDARD
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_encoding/standard.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_standard_wide.hpp b/boost/spirit/include/support_standard_wide.hpp
new file mode 100644
index 0000000000..74c85b06e9
--- /dev/null
+++ b/boost/spirit/include/support_standard_wide.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_STANDARD_WIDE
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_STANDARD_WIDE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_string_traits.hpp b/boost/spirit/include/support_string_traits.hpp
new file mode 100644
index 0000000000..e2bf0d9776
--- /dev/null
+++ b/boost/spirit/include/support_string_traits.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_STRING_TRAITS
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_STRING_TRAITS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/string_traits.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_unused.hpp b/boost/spirit/include/support_unused.hpp
new file mode 100644
index 0000000000..d5cedc2a26
--- /dev/null
+++ b/boost/spirit/include/support_unused.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_UNUSED
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_UNUSED
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+
+#endif
diff --git a/boost/spirit/include/support_utree.hpp b/boost/spirit/include/support_utree.hpp
new file mode 100644
index 0000000000..2c36ba849e
--- /dev/null
+++ b/boost/spirit/include/support_utree.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_SUPPORT_UTREE
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_UTREE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/utree.hpp>
+
+#endif
diff --git a/boost/spirit/include/version.hpp b/boost/spirit/include/version.hpp
new file mode 100644
index 0000000000..1e677a4853
--- /dev/null
+++ b/boost/spirit/include/version.hpp
@@ -0,0 +1,20 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(SPIRIT_VERSION_INCLUDED)
+#define SPIRIT_VERSION_INCLUDED
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// This is the version of the current Spirit distribution
+//
+///////////////////////////////////////////////////////////////////////////////
+#define SPIRIT_VERSION 0x2050
+#define SPIRIT_PIZZA_VERSION DEEP_PAN_BBQ // :-O
+
+#endif
diff --git a/boost/spirit/iterator.hpp b/boost/spirit/iterator.hpp
new file mode 100644
index 0000000000..b79c348d04
--- /dev/null
+++ b/boost/spirit/iterator.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ITERATOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ITERATOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_iterator.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_iterator.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_iterator.hpp>
+
+#endif
diff --git a/boost/spirit/iterator/file_iterator.hpp b/boost/spirit/iterator/file_iterator.hpp
new file mode 100644
index 0000000000..da75045294
--- /dev/null
+++ b/boost/spirit/iterator/file_iterator.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_FILE_ITERATOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_FILE_ITERATOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_file_iterator.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_file_iterator.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_file_iterator.hpp>
+
+#endif
diff --git a/boost/spirit/iterator/file_iterator_fwd.hpp b/boost/spirit/iterator/file_iterator_fwd.hpp
new file mode 100644
index 0000000000..7a51754e5b
--- /dev/null
+++ b/boost/spirit/iterator/file_iterator_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_FILE_ITERATOR_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_FILE_ITERATOR_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_file_iterator_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_file_iterator_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_file_iterator_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/iterator/fixed_size_queue.hpp b/boost/spirit/iterator/fixed_size_queue.hpp
new file mode 100644
index 0000000000..6e7cdbb5a0
--- /dev/null
+++ b/boost/spirit/iterator/fixed_size_queue.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_FIXED_SIZE_QUEUE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_FIXED_SIZE_QUEUE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_fixed_size_queue.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_fixed_size_queue.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_fixed_size_queue.hpp>
+
+#endif
diff --git a/boost/spirit/iterator/multi_pass.hpp b/boost/spirit/iterator/multi_pass.hpp
new file mode 100644
index 0000000000..91bd91f3f9
--- /dev/null
+++ b/boost/spirit/iterator/multi_pass.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_MULTI_PASS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_MULTI_PASS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_multi_pass.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_multi_pass.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_multi_pass.hpp>
+
+#endif
diff --git a/boost/spirit/iterator/multi_pass_fwd.hpp b/boost/spirit/iterator/multi_pass_fwd.hpp
new file mode 100644
index 0000000000..8a477d45de
--- /dev/null
+++ b/boost/spirit/iterator/multi_pass_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_MULTI_PASS_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_MULTI_PASS_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_multi_pass_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_multi_pass_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_multi_pass_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/iterator/position_iterator.hpp b/boost/spirit/iterator/position_iterator.hpp
new file mode 100644
index 0000000000..043ab0ff4b
--- /dev/null
+++ b/boost/spirit/iterator/position_iterator.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_POSITION_ITERATOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_POSITION_ITERATOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_position_iterator.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_position_iterator.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_position_iterator.hpp>
+
+#endif
diff --git a/boost/spirit/iterator/position_iterator_fwd.hpp b/boost/spirit/iterator/position_iterator_fwd.hpp
new file mode 100644
index 0000000000..14d91114b0
--- /dev/null
+++ b/boost/spirit/iterator/position_iterator_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_POSITION_ITERATOR_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_POSITION_ITERATOR_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_position_iterator_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_position_iterator_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_position_iterator_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/iterator/typeof.hpp b/boost/spirit/iterator/typeof.hpp
new file mode 100644
index 0000000000..8da3962bed
--- /dev/null
+++ b/boost/spirit/iterator/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_ITERATOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_ITERATOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/meta.hpp b/boost/spirit/meta.hpp
new file mode 100644
index 0000000000..2bc004b5cb
--- /dev/null
+++ b/boost/spirit/meta.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_META
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_META
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_meta.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_meta.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_meta.hpp>
+
+#endif
diff --git a/boost/spirit/meta/as_parser.hpp b/boost/spirit/meta/as_parser.hpp
new file mode 100644
index 0000000000..0326ef09a3
--- /dev/null
+++ b/boost/spirit/meta/as_parser.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_AS_PARSER
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_AS_PARSER
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_as_parser.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_as_parser.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_as_parser.hpp>
+
+#endif
diff --git a/boost/spirit/meta/fundamental.hpp b/boost/spirit/meta/fundamental.hpp
new file mode 100644
index 0000000000..4753cc2d3d
--- /dev/null
+++ b/boost/spirit/meta/fundamental.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_FUNDAMENTAL
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_FUNDAMENTAL
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_fundamental.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_fundamental.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_fundamental.hpp>
+
+#endif
diff --git a/boost/spirit/meta/parser_traits.hpp b/boost/spirit/meta/parser_traits.hpp
new file mode 100644
index 0000000000..4f0f68c82d
--- /dev/null
+++ b/boost/spirit/meta/parser_traits.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARSER_TRAITS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARSER_TRAITS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parser_traits.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parser_traits.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parser_traits.hpp>
+
+#endif
diff --git a/boost/spirit/meta/refactoring.hpp b/boost/spirit/meta/refactoring.hpp
new file mode 100644
index 0000000000..235d61abd3
--- /dev/null
+++ b/boost/spirit/meta/refactoring.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_REFACTORING
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_REFACTORING
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_refactoring.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_refactoring.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_refactoring.hpp>
+
+#endif
diff --git a/boost/spirit/meta/traverse.hpp b/boost/spirit/meta/traverse.hpp
new file mode 100644
index 0000000000..594fa8360f
--- /dev/null
+++ b/boost/spirit/meta/traverse.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TRAVERSE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TRAVERSE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_traverse.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_traverse.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_traverse.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix.hpp b/boost/spirit/phoenix.hpp
new file mode 100644
index 0000000000..513b904b7f
--- /dev/null
+++ b/boost/spirit/phoenix.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PHOENIX
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PHOENIX
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/phoenix1.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/actor.hpp b/boost/spirit/phoenix/actor.hpp
new file mode 100644
index 0000000000..665c4ade6c
--- /dev/null
+++ b/boost/spirit/phoenix/actor.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PHOENIX_ACTOR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PHOENIX_ACTOR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_actor.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_actor.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_actor.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/binders.hpp b/boost/spirit/phoenix/binders.hpp
new file mode 100644
index 0000000000..e5aab61004
--- /dev/null
+++ b/boost/spirit/phoenix/binders.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_BINDERS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_BINDERS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_binders.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_binders.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_binders.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/casts.hpp b/boost/spirit/phoenix/casts.hpp
new file mode 100644
index 0000000000..1c583bcd51
--- /dev/null
+++ b/boost/spirit/phoenix/casts.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CASTS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CASTS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_casts.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_casts.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_casts.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/closures.hpp b/boost/spirit/phoenix/closures.hpp
new file mode 100644
index 0000000000..ecf7ea563a
--- /dev/null
+++ b/boost/spirit/phoenix/closures.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CLOSURES
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CLOSURES
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_closures.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_closures.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_closures.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/composite.hpp b/boost/spirit/phoenix/composite.hpp
new file mode 100644
index 0000000000..51ebb89ae0
--- /dev/null
+++ b/boost/spirit/phoenix/composite.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PHOENIX_COMPOSITE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PHOENIX_COMPOSITE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_composite.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_composite.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_composite.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/functions.hpp b/boost/spirit/phoenix/functions.hpp
new file mode 100644
index 0000000000..6fbf01ee25
--- /dev/null
+++ b/boost/spirit/phoenix/functions.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_FUNCTIONS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_FUNCTIONS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_functions.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_functions.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_functions.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/new.hpp b/boost/spirit/phoenix/new.hpp
new file mode 100644
index 0000000000..a348a31183
--- /dev/null
+++ b/boost/spirit/phoenix/new.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_NEW
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_NEW
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_new.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_new.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_new.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/operators.hpp b/boost/spirit/phoenix/operators.hpp
new file mode 100644
index 0000000000..648874f28c
--- /dev/null
+++ b/boost/spirit/phoenix/operators.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PHOENIX_OPERATORS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PHOENIX_OPERATORS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_operators.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_operators.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_operators.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/primitives.hpp b/boost/spirit/phoenix/primitives.hpp
new file mode 100644
index 0000000000..00a3ebfdc0
--- /dev/null
+++ b/boost/spirit/phoenix/primitives.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PHOENIX_PRIMITIVES
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PHOENIX_PRIMITIVES
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_primitives.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_primitives.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_primitives.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/special_ops.hpp b/boost/spirit/phoenix/special_ops.hpp
new file mode 100644
index 0000000000..59930f4b14
--- /dev/null
+++ b/boost/spirit/phoenix/special_ops.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SPECIAL_OPS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SPECIAL_OPS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_special_ops.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_special_ops.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_special_ops.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/statements.hpp b/boost/spirit/phoenix/statements.hpp
new file mode 100644
index 0000000000..a5ae9e0b4e
--- /dev/null
+++ b/boost/spirit/phoenix/statements.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_STATEMENTS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_STATEMENTS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_statements.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_statements.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_statements.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/tuple_helpers.hpp b/boost/spirit/phoenix/tuple_helpers.hpp
new file mode 100644
index 0000000000..92a4ce9743
--- /dev/null
+++ b/boost/spirit/phoenix/tuple_helpers.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TUPLE_HELPERS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TUPLE_HELPERS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_tuple_helpers.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_tuple_helpers.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_tuple_helpers.hpp>
+
+#endif
diff --git a/boost/spirit/phoenix/tuples.hpp b/boost/spirit/phoenix/tuples.hpp
new file mode 100644
index 0000000000..1460ac025d
--- /dev/null
+++ b/boost/spirit/phoenix/tuples.hpp
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TUPLES
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TUPLES
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/phoenix1_tuples.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/phoenix1_tuples.hpp"
+#endif
+#endif
+
+#include <boost/spirit/include/phoenix1_tuples.hpp>
+
+#endif
diff --git a/boost/spirit/repository/home/karma.hpp b/boost/spirit/repository/home/karma.hpp
new file mode 100644
index 0000000000..11e1543e79
--- /dev/null
+++ b/boost/spirit/repository/home/karma.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_KARMA_APR_28_2009_1259PM)
+#define SPIRIT_REPOSITORY_KARMA_APR_28_2009_1259PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/karma/directive.hpp>
+#include <boost/spirit/repository/home/karma/nonterminal.hpp>
+
+#endif
+
diff --git a/boost/spirit/repository/home/karma/directive.hpp b/boost/spirit/repository/home/karma/directive.hpp
new file mode 100644
index 0000000000..716c3a2c23
--- /dev/null
+++ b/boost/spirit/repository/home/karma/directive.hpp
@@ -0,0 +1,17 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_KARMA_DIRECTIVE_APR_28_2009_1258PM)
+#define SPIRIT_REPOSITORY_KARMA_DIRECTIVE_APR_28_2009_1258PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/karma/directive/confix.hpp>
+
+#endif
+
diff --git a/boost/spirit/repository/home/karma/directive/confix.hpp b/boost/spirit/repository/home/karma/directive/confix.hpp
new file mode 100644
index 0000000000..cc7bd99898
--- /dev/null
+++ b/boost/spirit/repository/home/karma/directive/confix.hpp
@@ -0,0 +1,140 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_KARMA_CONFIX_AUG_19_2008_1041AM)
+#define BOOST_SPIRIT_REPOSITORY_KARMA_CONFIX_AUG_19_2008_1041AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+
+#include <boost/spirit/repository/home/support/confix.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/mpl/or.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables confix(..., ...)[]
+ template <typename Prefix, typename Suffix>
+ struct use_directive<karma::domain
+ , terminal_ex<repository::tag::confix, fusion::vector2<Prefix, Suffix> > >
+ : mpl::true_ {};
+
+ // enables *lazy* confix(..., ...)[g]
+ template <>
+ struct use_lazy_directive<karma::domain, repository::tag::confix, 2>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace repository { namespace karma
+{
+ using repository::confix_type;
+ using repository::confix;
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Prefix, typename Suffix>
+ struct confix_generator
+ : spirit::karma::primitive_generator<confix_generator<Subject, Prefix, Suffix> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ confix_generator(Subject const& subject, Prefix const& prefix
+ , Suffix const& suffix)
+ : subject(subject), prefix(prefix), suffix(suffix) {}
+
+ ///////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Context, typename Delimiter
+ , typename Attribute>
+ bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
+ , Attribute const& attr) const
+ {
+ // generate the prefix, the embedded item and the suffix
+ return prefix.generate(sink, ctx, d, unused) &&
+ subject.generate(sink, ctx, d, attr) &&
+ suffix.generate(sink, ctx, d, unused);
+ }
+
+ template <typename Context>
+ info what(Context const& ctx) const
+ {
+ return info("confix", subject.what(ctx));
+ }
+
+ Subject subject;
+ Prefix prefix;
+ Suffix suffix;
+ };
+
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Generator generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // creates confix(..., ...)[] directive generator
+ template <typename Prefix, typename Suffix, typename Subject
+ , typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::confix, fusion::vector2<Prefix, Suffix> >
+ , Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<karma::domain, Prefix, Modifiers>::type
+ prefix_type;
+ typedef typename
+ result_of::compile<karma::domain, Suffix, Modifiers>::type
+ suffix_type;
+
+ typedef repository::karma::confix_generator<
+ Subject, prefix_type, suffix_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<karma::domain>(fusion::at_c<0>(term.args), modifiers)
+ , compile<karma::domain>(fusion::at_c<1>(term.args), modifiers));
+ }
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Subject, typename Prefix, typename Suffix>
+ struct has_semantic_action<
+ repository::karma::confix_generator<Subject, Prefix, Suffix> >
+ : mpl::or_<
+ has_semantic_action<Subject>
+ , has_semantic_action<Prefix>
+ , has_semantic_action<Suffix>
+ > {};
+}}}
+
+#endif
diff --git a/boost/spirit/repository/home/karma/nonterminal.hpp b/boost/spirit/repository/home/karma/nonterminal.hpp
new file mode 100644
index 0000000000..85c836f080
--- /dev/null
+++ b/boost/spirit/repository/home/karma/nonterminal.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2009 Francois Barel
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_KARMA_NONTERMINAL_AUG_12_2009_0807PM)
+#define SPIRIT_REPOSITORY_KARMA_NONTERMINAL_AUG_12_2009_0807PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/karma/nonterminal/subrule.hpp>
+
+#endif
+
diff --git a/boost/spirit/repository/home/karma/nonterminal/subrule.hpp b/boost/spirit/repository/home/karma/nonterminal/subrule.hpp
new file mode 100644
index 0000000000..29651a28e8
--- /dev/null
+++ b/boost/spirit/repository/home/karma/nonterminal/subrule.hpp
@@ -0,0 +1,560 @@
+// Copyright (c) 2009 Francois Barel
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2001-2012 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_KARMA_SUBRULE_AUGUST_12_2009_0813PM)
+#define BOOST_SPIRIT_REPOSITORY_KARMA_SUBRULE_AUGUST_12_2009_0813PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/generator.hpp>
+#include <boost/spirit/home/karma/reference.hpp>
+#include <boost/spirit/home/karma/nonterminal/detail/generator_binder.hpp>
+#include <boost/spirit/home/karma/nonterminal/detail/parameterized.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/karma/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/nonterminal/extract_param.hpp>
+#include <boost/spirit/home/support/nonterminal/locals.hpp>
+#include <boost/spirit/repository/home/support/subrule_context.hpp>
+
+#include <boost/fusion/include/as_map.hpp>
+#include <boost/fusion/include/at_key.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/fusion/include/front.hpp>
+#include <boost/fusion/include/has_key.hpp>
+#include <boost/fusion/include/join.hpp>
+#include <boost/fusion/include/make_map.hpp>
+#include <boost/fusion/include/make_vector.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace repository { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // subrule_group:
+ // - generator representing a group of subrule definitions (one or more),
+ // invokes first subrule on entry,
+ // - also a Proto terminal, so that a group behaves like any Spirit
+ // expression.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Defs>
+ struct subrule_group
+ : proto::extends<
+ typename proto::terminal<
+ spirit::karma::reference<subrule_group<Defs> const>
+ >::type
+ , subrule_group<Defs>
+ >
+ , spirit::karma::generator<subrule_group<Defs> >
+ {
+ struct properties
+ // Forward to first subrule.
+ : remove_reference<
+ typename fusion::result_of::front<Defs>::type
+ >::type::second_type::subject_type::properties {};
+
+ // Fusion associative sequence, associating each subrule ID in this
+ // group (as an MPL integral constant) with its definition
+ typedef Defs defs_type;
+
+ typedef subrule_group<Defs> this_type;
+ typedef spirit::karma::reference<this_type const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, this_type> base_type;
+
+ static size_t const params_size =
+ // Forward to first subrule.
+ remove_reference<
+ typename fusion::result_of::front<Defs>::type
+ >::type::second_type::params_size;
+
+ subrule_group(subrule_group const& rhs)
+ : base_type(terminal::make(reference_(*this)))
+ , defs(rhs.defs)
+ {
+ }
+
+ explicit subrule_group(Defs const& defs)
+ : base_type(terminal::make(reference_(*this)))
+ , defs(defs)
+ {
+ }
+
+ // from a subrule ID, get the type of a reference to its definition
+ template <int ID>
+ struct def_type
+ {
+ typedef mpl::int_<ID> id_type;
+
+ // If you are seeing a compilation error here, you are trying
+ // to use a subrule which was not defined in this group.
+ BOOST_SPIRIT_ASSERT_MSG(
+ (fusion::result_of::has_key<
+ defs_type const, id_type>::type::value)
+ , subrule_used_without_being_defined, (mpl::int_<ID>));
+
+ typedef typename
+ fusion::result_of::at_key<defs_type const, id_type>::type
+ type;
+ };
+
+ // from a subrule ID, get a reference to its definition
+ template <int ID>
+ typename def_type<ID>::type def() const
+ {
+ return fusion::at_key<mpl::int_<ID> >(defs);
+ }
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ // Forward to first subrule.
+ : mpl::identity<
+ typename remove_reference<
+ typename fusion::result_of::front<Defs>::type
+ >::type::second_type::attr_type> {};
+
+ template <typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& delimiter, Attribute const& attr) const
+ {
+ // Forward to first subrule.
+ return generate_subrule(fusion::front(defs).second
+ , sink, context, delimiter, attr);
+ }
+
+ template <typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute
+ , typename Params>
+ bool generate(OutputIterator& sink, Context& context
+ , Delimiter const& delimiter, Attribute const& attr
+ , Params const& params) const
+ {
+ // Forward to first subrule.
+ return generate_subrule(fusion::front(defs).second
+ , sink, context, delimiter, attr, params);
+ }
+
+ template <int ID, typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool generate_subrule_id(OutputIterator& sink
+ , Context& context, Delimiter const& delimiter
+ , Attribute const& attr) const
+ {
+ return generate_subrule(def<ID>()
+ , sink, context, delimiter, attr);
+ }
+
+ template <int ID, typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute, typename Params>
+ bool generate_subrule_id(OutputIterator& sink
+ , Context& context, Delimiter const& delimiter
+ , Attribute const& attr, Params const& params) const
+ {
+ return generate_subrule(def<ID>()
+ , sink, context, delimiter, attr, params);
+ }
+
+ template <typename Def, typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool generate_subrule(Def const& def, OutputIterator& sink
+ , Context& /*caller_context*/, Delimiter const& delimiter
+ , Attribute const& attr) const
+ {
+ // compute context type for this subrule
+ typedef typename Def::locals_type subrule_locals_type;
+ typedef typename Def::attr_type subrule_attr_type;
+ typedef typename Def::attr_reference_type subrule_attr_reference_type;
+ typedef typename Def::parameter_types subrule_parameter_types;
+
+ typedef
+ subrule_context<
+ this_type
+ , fusion::cons<
+ subrule_attr_reference_type, subrule_parameter_types>
+ , subrule_locals_type
+ >
+ context_type;
+
+ // Create an attribute if none is supplied.
+ typedef traits::make_attribute<subrule_attr_type, Attribute>
+ make_attribute;
+
+ // If you are seeing a compilation error here, you are probably
+ // trying to use a subrule which has inherited attributes,
+ // without passing values for them.
+ context_type context(*this
+ , traits::pre_transform<karma::domain, subrule_attr_type>(
+ make_attribute::call(attr)));
+
+ return def.binder(sink, context, delimiter);
+ }
+
+ template <typename Def, typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute, typename Params>
+ bool generate_subrule(Def const& def, OutputIterator& sink
+ , Context& caller_context, Delimiter const& delimiter
+ , Attribute const& attr, Params const& params) const
+ {
+ // compute context type for this subrule
+ typedef typename Def::locals_type subrule_locals_type;
+ typedef typename Def::attr_type subrule_attr_type;
+ typedef typename Def::attr_reference_type subrule_attr_reference_type;
+ typedef typename Def::parameter_types subrule_parameter_types;
+
+ typedef
+ subrule_context<
+ this_type
+ , fusion::cons<
+ subrule_attr_reference_type, subrule_parameter_types>
+ , subrule_locals_type
+ >
+ context_type;
+
+ // Create an attribute if none is supplied.
+ typedef traits::make_attribute<subrule_attr_type, Attribute>
+ make_attribute;
+
+ // If you are seeing a compilation error here, you are probably
+ // trying to use a subrule which has inherited attributes,
+ // passing values of incompatible types for them.
+ context_type context(*this
+ , traits::pre_transform<karma::domain, subrule_attr_type>(
+ make_attribute::call(attr)), params, caller_context);
+
+ return def.binder(sink, context, delimiter);
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ // Forward to first subrule.
+ return fusion::front(defs).second.binder.g.what(context);
+ }
+
+ template <typename Defs2>
+ subrule_group<
+ typename fusion::result_of::as_map<
+ typename fusion::result_of::join<
+ Defs const, Defs2 const>::type>::type>
+ operator,(subrule_group<Defs2> const& other) const
+ {
+ typedef subrule_group<
+ typename fusion::result_of::as_map<
+ typename fusion::result_of::join<
+ Defs const, Defs2 const>::type>::type> result_type;
+ return result_type(fusion::as_map(fusion::join(defs, other.defs)));
+ }
+
+ // bring in the operator() overloads
+ this_type const& get_parameterized_subject() const { return *this; }
+ typedef this_type parameterized_subject_type;
+ #include <boost/spirit/home/karma/nonterminal/detail/fcall.hpp>
+
+ Defs defs;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // subrule_definition: holds one particular definition of a subrule
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ int ID_
+ , typename Locals
+ , typename Attr
+ , typename AttrRef
+ , typename Parameters
+ , size_t ParamsSize
+ , typename Subject
+ , bool Auto_
+ >
+ struct subrule_definition
+ {
+ typedef mpl::int_<ID_> id_type;
+ BOOST_STATIC_CONSTANT(int, ID = ID_);
+
+ typedef Locals locals_type;
+ typedef Attr attr_type;
+ typedef AttrRef attr_reference_type;
+ typedef Parameters parameter_types;
+ static size_t const params_size = ParamsSize;
+
+ typedef Subject subject_type;
+ typedef mpl::bool_<Auto_> auto_type;
+ BOOST_STATIC_CONSTANT(bool, Auto = Auto_);
+
+ typedef spirit::karma::detail::generator_binder<
+ Subject, auto_type> binder_type;
+
+ subrule_definition(Subject const& subject, std::string const& name)
+ : binder(subject), name(name)
+ {
+ }
+
+ binder_type const binder;
+ std::string const name;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // subrule placeholder:
+ // - on subrule definition: helper for creation of subrule_group,
+ // - on subrule invocation: Proto terminal and generator.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ int ID_
+ , typename T1 = unused_type
+ , typename T2 = unused_type
+ >
+ struct subrule
+ : proto::extends<
+ typename proto::terminal<
+ spirit::karma::reference<subrule<ID_, T1, T2> const>
+ >::type
+ , subrule<ID_, T1, T2>
+ >
+ , spirit::karma::generator<subrule<ID_, T1, T2> >
+ {
+ //FIXME should go fetch the real properties of this subrule's definition in the current context, but we don't
+ // have the context here (properties would need to be 'template<typename Context> struct properties' instead)
+ typedef mpl::int_<
+ spirit::karma::generator_properties::all_properties> properties;
+
+ typedef mpl::int_<ID_> id_type;
+ BOOST_STATIC_CONSTANT(int, ID = ID_);
+
+ typedef subrule<ID_, T1, T2> this_type;
+ typedef spirit::karma::reference<this_type const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, this_type> base_type;
+
+ typedef mpl::vector<T1, T2> template_params;
+
+ // locals_type is a sequence of types to be used as local variables
+ typedef typename
+ spirit::detail::extract_locals<template_params>::type
+ locals_type;
+
+ typedef typename
+ spirit::detail::extract_sig<template_params>::type
+ sig_type;
+
+ // This is the subrule's attribute type
+ typedef typename
+ spirit::detail::attr_from_sig<sig_type>::type
+ attr_type;
+ typedef typename add_reference<
+ typename add_const<attr_type>::type>::type attr_reference_type;
+
+ // parameter_types is a sequence of types passed as parameters to the subrule
+ typedef typename
+ spirit::detail::params_from_sig<sig_type>::type
+ parameter_types;
+
+ static size_t const params_size =
+ fusion::result_of::size<parameter_types>::type::value;
+
+ explicit subrule(std::string const& name_ = "unnamed-subrule")
+ : base_type(terminal::make(reference_(*this)))
+ , name_(name_)
+ {
+ }
+
+ // compute type of this subrule's definition for expr type Expr
+ template <typename Expr, bool Auto>
+ struct def_type_helper
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (Expr) is not a valid spirit karma expression.
+ BOOST_SPIRIT_ASSERT_MATCH(spirit::karma::domain, Expr);
+
+ typedef typename result_of::compile<
+ spirit::karma::domain, Expr>::type subject_type;
+
+ typedef subrule_definition<
+ ID_
+ , locals_type
+ , attr_type
+ , attr_reference_type
+ , parameter_types
+ , params_size
+ , subject_type
+ , Auto
+ > const type;
+ };
+
+ // compute type of subrule group containing only this
+ // subrule's definition for expr type Expr
+ template <typename Expr, bool Auto>
+ struct group_type_helper
+ {
+ typedef typename def_type_helper<Expr, Auto>::type def_type;
+
+ // create Defs map with only one entry: (ID -> def)
+ typedef typename
+ fusion::result_of::make_map<id_type, def_type>::type
+ defs_type;
+
+ typedef subrule_group<defs_type> type;
+ };
+
+ template <typename Expr>
+ typename group_type_helper<Expr, false>::type
+ operator=(Expr const& expr) const
+ {
+ typedef group_type_helper<Expr, false> helper;
+ typedef typename helper::def_type def_type;
+ typedef typename helper::type result_type;
+ return result_type(fusion::make_map<id_type>(
+ def_type(compile<spirit::karma::domain>(expr), name_)));
+ }
+
+ template <typename Expr>
+ friend typename group_type_helper<Expr, true>::type
+ operator%=(subrule const& sr, Expr const& expr)
+ {
+ typedef group_type_helper<Expr, true> helper;
+ typedef typename helper::def_type def_type;
+ typedef typename helper::type result_type;
+ return result_type(fusion::make_map<id_type>(
+ def_type(compile<spirit::karma::domain>(expr), sr.name_)));
+ }
+
+ // non-const versions needed to suppress proto's %= kicking in
+ template <typename Expr>
+ friend typename group_type_helper<Expr, true>::type
+ operator%=(subrule const& sr, Expr& expr)
+ {
+ return operator%=(
+ sr
+ , static_cast<Expr const&>(expr));
+ }
+ template <typename Expr>
+ friend typename group_type_helper<Expr, true>::type
+ operator%=(subrule& sr, Expr const& expr)
+ {
+ return operator%=(
+ static_cast<subrule const&>(sr)
+ , expr);
+ }
+ template <typename Expr>
+ friend typename group_type_helper<Expr, true>::type
+ operator%=(subrule& sr, Expr& expr)
+ {
+ return operator%=(
+ static_cast<subrule const&>(sr)
+ , static_cast<Expr const&>(expr));
+ }
+
+ std::string const& name() const
+ {
+ return name_;
+ }
+
+ void name(std::string const& str)
+ {
+ name_ = str;
+ }
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef attr_type type;
+ };
+
+ template <typename OutputIterator, typename Group
+ , typename Attributes, typename Locals
+ , typename Delimiter, typename Attribute>
+ bool generate(OutputIterator& sink
+ , subrule_context<Group, Attributes, Locals>& context
+ , Delimiter const& delimiter, Attribute const& attr) const
+ {
+ return context.group.template generate_subrule_id<ID_>(
+ sink, context, delimiter, attr);
+ }
+
+ template <typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute>
+ bool generate(OutputIterator& /*sink*/
+ , Context& /*context*/
+ , Delimiter const& /*delimiter*/, Attribute const& /*attr*/) const
+ {
+ // If you are seeing a compilation error here, you are trying
+ // to use a subrule as a generator outside of a subrule group.
+ BOOST_SPIRIT_ASSERT_MSG(false
+ , subrule_used_outside_subrule_group, (id_type));
+
+ return false;
+ }
+
+ template <typename OutputIterator, typename Group
+ , typename Attributes, typename Locals
+ , typename Delimiter, typename Attribute
+ , typename Params>
+ bool generate(OutputIterator& sink
+ , subrule_context<Group, Attributes, Locals>& context
+ , Delimiter const& delimiter, Attribute const& attr
+ , Params const& params) const
+ {
+ return context.group.template generate_subrule_id<ID_>(
+ sink, context, delimiter, attr, params);
+ }
+
+ template <typename OutputIterator, typename Context
+ , typename Delimiter, typename Attribute
+ , typename Params>
+ bool generate(OutputIterator& /*sink*/
+ , Context& /*context*/
+ , Delimiter const& /*delimiter*/, Attribute const& /*attr*/
+ , Params const& /*params*/) const
+ {
+ // If you are seeing a compilation error here, you are trying
+ // to use a subrule as a generator outside of a subrule group.
+ BOOST_SPIRIT_ASSERT_MSG(false
+ , subrule_used_outside_subrule_group, (id_type));
+
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info(name_);
+ }
+
+ // bring in the operator() overloads
+ this_type const& get_parameterized_subject() const { return *this; }
+ typedef this_type parameterized_subject_type;
+ #include <boost/spirit/home/karma/nonterminal/detail/fcall.hpp>
+
+ std::string name_;
+ };
+}}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/repository/home/qi.hpp b/boost/spirit/repository/home/qi.hpp
new file mode 100644
index 0000000000..8d52cf3b03
--- /dev/null
+++ b/boost/spirit/repository/home/qi.hpp
@@ -0,0 +1,20 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_QI_APR_28_2009_1258PM)
+#define SPIRIT_REPOSITORY_QI_APR_28_2009_1258PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/primitive.hpp>
+#include <boost/spirit/repository/home/qi/directive.hpp>
+#include <boost/spirit/repository/home/qi/nonterminal.hpp>
+#include <boost/spirit/repository/home/qi/operator.hpp>
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/directive.hpp b/boost/spirit/repository/home/qi/directive.hpp
new file mode 100644
index 0000000000..4e21b11400
--- /dev/null
+++ b/boost/spirit/repository/home/qi/directive.hpp
@@ -0,0 +1,20 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_QI_DIRECTIVE_APR_28_2009_1258PM)
+#define SPIRIT_REPOSITORY_QI_DIRECTIVE_APR_28_2009_1258PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/directive/distinct.hpp>
+#include <boost/spirit/repository/home/qi/directive/confix.hpp>
+#include <boost/spirit/repository/home/qi/directive/kwd.hpp>
+#include <boost/spirit/repository/home/qi/directive/seek.hpp>
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/directive/confix.hpp b/boost/spirit/repository/home/qi/directive/confix.hpp
new file mode 100644
index 0000000000..d51b0011af
--- /dev/null
+++ b/boost/spirit/repository/home/qi/directive/confix.hpp
@@ -0,0 +1,150 @@
+// Copyright (c) 2009 Chris Hoeppler
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_QI_CONFIX_JUN_22_2009_1041AM)
+#define BOOST_SPIRIT_REPOSITORY_QI_CONFIX_JUN_22_2009_1041AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+
+#include <boost/spirit/repository/home/support/confix.hpp>
+
+#include <boost/fusion/include/vector.hpp>
+#include <boost/mpl/or.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables confix(..., ...)[]
+ template <typename Prefix, typename Suffix>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::confix, fusion::vector2<Prefix, Suffix> > >
+ : mpl::true_ {};
+
+ // enables *lazy* confix(..., ...)[]
+ template <>
+ struct use_lazy_directive<qi::domain, repository::tag::confix, 2>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+ using repository::confix_type;
+ using repository::confix;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // the confix() generated parser
+ template <typename Subject, typename Prefix, typename Suffix>
+ struct confix_parser
+ : spirit::qi::unary_parser<confix_parser<Subject, Prefix, Suffix> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<subject_type, Context, Iterator>
+ {};
+
+ confix_parser(Subject const& subject, Prefix const& prefix
+ , Suffix const& suffix)
+ : subject(subject), prefix(prefix), suffix(suffix) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ Iterator iter = first;
+
+ if (!(prefix.parse(iter, last, context, skipper, unused) &&
+ subject.parse(iter, last, context, skipper, attr) &&
+ suffix.parse(iter, last, context, skipper, unused)))
+ {
+ return false;
+ }
+
+ first = iter;
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context const& ctx) const
+ {
+ return info("confix", subject.what(ctx));
+ }
+
+ Subject subject;
+ Prefix prefix;
+ Suffix suffix;
+ };
+
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // creates confix(..., ...)[] directive
+ template <typename Prefix, typename Suffix, typename Subject
+ , typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::confix, fusion::vector2<Prefix, Suffix> >
+ , Subject, Modifiers>
+ {
+ typedef typename
+ result_of::compile<qi::domain, Prefix, Modifiers>::type
+ prefix_type;
+ typedef typename
+ result_of::compile<qi::domain, Suffix, Modifiers>::type
+ suffix_type;
+
+ typedef repository::qi::confix_parser<
+ Subject, prefix_type, suffix_type> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<qi::domain>(fusion::at_c<0>(term.args), modifiers)
+ , compile<qi::domain>(fusion::at_c<1>(term.args), modifiers));
+ }
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Subject, typename Prefix, typename Suffix>
+ struct has_semantic_action<
+ repository::qi::confix_parser<Subject, Prefix, Suffix> >
+ : mpl::or_<
+ has_semantic_action<Subject>
+ , has_semantic_action<Prefix>
+ , has_semantic_action<Suffix>
+ > {};
+}}}
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/directive/distinct.hpp b/boost/spirit/repository/home/qi/directive/distinct.hpp
new file mode 100644
index 0000000000..740694559e
--- /dev/null
+++ b/boost/spirit/repository/home/qi/directive/distinct.hpp
@@ -0,0 +1,143 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2003 Vaclav Vesely
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_QI_DISTINCT_MAY_20_2009_0825M)
+#define SPIRIT_REPOSITORY_QI_DISTINCT_MAY_20_2009_0825M
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/unused_skipper.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/make_component.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/qi/auxiliary/eps.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/qi/directive/lexeme.hpp>
+#include <boost/spirit/home/qi/operator/not_predicate.hpp>
+
+#include <boost/spirit/repository/home/support/distinct.hpp>
+
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables distinct(...)[...]
+ template <typename Tail>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::distinct, fusion::vector1<Tail> > >
+ : mpl::true_ {};
+
+ // enables *lazy* distinct(...)[...]
+ template <>
+ struct use_lazy_directive<qi::domain, repository::tag::distinct, 1>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace repository {namespace qi
+{
+ using repository::distinct_type;
+ using repository::distinct;
+
+ template <typename Subject, typename Tail, typename Modifier>
+ struct distinct_parser
+ : spirit::qi::unary_parser<distinct_parser<Subject, Tail, Modifier> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ : traits::attribute_of<Subject, Context, Iterator>
+ {};
+
+ distinct_parser(Subject const& subject, Tail const& tail)
+ : subject(subject), tail(tail) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper, Attribute& attr) const
+ {
+ Iterator iter = first;
+
+ spirit::qi::skip_over(iter, last, skipper);
+ if (!subject.parse(iter, last, context
+ , spirit::qi::detail::unused_skipper<Skipper>(skipper), attr))
+ return false;
+
+ Iterator i = iter;
+ if (tail.parse(i, last, context, unused, unused))
+ return false;
+
+ first = iter;
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context& /*ctx*/) const
+ {
+ return info("distinct");
+ }
+
+ Subject subject;
+ Tail tail;
+ };
+
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Tail, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::distinct, fusion::vector1<Tail> >
+ , Subject, Modifiers>
+ {
+ typedef typename result_of::compile<qi::domain, Tail, Modifiers>::type
+ tail_type;
+
+ typedef repository::qi::distinct_parser<
+ Subject, tail_type, Modifiers> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, Subject const& subject
+ , Modifiers const& modifiers) const
+ {
+ return result_type(subject
+ , compile<qi::domain>(fusion::at_c<0>(term.args), modifiers));
+ }
+ };
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Subject, typename Tail, typename Modifier>
+ struct has_semantic_action<
+ repository::qi::distinct_parser<Subject, Tail, Modifier> >
+ : unary_has_semantic_action<Subject> {};
+}}}
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/directive/kwd.hpp b/boost/spirit/repository/home/qi/directive/kwd.hpp
new file mode 100644
index 0000000000..79fdc2f6dc
--- /dev/null
+++ b/boost/spirit/repository/home/qi/directive/kwd.hpp
@@ -0,0 +1,588 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2011 Thomas Bernard
+
+ Distributed under the 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(SPIRIT_KWD_NOVEMBER_14_2008_1148AM)
+#define SPIRIT_KWD_NOVEMBER_14_2008_1148AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/qi/operator/kleene.hpp>
+#include <boost/spirit/home/support/container.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/qi/detail/fail_function.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/repository/home/support/kwd.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/foreach.hpp>
+#include <vector>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ template < typename T>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::kwd // enables kwd(key)[p]
+ , fusion::vector1<T > >
+ > : traits::is_string<T> {};
+
+ template < typename T>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::ikwd // enables ikwd(key)[p]
+ , fusion::vector1<T > >
+ > : traits::is_string<T> {};
+
+
+ template < typename T1, typename T2>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::kwd // enables kwd(key,exact)[p]
+ , fusion::vector2< T1, T2 > >
+ > : traits::is_string<T1> {};
+
+ template < typename T1, typename T2>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::ikwd // enables ikwd(key,exact)[p]
+ , fusion::vector2< T1, T2 > >
+ > : traits::is_string<T1> {};
+
+ template < typename T1, typename T2>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::kwd // enables kwd(min, max)[p]
+ , fusion::vector3< T1, T2, T2 > >
+ > : traits::is_string<T1> {};
+
+ template < typename T1, typename T2>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::ikwd // enables ikwd(min, max)[p]
+ , fusion::vector3< T1, T2, T2 > >
+ > : traits::is_string<T1> {};
+
+ template < typename T1, typename T2>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::kwd // enables kwd(min, inf)[p]
+ , fusion::vector3<T1, T2, inf_type > >
+ > : traits::is_string<T1> {};
+
+ template < typename T1, typename T2>
+ struct use_directive<qi::domain
+ , terminal_ex<repository::tag::ikwd // enables ikwd(min, inf)[p]
+ , fusion::vector3<T1, T2, inf_type > >
+ > : traits::is_string<T1> {};
+
+
+ /* template <> // enables *lazy* kwd(exact)[p]
+ struct use_lazy_directive<
+ qi::domain
+ , tag::kwd
+ , 1 // arity
+ > : mpl::true_ {};
+
+ template <> // enables *lazy* kwd(min, max)[p]
+ struct use_lazy_directive< // and kwd(min, inf)[p]
+ qi::domain
+ , tag::kwd
+ , 2 // arity
+ > : mpl::true_ {};
+*/
+
+}}
+
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+ using repository::kwd;
+ using repository::ikwd;
+ using spirit::inf;
+ using spirit::inf_type;
+
+template <typename T>
+ struct kwd_pass_iterator // handles kwd(exact)[p]
+ {
+ kwd_pass_iterator() {}
+ bool flag_init() const { return true; }
+ bool register_successful_parse(bool &flag,T &i) const {
+ flag=true;
+ return true;
+ }
+
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ kwd_pass_iterator& operator= (kwd_pass_iterator const&);
+ };
+
+ template <typename T>
+ struct kwd_exact_iterator // handles kwd(exact)[p]
+ {
+ kwd_exact_iterator(T const exact)
+ : exact(exact){}
+
+ typedef T type;
+ bool flag_init() const { return false; }
+ bool register_successful_parse(bool &flag,T &i) const {
+ i++;
+ if(i<exact)
+ {
+ flag=false;
+ return true;
+ }
+ else if(i==exact)
+ {
+ flag=true;
+ return true;
+ }
+ else
+ return flag=false;
+
+ }
+ T const exact;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ kwd_exact_iterator& operator= (kwd_exact_iterator const&);
+ };
+
+ template <typename T>
+ struct kwd_finite_iterator // handles kwd(min, max)[p]
+ {
+ kwd_finite_iterator(T const min, T const max)
+ : min BOOST_PREVENT_MACRO_SUBSTITUTION (min)
+ , max BOOST_PREVENT_MACRO_SUBSTITUTION (max)
+ {}
+
+ typedef T type;
+ bool flag_init() const { return min==0; }
+ bool register_successful_parse(bool &flag,T &i) const {
+ i++;
+ if(i<min)
+ {
+ flag=false;
+ return true;
+ }
+ else if(i>=min && i<=max)
+ {
+ return flag=true;
+ }
+ else
+ return flag=false;
+ }
+ T const min;
+ T const max;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ kwd_finite_iterator& operator= (kwd_finite_iterator const&);
+ };
+
+ template <typename T>
+ struct kwd_infinite_iterator // handles kwd(min, inf)[p]
+ {
+ kwd_infinite_iterator(T const min)
+ : min BOOST_PREVENT_MACRO_SUBSTITUTION (min) {}
+
+ typedef T type;
+ bool flag_init() const { return min==0; }
+ bool register_successful_parse(bool &flag,T &i) const {
+ i++;
+ flag = i>=min;
+ return true;
+ }
+ T const min;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ kwd_infinite_iterator& operator= (kwd_infinite_iterator const&);
+ };
+
+ // This class enables the transportation of parameters needed to call
+ // the occurence constraint checker from higher level calls
+ // It also serves to select the correct parse function call
+ // of the keyword parser. The implementation changes depending if it is
+ // called form a keyword parsing loop or not.
+ template <typename Skipper, typename NoCasePass>
+ struct skipper_keyword_marker
+ {
+ typedef NoCasePass no_case_pass;
+
+ skipper_keyword_marker(Skipper const &skipper,bool &flag,int &counter) :
+ skipper(skipper)
+ , flag(flag)
+ , counter(counter)
+ {}
+
+ const Skipper &skipper;
+ bool &flag;
+ int &counter;
+ };
+
+ template <typename Subject, typename KeywordType, typename LoopIter , typename NoCase >
+ struct kwd_parser : spirit::qi::unary_parser<kwd_parser<Subject, KeywordType, LoopIter , NoCase > >
+ {
+ struct kwd_parser_id;
+
+ typedef Subject subject_type;
+ typedef NoCase no_case_keyword;
+
+ typedef typename
+ remove_const<typename traits::char_type_of<KeywordType>::type>::type
+ char_type;
+
+ typedef std::basic_string<char_type> keyword_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::build_std_vector<
+ typename traits::attribute_of<
+ Subject, Context, Iterator>::type
+ >::type
+ type;
+ };
+
+
+ kwd_parser(Subject const& subject
+ , typename add_reference<KeywordType>::type keyword
+ , LoopIter const& iter)
+ : subject(subject), iter(iter), keyword(keyword) {}
+
+ // Call the subject parser on a non container attribute
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_impl(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr,mpl::false_) const
+ {
+ return subject.parse(first,last,context,skipper,attr);
+ }
+
+ // Call the subject parser on a container attribute
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_impl(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr,mpl::true_) const
+ {
+
+ // synthesized attribute needs to be default constructed
+ typename traits::container_value<Attribute>::type val =
+ typename traits::container_value<Attribute>::type();
+
+ Iterator save = first;
+ bool r = subject.parse(first,last,context,skipper, val);
+ if (r)
+ {
+ // push the parsed value into our attribute
+ r = traits::push_back(attr, val);
+ if (!r)
+ first = save;
+ }
+ return r;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute,typename NoCasePass>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, skipper_keyword_marker<Skipper,NoCasePass> const& skipper
+ , Attribute &attr) const
+ {
+
+ typedef typename traits::attribute_of<
+ Subject, Context, Iterator>::type
+ subject_attribute;
+
+ typedef typename mpl::and_<
+ traits::is_container<Attribute>
+ , mpl::not_< traits::is_weak_substitute< subject_attribute,Attribute > >
+ >::type predicate;
+
+ if((no_case_keyword::value && NoCasePass::value) || !NoCasePass::value)
+ {
+ if(parse_impl(first,last,context,skipper.skipper,attr, predicate()))
+ return iter.register_successful_parse(skipper.flag,skipper.counter);
+ }
+ return false;
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ typedef typename traits::attribute_of<
+ Subject, Context, Iterator>::type
+ subject_attribute;
+
+ typedef typename mpl::and_<
+ traits::is_container<Attribute>
+ , mpl::not_< traits::is_weak_substitute< subject_attribute,Attribute > >
+ >::type predicate;
+
+ // Parse the keyword
+ bool flag = iter.flag_init();
+ int counter = 0;
+ Iterator save = first;
+ spirit::qi::skip_over(first, last, skipper);
+ if(keyword.parse(first,last,context,skipper,unused)){
+ // Followed by the subject parser
+ spirit::qi::skip_over(first, last, skipper);
+ if(parse_impl(first,last,context,skipper,attr, predicate()))
+ {
+ return iter.register_successful_parse(flag,counter);
+ }
+ }
+ first = save;
+ return flag;
+ }
+
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ if(no_case_keyword::value)
+ return info("ikwd", subject.what(context));
+ else
+ return info("kwd", subject.what(context));
+ }
+
+ Subject subject;
+ LoopIter iter;
+
+ spirit::qi::literal_string<KeywordType, true> keyword;
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ kwd_parser& operator= (kwd_parser const&);
+
+ template <typename Iterator, typename Context, typename Skipper>
+ static spirit::qi::detail::fail_function<Iterator, Context, Skipper>
+ fail_function(
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper)
+ {
+ return spirit::qi::detail::fail_function<Iterator, Context, Skipper>
+ (first, last, context, skipper);
+ }
+
+
+ };
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+
+ // Directive kwd(key)[p]
+ template <typename T1, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::kwd, fusion::vector1<T1> >, Subject, Modifiers>
+ {
+ typedef typename add_const<T1>::type const_keyword;
+ typedef repository::qi::kwd_pass_iterator<int> iterator_type;
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
+
+
+ typedef repository::qi::kwd_parser<Subject, const_keyword, iterator_type, no_case > result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject
+ ,fusion::at_c<0>(term.args)
+ ,iterator_type()
+ );
+ }
+ };
+
+ // Directive ikwd(key)[p]
+ template <typename T1, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::ikwd, fusion::vector1<T1> >, Subject, Modifiers>
+ {
+ typedef typename add_const<T1>::type const_keyword;
+ typedef repository::qi::kwd_pass_iterator<int> iterator_type;
+
+ typedef repository::qi::kwd_parser<Subject, const_keyword, iterator_type, mpl::true_ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ /* typename spirit::detail::get_encoding<Modifiers,
+ spirit::char_encoding::standard>::type encoding;*/
+
+ return result_type(subject
+ ,fusion::at_c<0>(term.args)
+ ,iterator_type()
+ );
+ }
+ };
+
+ // Directive kwd(key,exact)[p]
+ template <typename T1, typename T2, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::kwd, fusion::vector2<T1,T2> >, Subject, Modifiers>
+ {
+ typedef typename add_const<T1>::type const_keyword;
+ typedef repository::qi::kwd_exact_iterator<T2> iterator_type;
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
+
+ typedef repository::qi::kwd_parser<Subject, const_keyword, iterator_type, no_case > result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject
+ ,fusion::at_c<0>(term.args)
+ ,fusion::at_c<1>(term.args)
+ );
+ }
+ };
+
+ // Directive ikwd(key,exact)[p]
+ template <typename T1, typename T2, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::ikwd, fusion::vector2<T1,T2> >, Subject, Modifiers>
+ {
+ typedef typename add_const<T1>::type const_keyword;
+ typedef repository::qi::kwd_exact_iterator<T2> iterator_type;
+
+ typedef repository::qi::kwd_parser<Subject, const_keyword, iterator_type, mpl::true_ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject
+ , fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args)
+ );
+ }
+ };
+
+ // Directive kwd(min, max)[p]
+ template <typename T1, typename T2, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::kwd, fusion::vector3< T1, T2, T2> >, Subject, Modifiers>
+ {
+ typedef typename add_const<T1>::type const_keyword;
+ typedef repository::qi::kwd_finite_iterator<T2> iterator_type;
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
+
+ typedef repository::qi::kwd_parser<Subject, const_keyword, iterator_type, no_case > result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject, fusion::at_c<0>(term.args),
+ iterator_type(
+ fusion::at_c<1>(term.args)
+ , fusion::at_c<2>(term.args)
+ )
+ );
+ }
+ };
+
+ // Directive ikwd(min, max)[p]
+ template <typename T1, typename T2, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::ikwd, fusion::vector3< T1, T2, T2> >, Subject, Modifiers>
+ {
+ typedef typename add_const<T1>::type const_keyword;
+ typedef repository::qi::kwd_finite_iterator<T2> iterator_type;
+
+ typedef repository::qi::kwd_parser<Subject, const_keyword, iterator_type, mpl::true_ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+
+ return result_type(subject, fusion::at_c<0>(term.args),
+ iterator_type(
+ fusion::at_c<1>(term.args)
+ , fusion::at_c<2>(term.args)
+ )
+ );
+ }
+ };
+
+ // Directive kwd(min, inf)[p]
+ template <typename T1, typename T2, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::kwd
+ , fusion::vector3<T1, T2, inf_type> >, Subject, Modifiers>
+ {
+ typedef typename add_const<T1>::type const_keyword;
+ typedef repository::qi::kwd_infinite_iterator<T2> iterator_type;
+ typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
+
+ typedef repository::qi::kwd_parser<Subject, const_keyword, iterator_type, no_case > result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ return result_type(subject
+ , fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args)
+ );
+ }
+ };
+
+ // Directive ikwd(min, inf)[p]
+ template <typename T1, typename T2, typename Subject, typename Modifiers>
+ struct make_directive<
+ terminal_ex<repository::tag::ikwd
+ , fusion::vector3<T1, T2, inf_type> >, Subject, Modifiers>
+ {
+ typedef typename add_const<T1>::type const_keyword;
+ typedef repository::qi::kwd_infinite_iterator<T2> iterator_type;
+
+ typedef repository::qi::kwd_parser<Subject, const_keyword, iterator_type, mpl::true_ > result_type;
+
+ template <typename Terminal>
+ result_type operator()(
+ Terminal const& term, Subject const& subject, unused_type) const
+ {
+ typename spirit::detail::get_encoding<Modifiers,
+ spirit::char_encoding::standard>::type encoding;
+
+ return result_type(subject
+ , fusion::at_c<0>(term.args)
+ , fusion::at_c<1>(term.args)
+ );
+ }
+ };
+
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ template <typename Subject, typename KeywordType
+ , typename LoopIter, typename NoCase >
+ struct has_semantic_action<
+ repository::qi::kwd_parser< Subject, KeywordType, LoopIter, NoCase > >
+ : unary_has_semantic_action<Subject> {};
+}}}
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/directive/seek.hpp b/boost/spirit/repository/home/qi/directive/seek.hpp
new file mode 100644
index 0000000000..951a337cbe
--- /dev/null
+++ b/boost/spirit/repository/home/qi/directive/seek.hpp
@@ -0,0 +1,134 @@
+/*//////////////////////////////////////////////////////////////////////////////
+ Copyright (c) 2011 Jamboree
+
+ Distributed under the 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_SPIRIT_REPOSITORY_QI_SEEK
+#define BOOST_SPIRIT_REPOSITORY_QI_SEEK
+
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/has_semantic_action.hpp>
+#include <boost/spirit/home/support/handles_container.hpp>
+#include <boost/spirit/repository/home/support/seek.hpp>
+
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables seek[...]
+ template <>
+ struct use_directive<qi::domain, repository::tag::seek>
+ : mpl::true_ {};
+}} // namespace boost::spirit
+
+
+namespace boost { namespace spirit { namespace repository {namespace qi
+{
+#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
+ using repository::seek;
+#endif
+ using repository::seek_type;
+
+ template <typename Subject>
+ struct seek_directive
+ : spirit::qi::unary_parser<seek_directive<Subject> >
+ {
+ typedef Subject subject_type;
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef typename
+ traits::attribute_of<subject_type, Context, Iterator>::type
+ type;
+ };
+
+ seek_directive(Subject const& subject)
+ : subject(subject)
+ {}
+
+ template
+ <
+ typename Iterator, typename Context
+ , typename Skipper, typename Attribute
+ >
+ bool parse
+ (
+ Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr
+ ) const
+ {
+ for (Iterator it(first); ; ++it)
+ {
+ if (subject.parse(it, last, context, skipper, attr))
+ {
+ first = it;
+ return true;
+ }
+ // fail only after subject fails & no input
+ if (it == last)
+ return false;
+ }
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ return info("seek", subject.what(context));
+ }
+
+ Subject subject;
+ };
+}}}} // namespace boost::spirit::repository::qi
+
+
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Modifiers>
+ struct make_directive<repository::tag::seek, Subject, Modifiers>
+ {
+ typedef repository::qi::seek_directive<Subject> result_type;
+
+ result_type operator()(unused_type, Subject const& subject, unused_type) const
+ {
+ return result_type(subject);
+ }
+ };
+}}} // namespace boost::spirit::qi
+
+
+namespace boost { namespace spirit { namespace traits
+{
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject>
+ struct has_semantic_action<repository::qi::seek_directive<Subject> >
+ : unary_has_semantic_action<Subject> {};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Subject, typename Attribute, typename Context
+ , typename Iterator>
+ struct handles_container<repository::qi::seek_directive<Subject>, Attribute
+ , Context, Iterator>
+ : unary_handles_container<Subject, Attribute, Context, Iterator> {};
+}}} // namespace boost::spirit::traits
+
+
+#endif
diff --git a/boost/spirit/repository/home/qi/nonterminal.hpp b/boost/spirit/repository/home/qi/nonterminal.hpp
new file mode 100644
index 0000000000..6b2dbb8fcb
--- /dev/null
+++ b/boost/spirit/repository/home/qi/nonterminal.hpp
@@ -0,0 +1,18 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2009 Francois Barel
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_QI_NONTERMINAL_AUG_12_2009_1140AM)
+#define SPIRIT_REPOSITORY_QI_NONTERMINAL_AUG_12_2009_1140AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/nonterminal/subrule.hpp>
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/nonterminal/subrule.hpp b/boost/spirit/repository/home/qi/nonterminal/subrule.hpp
new file mode 100644
index 0000000000..a2db38496b
--- /dev/null
+++ b/boost/spirit/repository/home/qi/nonterminal/subrule.hpp
@@ -0,0 +1,586 @@
+/*=============================================================================
+ Copyright (c) 2009 Francois Barel
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_REPOSITORY_QI_SUBRULE_AUGUST_06_2009_0239AM)
+#define BOOST_SPIRIT_REPOSITORY_QI_SUBRULE_AUGUST_06_2009_0239AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/reference.hpp>
+#include <boost/spirit/home/qi/nonterminal/detail/parameterized.hpp>
+#include <boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp>
+#include <boost/spirit/home/support/argument.hpp>
+#include <boost/spirit/home/support/assert_msg.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/nonterminal/extract_param.hpp>
+#include <boost/spirit/home/support/nonterminal/locals.hpp>
+#include <boost/spirit/repository/home/support/subrule_context.hpp>
+
+#include <boost/fusion/include/as_map.hpp>
+#include <boost/fusion/include/at_key.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/fusion/include/front.hpp>
+#include <boost/fusion/include/has_key.hpp>
+#include <boost/fusion/include/join.hpp>
+#include <boost/fusion/include/make_map.hpp>
+#include <boost/fusion/include/make_vector.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // subrule_group:
+ // - parser representing a group of subrule definitions (one or more),
+ // invokes first subrule on entry,
+ // - also a Proto terminal, so that a group behaves like any Spirit
+ // expression.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Defs>
+ struct subrule_group
+ : proto::extends<
+ typename proto::terminal<
+ spirit::qi::reference<subrule_group<Defs> const>
+ >::type
+ , subrule_group<Defs>
+ >
+ , spirit::qi::parser<subrule_group<Defs> >
+ {
+ // Fusion associative sequence, associating each subrule ID in this
+ // group (as an MPL integral constant) with its definition
+ typedef Defs defs_type;
+
+ typedef subrule_group<Defs> this_type;
+ typedef spirit::qi::reference<this_type const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, this_type> base_type;
+
+ static size_t const params_size =
+ // Forward to first subrule.
+ remove_reference<
+ typename fusion::result_of::front<Defs>::type
+ >::type::second_type::params_size;
+
+ subrule_group(subrule_group const& rhs)
+ : base_type(terminal::make(reference_(*this)))
+ , defs(rhs.defs)
+ {
+ }
+
+ explicit subrule_group(Defs const& defs)
+ : base_type(terminal::make(reference_(*this)))
+ , defs(defs)
+ {
+ }
+
+ // from a subrule ID, get the type of a reference to its definition
+ template <int ID>
+ struct def_type
+ {
+ typedef mpl::int_<ID> id_type;
+
+ // If you are seeing a compilation error here, you are trying
+ // to use a subrule which was not defined in this group.
+ BOOST_SPIRIT_ASSERT_MSG(
+ (fusion::result_of::has_key<
+ defs_type const, id_type>::type::value)
+ , subrule_used_without_being_defined, (mpl::int_<ID>));
+
+ typedef typename
+ fusion::result_of::at_key<defs_type const, id_type>::type
+ type;
+ };
+
+ // from a subrule ID, get a reference to its definition
+ template <int ID>
+ typename def_type<ID>::type def() const
+ {
+ return fusion::at_key<mpl::int_<ID> >(defs);
+ }
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ // Forward to first subrule.
+ : mpl::identity<
+ typename remove_reference<
+ typename fusion::result_of::front<Defs>::type
+ >::type::second_type::attr_type> {};
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ // Forward to first subrule.
+ return parse_subrule(fusion::front(defs).second
+ , first, last, context, skipper, attr);
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute, typename Params>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr, Params const& params) const
+ {
+ // Forward to first subrule.
+ return parse_subrule(fusion::front(defs).second
+ , first, last, context, skipper, attr, params);
+ }
+
+ template <int ID, typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_subrule_id(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ return parse_subrule(def<ID>()
+ , first, last, context, skipper, attr);
+ }
+
+ template <int ID, typename Iterator, typename Context
+ , typename Skipper, typename Attribute, typename Params>
+ bool parse_subrule_id(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr, Params const& params) const
+ {
+ return parse_subrule(def<ID>()
+ , first, last, context, skipper, attr, params);
+ }
+
+ template <typename Def
+ , typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_subrule(Def const& def
+ , Iterator& first, Iterator const& last
+ , Context& /*caller_context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ // compute context type for this subrule
+ typedef typename Def::locals_type subrule_locals_type;
+ typedef typename Def::attr_type subrule_attr_type;
+ typedef typename Def::attr_reference_type subrule_attr_reference_type;
+ typedef typename Def::parameter_types subrule_parameter_types;
+
+ typedef
+ subrule_context<
+ this_type
+ , fusion::cons<
+ subrule_attr_reference_type, subrule_parameter_types>
+ , subrule_locals_type
+ >
+ context_type;
+
+ // prepare attribute
+ typedef traits::make_attribute<
+ subrule_attr_type, Attribute> make_attribute;
+
+ // do down-stream transformation, provides attribute for
+ // rhs parser
+ typedef traits::transform_attribute<
+ typename make_attribute::type, subrule_attr_type, spirit::qi::domain>
+ transform;
+
+ typename make_attribute::type made_attr = make_attribute::call(attr);
+ typename transform::type attr_ = transform::pre(made_attr);
+
+ // If you are seeing a compilation error here, you are probably
+ // trying to use a subrule which has inherited attributes,
+ // without passing values for them.
+ context_type context(*this, attr_);
+
+ if (def.binder(first, last, context, skipper))
+ {
+ // do up-stream transformation, this integrates the results
+ // back into the original attribute value, if appropriate
+ traits::post_transform(attr, attr_);
+ return true;
+ }
+
+ // inform attribute transformation of failed rhs
+ traits::fail_transform(attr, attr_);
+ return false;
+ }
+
+ template <typename Def
+ , typename Iterator, typename Context
+ , typename Skipper, typename Attribute, typename Params>
+ bool parse_subrule(Def const& def
+ , Iterator& first, Iterator const& last
+ , Context& caller_context, Skipper const& skipper
+ , Attribute& attr, Params const& params) const
+ {
+ // compute context type for this subrule
+ typedef typename Def::locals_type subrule_locals_type;
+ typedef typename Def::attr_type subrule_attr_type;
+ typedef typename Def::attr_reference_type subrule_attr_reference_type;
+ typedef typename Def::parameter_types subrule_parameter_types;
+
+ typedef
+ subrule_context<
+ this_type
+ , fusion::cons<
+ subrule_attr_reference_type, subrule_parameter_types>
+ , subrule_locals_type
+ >
+ context_type;
+
+ // prepare attribute
+ typedef traits::make_attribute<
+ subrule_attr_type, Attribute> make_attribute;
+
+ // do down-stream transformation, provides attribute for
+ // rhs parser
+ typedef traits::transform_attribute<
+ typename make_attribute::type, subrule_attr_type, spirit::qi::domain>
+ transform;
+
+ typename make_attribute::type made_attr = make_attribute::call(attr);
+ typename transform::type attr_ = transform::pre(made_attr);
+
+ // If you are seeing a compilation error here, you are probably
+ // trying to use a subrule which has inherited attributes,
+ // passing values of incompatible types for them.
+ context_type context(*this, attr_, params, caller_context);
+
+ if (def.binder(first, last, context, skipper))
+ {
+ // do up-stream transformation, this integrates the results
+ // back into the original attribute value, if appropriate
+ traits::post_transform(attr, attr_);
+ return true;
+ }
+
+ // inform attribute transformation of failed rhs
+ traits::fail_transform(attr, attr_);
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ // Forward to first subrule.
+ return fusion::front(defs).second.binder.p.what(context);
+ }
+
+ template <typename Defs2>
+ subrule_group<
+ typename fusion::result_of::as_map<
+ typename fusion::result_of::join<
+ Defs const, Defs2 const>::type>::type>
+ operator,(subrule_group<Defs2> const& other) const
+ {
+ typedef subrule_group<
+ typename fusion::result_of::as_map<
+ typename fusion::result_of::join<
+ Defs const, Defs2 const>::type>::type> result_type;
+ return result_type(fusion::as_map(fusion::join(defs, other.defs)));
+ }
+
+ // bring in the operator() overloads
+ this_type const& get_parameterized_subject() const { return *this; }
+ typedef this_type parameterized_subject_type;
+ #include <boost/spirit/home/qi/nonterminal/detail/fcall.hpp>
+
+ Defs defs;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // subrule_definition: holds one particular definition of a subrule
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ int ID_
+ , typename Locals
+ , typename Attr
+ , typename AttrRef
+ , typename Parameters
+ , size_t ParamsSize
+ , typename Subject
+ , bool Auto_
+ >
+ struct subrule_definition
+ {
+ typedef mpl::int_<ID_> id_type;
+ BOOST_STATIC_CONSTANT(int, ID = ID_);
+
+ typedef Locals locals_type;
+ typedef Attr attr_type;
+ typedef AttrRef attr_reference_type;
+ typedef Parameters parameter_types;
+ static size_t const params_size = ParamsSize;
+
+ typedef Subject subject_type;
+ typedef mpl::bool_<Auto_> auto_type;
+ BOOST_STATIC_CONSTANT(bool, Auto = Auto_);
+
+ typedef spirit::qi::detail::parser_binder<
+ Subject, auto_type> binder_type;
+
+ subrule_definition(Subject const& subject, std::string const& name)
+ : binder(subject), name(name)
+ {
+ }
+
+ binder_type const binder;
+ std::string const name;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // subrule placeholder:
+ // - on subrule definition: helper for creation of subrule_group,
+ // - on subrule invocation: Proto terminal and parser.
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ int ID_
+ , typename T1 = unused_type
+ , typename T2 = unused_type
+ >
+ struct subrule
+ : proto::extends<
+ typename proto::terminal<
+ spirit::qi::reference<subrule<ID_, T1, T2> const>
+ >::type
+ , subrule<ID_, T1, T2>
+ >
+ , spirit::qi::parser<subrule<ID_, T1, T2> >
+ {
+ typedef mpl::int_<ID_> id_type;
+ BOOST_STATIC_CONSTANT(int, ID = ID_);
+
+ typedef subrule<ID_, T1, T2> this_type;
+ typedef spirit::qi::reference<this_type const> reference_;
+ typedef typename proto::terminal<reference_>::type terminal;
+ typedef proto::extends<terminal, this_type> base_type;
+
+ typedef mpl::vector<T1, T2> template_params;
+
+ // locals_type is a sequence of types to be used as local variables
+ typedef typename
+ spirit::detail::extract_locals<template_params>::type
+ locals_type;
+
+ typedef typename
+ spirit::detail::extract_sig<template_params>::type
+ sig_type;
+
+ // This is the subrule's attribute type
+ typedef typename
+ spirit::detail::attr_from_sig<sig_type>::type
+ attr_type;
+ typedef typename add_reference<attr_type>::type attr_reference_type;
+
+ // parameter_types is a sequence of types passed as parameters to the subrule
+ typedef typename
+ spirit::detail::params_from_sig<sig_type>::type
+ parameter_types;
+
+ static size_t const params_size =
+ fusion::result_of::size<parameter_types>::type::value;
+
+ explicit subrule(std::string const& name_ = "unnamed-subrule")
+ : base_type(terminal::make(reference_(*this)))
+ , name_(name_)
+ {
+ }
+
+ // compute type of this subrule's definition for expr type Expr
+ template <typename Expr, bool Auto>
+ struct def_type_helper
+ {
+ // Report invalid expression error as early as possible.
+ // If you got an error_invalid_expression error message here,
+ // then the expression (Expr) is not a valid spirit qi expression.
+ BOOST_SPIRIT_ASSERT_MATCH(spirit::qi::domain, Expr);
+
+ typedef typename result_of::compile<
+ spirit::qi::domain, Expr>::type subject_type;
+
+ typedef subrule_definition<
+ ID_
+ , locals_type
+ , attr_type
+ , attr_reference_type
+ , parameter_types
+ , params_size
+ , subject_type
+ , Auto
+ > const type;
+ };
+
+ // compute type of subrule group containing only this
+ // subrule's definition for expr type Expr
+ template <typename Expr, bool Auto>
+ struct group_type_helper
+ {
+ typedef typename def_type_helper<Expr, Auto>::type def_type;
+
+ // create Defs map with only one entry: (ID -> def)
+ typedef typename
+ fusion::result_of::make_map<id_type, def_type>::type
+ defs_type;
+
+ typedef subrule_group<defs_type> type;
+ };
+
+ template <typename Expr>
+ typename group_type_helper<Expr, false>::type
+ operator=(Expr const& expr) const
+ {
+ typedef group_type_helper<Expr, false> helper;
+ typedef typename helper::def_type def_type;
+ typedef typename helper::type result_type;
+ return result_type(fusion::make_map<id_type>(
+ def_type(compile<spirit::qi::domain>(expr), name_)));
+ }
+
+ template <typename Expr>
+ friend typename group_type_helper<Expr, true>::type
+ operator%=(subrule const& sr, Expr const& expr)
+ {
+ typedef group_type_helper<Expr, true> helper;
+ typedef typename helper::def_type def_type;
+ typedef typename helper::type result_type;
+ return result_type(fusion::make_map<id_type>(
+ def_type(compile<spirit::qi::domain>(expr), sr.name_)));
+ }
+
+ // non-const versions needed to suppress proto's %= kicking in
+ template <typename Expr>
+ friend typename group_type_helper<Expr, true>::type
+ operator%=(subrule const& sr, Expr& expr)
+ {
+ return operator%=(
+ sr
+ , static_cast<Expr const&>(expr));
+ }
+ template <typename Expr>
+ friend typename group_type_helper<Expr, true>::type
+ operator%=(subrule& sr, Expr const& expr)
+ {
+ return operator%=(
+ static_cast<subrule const&>(sr)
+ , expr);
+ }
+ template <typename Expr>
+ friend typename group_type_helper<Expr, true>::type
+ operator%=(subrule& sr, Expr& expr)
+ {
+ return operator%=(
+ static_cast<subrule const&>(sr)
+ , static_cast<Expr const&>(expr));
+ }
+
+ std::string const& name() const
+ {
+ return name_;
+ }
+
+ void name(std::string const& str)
+ {
+ name_ = str;
+ }
+
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef attr_type type;
+ };
+
+ template <typename Iterator, typename Group
+ , typename Attributes, typename Locals
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , subrule_context<Group, Attributes, Locals>& context
+ , Skipper const& skipper, Attribute& attr) const
+ {
+ return context.group.template parse_subrule_id<ID_>(
+ first, last, context, skipper, attr);
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& /*first*/, Iterator const& /*last*/
+ , Context& /*context*/
+ , Skipper const& /*skipper*/, Attribute& /*attr*/) const
+ {
+ // If you are seeing a compilation error here, you are trying
+ // to use a subrule as a parser outside of a subrule group.
+ BOOST_SPIRIT_ASSERT_MSG(false
+ , subrule_used_outside_subrule_group, (id_type));
+
+ return false;
+ }
+
+ template <typename Iterator, typename Group
+ , typename Attributes, typename Locals
+ , typename Skipper, typename Attribute
+ , typename Params>
+ bool parse(Iterator& first, Iterator const& last
+ , subrule_context<Group, Attributes, Locals>& context
+ , Skipper const& skipper, Attribute& attr
+ , Params const& params) const
+ {
+ return context.group.template parse_subrule_id<ID_>(
+ first, last, context, skipper, attr, params);
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute
+ , typename Params>
+ bool parse(Iterator& /*first*/, Iterator const& /*last*/
+ , Context& /*context*/
+ , Skipper const& /*skipper*/, Attribute& /*attr*/
+ , Params const& /*params*/) const
+ {
+ // If you are seeing a compilation error here, you are trying
+ // to use a subrule as a parser outside of a subrule group.
+ BOOST_SPIRIT_ASSERT_MSG(false
+ , subrule_used_outside_subrule_group, (id_type));
+
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info(name_);
+ }
+
+ // bring in the operator() overloads
+ this_type const& get_parameterized_subject() const { return *this; }
+ typedef this_type parameterized_subject_type;
+ #include <boost/spirit/home/qi/nonterminal/detail/fcall.hpp>
+
+ std::string name_;
+ };
+}}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/boost/spirit/repository/home/qi/operator.hpp b/boost/spirit/repository/home/qi/operator.hpp
new file mode 100644
index 0000000000..2c3606d007
--- /dev/null
+++ b/boost/spirit/repository/home/qi/operator.hpp
@@ -0,0 +1,17 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+// Copyright (c) 2011 Thomas Bernard
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_QI_OPERATOR_OCT_20_2010_1258PM)
+#define SPIRIT_REPOSITORY_QI_OPERATOR_OCT_20_2010_1258PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/operator/keywords.hpp>
+#endif
+
diff --git a/boost/spirit/repository/home/qi/operator/detail/keywords.hpp b/boost/spirit/repository/home/qi/operator/detail/keywords.hpp
new file mode 100644
index 0000000000..81e17715df
--- /dev/null
+++ b/boost/spirit/repository/home/qi/operator/detail/keywords.hpp
@@ -0,0 +1,117 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2011 Thomas Bernard
+
+ Distributed under the 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(SPIRIT_KEYWORDS_DETAIL_MARCH_13_2007_1145PM)
+#define SPIRIT_KEYWORDS_DETAIL_MARCH_13_2007_1145PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+namespace boost { namespace spirit { namespace repository { namespace qi { namespace detail {
+
+ // This helper class enables jumping over intermediate directives
+ // down the kwd parser iteration count checking policy
+ struct register_successful_parse
+ {
+ template <typename Subject>
+ static bool call(Subject const &subject,bool &flag, int &counter)
+ {
+ return subject.iter.register_successful_parse(flag,counter);
+ }
+ template <typename Subject, typename Action>
+ static bool call(spirit::qi::action<Subject, Action> const &subject,bool &flag, int &counter)
+ {
+ return subject.subject.iter.register_successful_parse(flag,counter);
+ }
+ template <typename Subject>
+ static bool call(spirit::qi::hold_directive<Subject> const &subject,bool &flag, int &counter)
+ {
+ return subject.subject.iter.register_successful_parse(flag,counter);
+ }
+ };
+ // Variant visitor class which handles dispatching the parsing to the selected parser
+ // This also handles passing the correct attributes and flags/counters to the subject parsers
+
+ template < typename Elements, typename Iterator ,typename Context ,typename Skipper
+ ,typename Flags ,typename Counters ,typename Attribute, typename NoCasePass>
+ class parse_dispatcher
+ : public boost::static_visitor<bool>
+ {
+ typedef typename add_reference<Attribute>::type attr_reference;
+
+ public:
+ parse_dispatcher(const Elements &elements,Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Flags &flags, Counters &counters, attr_reference attr) :
+ elements(elements), first(first), last(last)
+ , context(context), skipper(skipper)
+ , flags(flags),counters(counters), attr(attr)
+ {}
+
+ template<typename T> bool operator()(T& idx) const
+ {
+ return call(idx,typename traits::not_is_unused<Attribute>::type());
+ }
+
+ template <typename Subject,typename Index>
+ bool call_subject_unused(
+ Subject const &subject, Iterator &first, Iterator const &last
+ , Context& context, Skipper const& skipper
+ , Index& idx ) const
+ {
+ Iterator save = first;
+ skipper_keyword_marker<Skipper,NoCasePass> marked_skipper(skipper,flags[Index::value],counters[Index::value]);
+
+ if(subject.parse(first,last,context,marked_skipper,unused))
+ {
+ return true;
+ }
+ save = save;
+ return false;
+ }
+
+
+ template <typename Subject,typename Index>
+ bool call_subject(
+ Subject const &subject, Iterator &first, Iterator const &last
+ , Context& context, Skipper const& skipper
+ , Index& idx ) const
+ {
+
+ Iterator save = first;
+ skipper_keyword_marker<Skipper,NoCasePass> marked_skipper(skipper,flags[Index::value],counters[Index::value]);
+ if(subject.parse(first,last,context,marked_skipper,fusion::at_c<Index::value>(attr)))
+ {
+ return true;
+ }
+ save = save;
+ return false;
+ }
+
+ // Handle unused attributes
+ template <typename T> bool call(T &idx, mpl::false_) const{
+ return call_subject_unused(fusion::at_c<T::value>(elements), first, last, context, skipper, idx );
+ }
+ // Handle normal attributes
+ template <typename T> bool call(T &idx, mpl::true_) const{
+ return call_subject(fusion::at_c<T::value>(elements), first, last, context, skipper, idx);
+ }
+
+ const Elements &elements;
+ Iterator &first;
+ const Iterator &last;
+ Context & context;
+ const Skipper &skipper;
+ Flags &flags;
+ Counters &counters;
+ attr_reference attr;
+ };
+
+}}}}}
+
+#endif
diff --git a/boost/spirit/repository/home/qi/operator/keywords.hpp b/boost/spirit/repository/home/qi/operator/keywords.hpp
new file mode 100644
index 0000000000..c32c55c7af
--- /dev/null
+++ b/boost/spirit/repository/home/qi/operator/keywords.hpp
@@ -0,0 +1,640 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2011 Thomas Bernard
+
+ Distributed under the 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(SPIRIT_KEYWORDS_OR_MARCH_13_2007_1145PM)
+#define SPIRIT_KEYWORDS_OR_MARCH_13_2007_1145PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/detail/permute_function.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/detail/what_function.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/fusion/include/iter_fold.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/value_at.hpp>
+#include <boost/optional.hpp>
+#include <boost/foreach.hpp>
+#include <boost/array.hpp>
+#include <boost/spirit/home/qi/string/symbols.hpp>
+#include <boost/spirit/home/qi/string/lit.hpp>
+#include <boost/spirit/home/qi/action/action.hpp>
+#include <boost/spirit/home/qi/directive/hold.hpp>
+#include <boost/mpl/count_if.hpp>
+#include <boost/mpl/range_c.hpp>
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/variant/static_visitor.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/spirit/repository/home/qi/operator/detail/keywords.hpp>
+
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <>
+ struct use_operator<qi::domain, proto::tag::divides > // enables /
+ : mpl::true_ {};
+
+ template <>
+ struct flatten_tree<qi::domain, proto::tag::divides> // flattens /
+ : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+
+ // kwd directive parser type identification
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(kwd_parser_id)
+
+
+ }
+
+ // kwd directive type query
+ template <typename T>
+ struct is_kwd_parser : detail::has_kwd_parser_id<T> {};
+
+ template <typename Subject, typename Action>
+ struct is_kwd_parser<spirit::qi::action<Subject,Action> > : detail::has_kwd_parser_id<Subject> {};
+
+ template <typename Subject>
+ struct is_kwd_parser<spirit::qi::hold_directive<Subject> > : detail::has_kwd_parser_id<Subject> {};
+
+ // Keywords operator
+ template <typename Elements, typename Modifiers>
+ struct keywords : spirit::qi::nary_parser<keywords<Elements,Modifiers> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ // Put all the element attributes in a tuple
+ typedef typename traits::build_attribute_sequence<
+ Elements, Context, traits::sequence_attribute_transform, Iterator, spirit::qi::domain >::type
+ all_attributes;
+
+ // Now, build a fusion vector over the attributes. Note
+ // that build_fusion_vector 1) removes all unused attributes
+ // and 2) may return unused_type if all elements have
+ // unused_type(s).
+ typedef typename
+ traits::build_fusion_vector<all_attributes>::type
+ type;
+ };
+
+ /// Make sure that all subjects are of the kwd type
+ typedef typename mpl::count_if<
+ Elements,
+ mpl::not_<
+ is_kwd_parser<
+ mpl::_1
+ >
+ >
+ > non_kwd_subject_count;
+
+ /// If the assertion fails here then you probably forgot to wrap a
+ /// subject of the / operator in a kwd directive
+ BOOST_MPL_ASSERT_RELATION( non_kwd_subject_count::value, ==, 0 );
+
+ ///////////////////////////////////////////////////////////////////////////
+ // build_parser_tags
+ //
+ // Builds a boost::variant from an mpl::range_c in order to "mark" every
+ // parser of the fusion sequence. The integer constant is used in the parser
+ // dispatcher functor in order to use the parser corresponding to the recognised
+ // keyword.
+ ///////////////////////////////////////////////////////////////////////////
+
+ template <typename Sequence>
+ struct build_parser_tags
+ {
+ // Get the sequence size
+ typedef typename mpl::size< Sequence >::type sequence_size;
+
+ // Create an integer_c constant for every parser in the sequence
+ typedef typename mpl::range_c<int, 0, sequence_size::value>::type int_range;
+
+ // Transform the range_c to an mpl vector in order to be able to transform it into a variant
+ typedef typename mpl::copy<int_range, mpl::back_inserter<mpl::vector<> > >::type int_vector;
+
+ // Build the variant type containing the indexes of the parsers
+ typedef typename
+ spirit::detail::as_variant<
+ int_vector >::type type;
+ };
+
+ // Create a variant type to be able to store parser indexes in the embedded symbols parser
+ typedef typename build_parser_tags< Elements >::type parser_index_type;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // build_char_type_sequence
+ //
+ // Build a fusion sequence from the kwd directive specified character type.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence >
+ struct build_char_type_sequence
+ {
+ struct element_char_type
+ {
+ template <typename T>
+ struct result;
+
+ template <typename F, typename Element>
+ struct result<F(Element)>
+ {
+ typedef typename Element::char_type type;
+
+ };
+ template <typename F, typename Element,typename Action>
+ struct result<F(spirit::qi::action<Element,Action>) >
+ {
+ typedef typename Element::char_type type;
+ };
+ template <typename F, typename Element>
+ struct result<F(spirit::qi::hold_directive<Element>)>
+ {
+ typedef typename Element::char_type type;
+ };
+
+ // never called, but needed for decltype-based result_of (C++0x)
+ template <typename Element>
+ typename result<element_char_type(Element)>::type
+ operator()(Element&) const;
+ };
+
+ // Compute the list of character types of the child kwd directives
+ typedef typename
+ fusion::result_of::transform<Sequence, element_char_type>::type
+ type;
+ };
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // get_keyword_char_type
+ //
+ // Collapses the character type comming from the subject kwd parsers and
+ // and checks that they are all identical (necessary in order to be able
+ // to build a tst parser to parse the keywords.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence>
+ struct get_keyword_char_type
+ {
+ // Make sure each of the types occur only once in the type list
+ typedef typename
+ mpl::fold<
+ Sequence, mpl::vector<>,
+ mpl::if_<
+ mpl::contains<mpl::_1, mpl::_2>,
+ mpl::_1, mpl::push_back<mpl::_1, mpl::_2>
+ >
+ >::type
+ no_duplicate_char_types;
+
+ // If the compiler traps here this means you mixed
+ // character type for the keywords specified in the
+ // kwd directive sequence.
+ BOOST_MPL_ASSERT_RELATION( mpl::size<no_duplicate_char_types>::value, ==, 1 );
+
+ typedef typename mpl::front<no_duplicate_char_types>::type type;
+
+ };
+
+ /// Get the character type for the tst parser
+ typedef typename build_char_type_sequence< Elements >::type char_types;
+ typedef typename get_keyword_char_type< char_types >::type char_type;
+
+ /// Our symbols container
+ typedef spirit::qi::tst< char_type, parser_index_type> keywords_type;
+
+ // Filter functor used for case insensitive parsing
+ template <typename CharEncoding>
+ struct no_case_filter
+ {
+ char_type operator()(char_type ch) const
+ {
+ return static_cast<char_type>(CharEncoding::tolower(ch));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // build_case_type_sequence
+ //
+ // Build a fusion sequence from the kwd/ikwd directives
+ // in order to determine if case sensitive and case insensitive
+ // keywords have been mixed.
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence >
+ struct build_case_type_sequence
+ {
+ struct element_case_type
+ {
+ template <typename T>
+ struct result;
+
+ template <typename F, typename Element>
+ struct result<F(Element)>
+ {
+ typedef typename Element::no_case_keyword type;
+
+ };
+ template <typename F, typename Element,typename Action>
+ struct result<F(spirit::qi::action<Element,Action>) >
+ {
+ typedef typename Element::no_case_keyword type;
+ };
+ template <typename F, typename Element>
+ struct result<F(spirit::qi::hold_directive<Element>)>
+ {
+ typedef typename Element::no_case_keyword type;
+ };
+
+ // never called, but needed for decltype-based result_of (C++0x)
+ template <typename Element>
+ typename result<element_case_type(Element)>::type
+ operator()(Element&) const;
+ };
+
+ // Compute the list of character types of the child kwd directives
+ typedef typename
+ fusion::result_of::transform<Sequence, element_case_type>::type
+ type;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // get_nb_case_types
+ //
+ // Counts the number of entries in the case type sequence matching the
+ // CaseType parameter (mpl::true_ -> case insensitve
+ // , mpl::false_ -> case sensitive
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Sequence,typename CaseType>
+ struct get_nb_case_types
+ {
+ // Make sure each of the types occur only once in the type list
+ typedef typename
+ mpl::count_if<
+ Sequence, mpl::equal_to<mpl::_,CaseType>
+ >::type type;
+
+
+ };
+ // Build the case type sequence
+ typedef typename build_case_type_sequence<Elements>::type case_type_sequence;
+ // Count the number of case sensitive entries and case insensitve entries
+ typedef typename get_nb_case_types<case_type_sequence,mpl::true_>::type ikwd_count;
+ typedef typename get_nb_case_types<case_type_sequence,mpl::false_>::type kwd_count;
+ // Get the size of the original sequence
+ typedef typename mpl::size<Elements>::type nb_elements;
+ // Determine if all the kwd directive are case sensitive/insensitive
+ typedef typename mpl::equal_to< ikwd_count, nb_elements>::type all_ikwd;
+ typedef typename mpl::equal_to< kwd_count, nb_elements>::type all_kwd;
+
+ typedef typename mpl::or_< all_kwd, all_ikwd >::type all_directives_of_same_type;
+
+ // Do we have a no case modifier
+ typedef has_modifier<Modifiers, spirit::tag::char_code_base<spirit::tag::no_case> > no_case_modifier;
+
+ // Should the no_case filter always be used ?
+ typedef typename mpl::or_<
+ no_case_modifier,
+ mpl::and_<
+ all_directives_of_same_type
+ ,all_ikwd
+ >
+ >::type
+ no_case;
+
+ typedef no_case_filter<
+ typename spirit::detail::get_encoding_with_case<
+ Modifiers
+ , char_encoding::standard
+ , no_case::value>::type>
+ nc_filter;
+ // Determine the standard case filter type
+ typedef typename mpl::if_<
+ no_case
+ , nc_filter
+ , spirit::qi::tst_pass_through >::type
+ filter_type;
+
+
+ // build a bool array and an integer array which will be used to
+ // check that the repetition constraints of the kwd parsers are
+ // met and bail out a soon as possible
+ typedef boost::array<bool, fusion::result_of::size<Elements>::value> flags_type;
+ typedef boost::array<int, fusion::result_of::size<Elements>::value> counters_type;
+
+
+
+ // Functor which adds all the keywords/subject parser indexes
+ // collected from the subject kwd directives to the keyword tst parser
+ template< typename Sequence >
+ struct keyword_entry_adder
+ {
+ typedef int result_type;
+
+ keyword_entry_adder(shared_ptr<keywords_type> lookup,flags_type &flags) :
+ lookup(lookup)
+ ,flags(flags)
+ {}
+
+ typedef typename fusion::result_of::begin< Sequence >::type sequence_begin;
+
+ template <typename T>
+ int operator()(const int i, const T &parser) const
+ {
+ // Determine the current position being handled
+ typedef typename fusion::result_of::distance< sequence_begin, T >::type position_raw;
+ // Transform the position to a parser index tag
+ typedef typename mpl::integral_c<int,position_raw::value> position;
+
+ return call(i,fusion::deref(parser),position());
+ }
+
+ template <typename T, typename Position, typename Action>
+ int call( const int i, const spirit::qi::action<T,Action> &parser, const Position position ) const
+ {
+
+ // Make the keyword/parse index entry in the tst parser
+ lookup->add(
+ traits::get_begin<char_type>(parser.subject.keyword.str),
+ traits::get_end<char_type>(parser.subject.keyword.str),
+ position
+ );
+ // Get the initial state of the flags array and store it in the flags initializer
+ flags[Position::value]=parser.subject.iter.flag_init();
+ return 0;
+ }
+
+ template <typename T, typename Position>
+ int call( const int i, const T & parser, const Position position) const
+ {
+ // Make the keyword/parse index entry in the tst parser
+ lookup->add(
+ traits::get_begin<char_type>(parser.keyword.str),
+ traits::get_end<char_type>(parser.keyword.str),
+ position
+ );
+ // Get the initial state of the flags array and store it in the flags initializer
+ flags[Position::value]=parser.iter.flag_init();
+ return 0;
+ }
+
+ template <typename T, typename Position>
+ int call( const int i, const spirit::qi::hold_directive<T> & parser, const Position position) const
+ {
+ // Make the keyword/parse index entry in the tst parser
+ lookup->add(
+ traits::get_begin<char_type>(parser.subject.keyword.str),
+ traits::get_end<char_type>(parser.subject.keyword.str),
+ position
+ );
+ // Get the initial state of the flags array and store it in the flags initializer
+ flags[Position::value]=parser.subject.iter.flag_init();
+ return 0;
+ }
+
+
+ shared_ptr<keywords_type> lookup;
+ flags_type & flags;
+ };
+
+
+ keywords(Elements const& elements) :
+ elements(elements)
+ , lookup(new keywords_type())
+ {
+ // Loop through all the subject parsers to build the keyword parser symbol parser
+ keyword_entry_adder<Elements> f1(lookup,flags_init);
+ fusion::iter_fold(this->elements,0,f1);
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr_) const
+ {
+ // Select which parse function to call
+ // We need to handle the case where kwd / ikwd directives have been mixed
+ // This is where we decide which function should be called.
+ return parse_impl(first, last, context, skipper, attr_,
+ typename mpl::or_<all_directives_of_same_type, no_case>::type()
+ );
+ }
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_impl(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr_,mpl::true_ /* no ikwd */) const
+ {
+
+ // wrap the attribute in a tuple if it is not a tuple
+ typename traits::wrap_if_not_tuple<Attribute>::type attr(attr_);
+
+ flags_type flags(flags_init);
+ //flags.assign(false);
+
+ counters_type counters;
+ counters.assign(0);
+
+ typedef repository::qi::detail::parse_dispatcher<Elements,Iterator, Context, Skipper
+ , flags_type, counters_type
+ , typename traits::wrap_if_not_tuple<Attribute>::type
+ , mpl::false_ > parser_visitor_type;
+ parser_visitor_type parse_visitor(elements, first, last
+ , context, skipper, flags
+ , counters, attr);
+
+ // We have a bool array 'flags' with one flag for each parser as well as a 'counter'
+ // array.
+ // The kwd directive sets and increments the counter when a successeful parse occured
+ // as well as the slot of the corresponding parser to true in the flags array as soon
+ // the minimum repetition requirement is met and keeps that value to true as long as
+ // the maximum repetition requirement is met.
+ // The parsing takes place here in two steps:
+ // 1) parse a keyword and fetch the parser index associated with that keyword
+ // 2) call the associated parser and store the parsed value in the matching attribute.
+ Iterator save = first;
+ while(true)
+ {
+
+ spirit::qi::skip_over(first, last, skipper);
+ if (parser_index_type* val_ptr
+ = lookup->find(first, last, filter_type()))
+ {
+ spirit::qi::skip_over(first, last, skipper);
+ if(!apply_visitor(parse_visitor,*val_ptr)){
+ first = save;
+ return false;
+ }
+ save = first;
+ }
+ else
+ {
+ // Check that we are leaving the keywords parser in a successfull state
+ BOOST_FOREACH(bool &valid,flags)
+ {
+ if(!valid)
+ {
+ first = save;
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Handle the mixed kwd and ikwd case
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse_impl(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr_,mpl::false_) const
+ {
+
+ // wrap the attribute in a tuple if it is not a tuple
+ typename traits::wrap_if_not_tuple<Attribute>::type attr(attr_);
+
+ flags_type flags(flags_init);
+ //flags.assign(false);
+
+ counters_type counters;
+ counters.assign(0);
+
+ typedef detail::parse_dispatcher<Elements, Iterator, Context, Skipper
+ , flags_type, counters_type
+ , typename traits::wrap_if_not_tuple<Attribute>::type
+ , mpl::false_> parser_visitor_type;
+
+ typedef detail::parse_dispatcher<Elements, Iterator, Context, Skipper
+ , flags_type, counters_type
+ , typename traits::wrap_if_not_tuple<Attribute>::type
+ , mpl::true_> no_case_parser_visitor_type;
+
+
+ parser_visitor_type parse_visitor(elements,first,last
+ ,context,skipper,flags,counters,attr);
+ no_case_parser_visitor_type no_case_parse_visitor(elements,first,last
+ ,context,skipper,flags,counters,attr);
+
+ // We have a bool array 'flags' with one flag for each parser as well as a 'counter'
+ // array.
+ // The kwd directive sets and increments the counter when a successeful parse occured
+ // as well as the slot of the corresponding parser to true in the flags array as soon
+ // the minimum repetition requirement is met and keeps that value to true as long as
+ // the maximum repetition requirement is met.
+ // The parsing takes place here in two steps:
+ // 1) parse a keyword and fetch the parser index associated with that keyword
+ // 2) call the associated parser and store the parsed value in the matching attribute.
+ Iterator save = first;
+ while(true)
+ {
+ spirit::qi::skip_over(first, last, skipper);
+ // First pass case sensitive
+ Iterator saved_first = first;
+ if (parser_index_type* val_ptr
+ = lookup->find(first, last, spirit::qi::tst_pass_through()))
+ {
+ spirit::qi::skip_over(first, last, skipper);
+ if(!apply_visitor(parse_visitor,*val_ptr)){
+ first = save;
+ return false;
+ }
+ save = first;
+ }
+ // Second pass case insensitive
+ else if(parser_index_type* val_ptr
+ = lookup->find(saved_first,last,nc_filter()))
+ {
+ first = saved_first;
+ spirit::qi::skip_over(first, last, skipper);
+ if(!apply_visitor(no_case_parse_visitor,*val_ptr)){
+ first = save;
+ return false;
+ }
+ save = first;
+ }
+ else
+ {
+ // Check that we are leaving the keywords parser in a successfull state
+ BOOST_FOREACH(bool &valid,flags)
+ {
+ if(!valid)
+ {
+ first = save;
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& context) const
+ {
+ info result("keywords");
+ fusion::for_each(elements,
+ spirit::detail::what_function<Context>(result, context));
+ return result;
+ }
+ flags_type flags_init;
+ Elements elements;
+ shared_ptr<keywords_type> lookup;
+
+ };
+}}}}
+
+namespace boost { namespace spirit { namespace qi {
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Elements, typename Modifiers >
+ struct make_composite<proto::tag::divides, Elements, Modifiers >
+ {
+ typedef repository::qi::keywords<Elements,Modifiers> result_type;
+ result_type operator()(Elements ref, unused_type) const
+ {
+ return result_type(ref);
+ }
+ };
+
+
+}}}
+
+namespace boost { namespace spirit { namespace traits
+{
+ // We specialize this for keywords (see support/attributes.hpp).
+ // For keywords, we only wrap the attribute in a tuple IFF
+ // it is not already a fusion tuple.
+ template <typename Elements, typename Modifiers,typename Attribute>
+ struct pass_attribute<repository::qi::keywords<Elements,Modifiers>, Attribute>
+ : wrap_if_not_tuple<Attribute> {};
+
+ template <typename Elements, typename Modifiers>
+ struct has_semantic_action<repository::qi::keywords<Elements, Modifiers> >
+ : nary_has_semantic_action<Elements> {};
+}}}
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/primitive.hpp b/boost/spirit/repository/home/qi/primitive.hpp
new file mode 100644
index 0000000000..400e6d9626
--- /dev/null
+++ b/boost/spirit/repository/home/qi/primitive.hpp
@@ -0,0 +1,19 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2001-2011 Joel de Guzman
+//
+// Distributed under the 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(SPIRIT_REPOSITORY_QI_PRIMITIVE_APR_28_2009_1258PM)
+#define SPIRIT_REPOSITORY_QI_PRIMITIVE_APR_28_2009_1258PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/primitive/advance.hpp>
+#include <boost/spirit/repository/home/qi/primitive/flush_multi_pass.hpp>
+#include <boost/spirit/repository/home/qi/primitive/iter_pos.hpp>
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/primitive/advance.hpp b/boost/spirit/repository/home/qi/primitive/advance.hpp
new file mode 100644
index 0000000000..11a74bbb13
--- /dev/null
+++ b/boost/spirit/repository/home/qi/primitive/advance.hpp
@@ -0,0 +1,130 @@
+// Copyright (c) 2011 Aaron Graham
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_QI_ADVANCE_JAN_23_2011_1203PM)
+#define BOOST_SPIRIT_REPOSITORY_QI_ADVANCE_JAN_23_2011_1203PM
+
+#include <boost/spirit/include/qi_parse.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// definition the place holder
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+ BOOST_SPIRIT_TERMINAL_EX(advance);
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// implementation the enabler
+namespace boost { namespace spirit
+{
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<repository::qi::tag::advance, fusion::vector1<A0> > >
+ : mpl::or_<is_integral<A0>, is_enum<A0> >
+ {};
+
+ template <>
+ struct use_lazy_terminal<qi::domain, repository::qi::tag::advance, 1>
+ : mpl::true_
+ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+// implementation of the parser
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+ template <typename Int>
+ struct advance_parser
+ : boost::spirit::qi::primitive_parser< advance_parser<Int> >
+ {
+ // Define the attribute type exposed by this parser component
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef boost::spirit::unused_type type;
+ };
+
+ advance_parser(Int dist)
+ : dist(dist)
+ {}
+
+ // This function is called during the actual parsing process
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context&, Skipper&, Attribute&) const
+ {
+ // This series of checks is designed to fail parsing on negative
+ // values, without generating a "expression always evaluates true"
+ // warning on unsigned types.
+ if (dist == Int(0)) return true;
+ if (dist < Int(1)) return false;
+
+ typedef typename std::iterator_traits<Iterator>::iterator_category
+ iterator_category;
+ return advance(first, last, iterator_category());
+ }
+
+ // This function is called during error handling to create
+ // a human readable string for the error context.
+ template <typename Context>
+ boost::spirit::info what(Context&) const
+ {
+ return boost::spirit::info("advance");
+ }
+
+ private:
+ // this is the general implementation used by most iterator categories
+ template <typename Iterator, typename IteratorCategory>
+ bool advance(Iterator& first, Iterator const& last
+ , IteratorCategory) const
+ {
+ Int n = dist;
+ Iterator i = first;
+ while (n)
+ {
+ if (i == last) return false;
+ ++i;
+ --n;
+ }
+ first = i;
+ return true;
+ }
+
+ // this is a specialization for random access iterators
+ template <typename Iterator>
+ bool advance(Iterator& first, Iterator const& last
+ , std::random_access_iterator_tag) const
+ {
+ Iterator const it = first + dist;
+ if (it > last) return false;
+ first = it;
+ return true;
+ }
+
+ Int const dist;
+ };
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// instantiation of the parser
+namespace boost { namespace spirit { namespace qi
+{
+ template <typename Modifiers, typename A0>
+ struct make_primitive<
+ terminal_ex<repository::qi::tag::advance, fusion::vector1<A0> >
+ , Modifiers>
+ {
+ typedef repository::qi::advance_parser<A0> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/repository/home/qi/primitive/flush_multi_pass.hpp b/boost/spirit/repository/home/qi/primitive/flush_multi_pass.hpp
new file mode 100644
index 0000000000..cd4ab0c0ca
--- /dev/null
+++ b/boost/spirit/repository/home/qi/primitive/flush_multi_pass.hpp
@@ -0,0 +1,92 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_QI_FLUSH_MULTI_PASS_JUL_10_2009_0535PM)
+#define BOOST_SPIRIT_REPOSITORY_QI_FLUSH_MULTI_PASS_JUL_10_2009_0535PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/multi_pass.hpp>
+
+#include <boost/spirit/repository/home/support/flush_multi_pass.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables flush_multi_pass
+ template <>
+ struct use_terminal<qi::domain, repository::tag::flush_multi_pass>
+ : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+ using repository::flush_multi_pass_type;
+ using repository::flush_multi_pass;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // for a flush_multi_pass_parser generated parser
+ struct flush_multi_pass_parser
+ : spirit::qi::primitive_parser<flush_multi_pass_parser>
+ {
+ template <typename Context, typename Unused>
+ struct attribute
+ {
+ typedef unused_type type;
+ };
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& context, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ spirit::traits::clear_queue(first, traits::clear_mode::clear_always);
+ return true;
+ }
+
+ template <typename Context>
+ info what(Context const& ctx) const
+ {
+ return info("flush_multi_pass");
+ }
+ };
+
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers>
+ struct make_primitive<repository::tag::flush_multi_pass, Modifiers>
+ {
+ typedef repository::qi::flush_multi_pass_parser result_type;
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+
+}}}
+
+#endif
+
diff --git a/boost/spirit/repository/home/qi/primitive/iter_pos.hpp b/boost/spirit/repository/home/qi/primitive/iter_pos.hpp
new file mode 100644
index 0000000000..6925ac2241
--- /dev/null
+++ b/boost/spirit/repository/home/qi/primitive/iter_pos.hpp
@@ -0,0 +1,83 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_QI_ITER_POS_NOV_20_2009_1245PM)
+#define BOOST_SPIRIT_REPOSITORY_QI_ITER_POS_NOV_20_2009_1245PM
+
+#include <boost/spirit/include/qi_parse.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// definition the place holder
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+ BOOST_SPIRIT_TERMINAL(iter_pos);
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// implementation the enabler
+namespace boost { namespace spirit
+{
+ // We want custom_parser::iter_pos to be usable as a terminal only,
+ // and only for parser expressions (qi::domain).
+ template <>
+ struct use_terminal<qi::domain, repository::qi::tag::iter_pos>
+ : mpl::true_
+ {};
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+// implementation of the parser
+namespace boost { namespace spirit { namespace repository { namespace qi
+{
+ struct iter_pos_parser
+ : boost::spirit::qi::primitive_parser<iter_pos_parser>
+ {
+ // Define the attribute type exposed by this parser component
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef Iterator type;
+ };
+
+ // This function is called during the actual parsing process
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context&, Skipper const& skipper, Attribute& attr) const
+ {
+ boost::spirit::qi::skip_over(first, last, skipper);
+ boost::spirit::traits::assign_to(first, attr);
+ return true;
+ }
+
+ // This function is called during error handling to create
+ // a human readable string for the error context.
+ template <typename Context>
+ boost::spirit::info what(Context&) const
+ {
+ return boost::spirit::info("iter_pos");
+ }
+ };
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// instantiation of the parser
+namespace boost { namespace spirit { namespace qi
+{
+ // This is the factory function object invoked in order to create
+ // an instance of our iter_pos_parser.
+ template <typename Modifiers>
+ struct make_primitive<repository::qi::tag::iter_pos, Modifiers>
+ {
+ typedef repository::qi::iter_pos_parser result_type;
+
+ result_type operator()(unused_type, unused_type) const
+ {
+ return result_type();
+ }
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/repository/home/support/confix.hpp b/boost/spirit/repository/home/support/confix.hpp
new file mode 100644
index 0000000000..ac9512773a
--- /dev/null
+++ b/boost/spirit/repository/home/support/confix.hpp
@@ -0,0 +1,22 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_SUPPORT_CONFIX_APR_28_2009_0110PM)
+#define BOOST_SPIRIT_REPOSITORY_SUPPORT_CONFIX_APR_28_2009_0110PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/terminal.hpp>
+
+namespace boost { namespace spirit { namespace repository
+{
+ // The confix extended terminal
+ BOOST_SPIRIT_DEFINE_TERMINALS_NAME_EX(( confix, confix_type ))
+
+}}}
+
+#endif
diff --git a/boost/spirit/repository/home/support/distinct.hpp b/boost/spirit/repository/home/support/distinct.hpp
new file mode 100644
index 0000000000..eb1df5adf8
--- /dev/null
+++ b/boost/spirit/repository/home/support/distinct.hpp
@@ -0,0 +1,22 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_SUPPORT_DISTINCT_APR_28_2009_0110PM)
+#define BOOST_SPIRIT_REPOSITORY_SUPPORT_DISTINCT_APR_28_2009_0110PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/terminal.hpp>
+
+namespace boost { namespace spirit { namespace repository
+{
+ // The distinct extended terminal
+ BOOST_SPIRIT_DEFINE_TERMINALS_NAME_EX(( distinct, distinct_type ))
+
+}}}
+
+#endif
diff --git a/boost/spirit/repository/home/support/flush_multi_pass.hpp b/boost/spirit/repository/home/support/flush_multi_pass.hpp
new file mode 100644
index 0000000000..94ef356af9
--- /dev/null
+++ b/boost/spirit/repository/home/support/flush_multi_pass.hpp
@@ -0,0 +1,22 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_SUPPORT_FLUSH_MULTI_PASS_JUL_11_2009_0823PM)
+#define BOOST_SPIRIT_REPOSITORY_SUPPORT_FLUSH_MULTI_PASS_JUL_11_2009_0823PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/terminal.hpp>
+
+namespace boost { namespace spirit { namespace repository
+{
+ // The flush_multi_pass extended terminal
+ BOOST_SPIRIT_TERMINAL( flush_multi_pass )
+
+}}}
+
+#endif
diff --git a/boost/spirit/repository/home/support/kwd.hpp b/boost/spirit/repository/home/support/kwd.hpp
new file mode 100644
index 0000000000..efe756d3e0
--- /dev/null
+++ b/boost/spirit/repository/home/support/kwd.hpp
@@ -0,0 +1,22 @@
+// Copyright (c) 2001-2011 Thomas Bernard
+//
+// Distributed under the 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_SPIRIT_REPOSITORY_SUPPORT_KWD_OCT_20_2010_0110PM)
+#define BOOST_SPIRIT_REPOSITORY_SUPPORT_KWD_OCT_20_2010_0110PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/terminal.hpp>
+
+namespace boost { namespace spirit { namespace repository
+{
+ // The distinct extended terminal
+ BOOST_SPIRIT_DEFINE_TERMINALS_NAME_EX(( kwd, kwd_type )( ikwd, ikwd_type ) )
+
+}}}
+
+#endif
diff --git a/boost/spirit/repository/home/support/seek.hpp b/boost/spirit/repository/home/support/seek.hpp
new file mode 100644
index 0000000000..bb9e04e1b7
--- /dev/null
+++ b/boost/spirit/repository/home/support/seek.hpp
@@ -0,0 +1,25 @@
+/*//////////////////////////////////////////////////////////////////////////////
+ Copyright (c) 2011 Jamboree
+
+ Distributed under the 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_SPIRIT_REPOSITORY_SUPPORT_SEEK
+#define BOOST_SPIRIT_REPOSITORY_SUPPORT_SEEK
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+
+#include <boost/spirit/home/support/terminal.hpp>
+
+
+namespace boost { namespace spirit { namespace repository
+{
+ // The seek terminal
+ BOOST_SPIRIT_DEFINE_TERMINALS_NAME(( seek, seek_type ))
+
+}}}
+
+#endif
diff --git a/boost/spirit/repository/home/support/subrule_context.hpp b/boost/spirit/repository/home/support/subrule_context.hpp
new file mode 100644
index 0000000000..e83d8b61e6
--- /dev/null
+++ b/boost/spirit/repository/home/support/subrule_context.hpp
@@ -0,0 +1,57 @@
+/*=============================================================================
+ Copyright (c) 2009 Francois Barel
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under the 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_SPIRIT_REPOSITORY_SUPPORT_SUBRULE_CONTEXT_AUGUST_12_2009_0539PM)
+#define BOOST_SPIRIT_REPOSITORY_SUPPORT_SUBRULE_CONTEXT_AUGUST_12_2009_0539PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/context.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace repository
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // subrule_context: special context used with subrules, to pass around
+ // the current set of subrule definitions (subrule_group)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Group, typename Attributes, typename Locals>
+ struct subrule_context
+ : context<Attributes, Locals>
+ {
+ typedef context<Attributes, Locals> base_type;
+ typedef Group group_type;
+
+ subrule_context(
+ Group const& group
+ , typename Attributes::car_type attribute
+ ) : base_type(attribute), group(group)
+ {
+ }
+
+ template <typename Args, typename Context>
+ subrule_context(
+ Group const& group
+ , typename Attributes::car_type attribute
+ , Args const& args
+ , Context& caller_context
+ ) : base_type(attribute, args, caller_context), group(group)
+ {
+ }
+
+ subrule_context(Group const& group, Attributes const& attributes)
+ : base_type(attributes), group(group)
+ {
+ }
+
+ Group const& group;
+ };
+}}}
+
+#endif
diff --git a/boost/spirit/repository/include/karma.hpp b/boost/spirit/repository/include/karma.hpp
new file mode 100644
index 0000000000..29b626fea7
--- /dev/null
+++ b/boost/spirit/repository/include/karma.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_REPOSITORY
+#define BOOST_SPIRIT_INCLUDE_KARMA_REPOSITORY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/karma.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/karma_confix.hpp b/boost/spirit/repository/include/karma_confix.hpp
new file mode 100644
index 0000000000..1f4b577450
--- /dev/null
+++ b/boost/spirit/repository/include/karma_confix.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_KARMA_REPOSITORY_CONFIX
+#define BOOST_SPIRIT_INCLUDE_KARMA_REPOSITORY_CONFIX
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/karma/directive/confix.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/karma_directive.hpp b/boost/spirit/repository/include/karma_directive.hpp
new file mode 100644
index 0000000000..f77f18a1a1
--- /dev/null
+++ b/boost/spirit/repository/include/karma_directive.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_REPOSITORY_KARMA_DIRECTIVE
+#define BOOST_SPIRIT_INCLUDE_REPOSITORY_KARMA_DIRECTIVE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/karma/directive.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/karma_nonterminal.hpp b/boost/spirit/repository/include/karma_nonterminal.hpp
new file mode 100644
index 0000000000..778dd574cc
--- /dev/null
+++ b/boost/spirit/repository/include/karma_nonterminal.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2009 Francois Barel
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_REPOSITORY_INCLUDE_KARMA_NONTERMINAL
+#define BOOST_SPIRIT_REPOSITORY_INCLUDE_KARMA_NONTERMINAL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/karma/nonterminal.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/karma_subrule.hpp b/boost/spirit/repository/include/karma_subrule.hpp
new file mode 100644
index 0000000000..54ef3aa2d4
--- /dev/null
+++ b/boost/spirit/repository/include/karma_subrule.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2009 Francois Barel
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_REPOSITORY_INCLUDE_KARMA_SUBRULE
+#define BOOST_SPIRIT_REPOSITORY_INCLUDE_KARMA_SUBRULE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/karma/nonterminal/subrule.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi.hpp b/boost/spirit/repository/include/qi.hpp
new file mode 100644
index 0000000000..be2fa32a65
--- /dev/null
+++ b/boost/spirit/repository/include/qi.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_REPOSITORY
+#define BOOST_SPIRIT_INCLUDE_QI_REPOSITORY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_advance.hpp b/boost/spirit/repository/include/qi_advance.hpp
new file mode 100644
index 0000000000..fafd8c0786
--- /dev/null
+++ b/boost/spirit/repository/include/qi_advance.hpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2011 Aaron Graham
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_REPOSITORY_ADVANCE
+#define BOOST_SPIRIT_INCLUDE_QI_REPOSITORY_ADVANCE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/primitive/advance.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_confix.hpp b/boost/spirit/repository/include/qi_confix.hpp
new file mode 100644
index 0000000000..d71d4e2484
--- /dev/null
+++ b/boost/spirit/repository/include/qi_confix.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_REPOSITORY_INCLUDE_QI_CONFIX
+#define BOOST_SPIRIT_REPOSITORY_INCLUDE_QI_CONFIX
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/directive/confix.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_directive.hpp b/boost/spirit/repository/include/qi_directive.hpp
new file mode 100644
index 0000000000..fcc0816ab0
--- /dev/null
+++ b/boost/spirit/repository/include/qi_directive.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_REPOSITORY_QI_DIRECTIVE
+#define BOOST_SPIRIT_INCLUDE_REPOSITORY_QI_DIRECTIVE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/directive.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_distinct.hpp b/boost/spirit/repository/include/qi_distinct.hpp
new file mode 100644
index 0000000000..57add2f8de
--- /dev/null
+++ b/boost/spirit/repository/include/qi_distinct.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_REPOSITORY_DISTINCT
+#define BOOST_SPIRIT_INCLUDE_QI_REPOSITORY_DISTINCT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/directive/distinct.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_flush_multi_pass.hpp b/boost/spirit/repository/include/qi_flush_multi_pass.hpp
new file mode 100644
index 0000000000..c612dd0c21
--- /dev/null
+++ b/boost/spirit/repository/include/qi_flush_multi_pass.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_REPOSITORY_FLUSH_MULTI_PASS
+#define BOOST_SPIRIT_INCLUDE_QI_REPOSITORY_FLUSH_MULTI_PASS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/primitive/flush_multi_pass.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_iter_pos.hpp b/boost/spirit/repository/include/qi_iter_pos.hpp
new file mode 100644
index 0000000000..48fb8d3ddc
--- /dev/null
+++ b/boost/spirit/repository/include/qi_iter_pos.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_REPOSITORY_ITER_POS
+#define BOOST_SPIRIT_INCLUDE_QI_REPOSITORY_ITER_POS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/primitive/iter_pos.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_keywords.hpp b/boost/spirit/repository/include/qi_keywords.hpp
new file mode 100644
index 0000000000..a82cd1aab2
--- /dev/null
+++ b/boost/spirit/repository/include/qi_keywords.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Thomas Bernard
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_KEYWORDS
+#define BOOST_SPIRIT_INCLUDE_QI_KEYWORDS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/operator/keywords.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_kwd.hpp b/boost/spirit/repository/include/qi_kwd.hpp
new file mode 100644
index 0000000000..0efcecb15e
--- /dev/null
+++ b/boost/spirit/repository/include/qi_kwd.hpp
@@ -0,0 +1,38 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Thomas Bernard
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_KWD
+#define BOOST_SPIRIT_INCLUDE_QI_KWD
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/directive/kwd.hpp>
+
+#endif
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2011 Thomas Bernard
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_KWD
+#define BOOST_SPIRIT_INCLUDE_QI_KWD
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/directive/kwd.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_nonterminal.hpp b/boost/spirit/repository/include/qi_nonterminal.hpp
new file mode 100644
index 0000000000..a85ea9f2df
--- /dev/null
+++ b/boost/spirit/repository/include/qi_nonterminal.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2009 Francois Barel
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_REPOSITORY_INCLUDE_QI_NONTERMINAL
+#define BOOST_SPIRIT_REPOSITORY_INCLUDE_QI_NONTERMINAL
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/nonterminal.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_primitive.hpp b/boost/spirit/repository/include/qi_primitive.hpp
new file mode 100644
index 0000000000..88e3837edb
--- /dev/null
+++ b/boost/spirit/repository/include/qi_primitive.hpp
@@ -0,0 +1,18 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_INCLUDE_REPOSITORY_QI_PRIMITIVE
+#define BOOST_SPIRIT_INCLUDE_REPOSITORY_QI_PRIMITIVE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/primitive.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_seek.hpp b/boost/spirit/repository/include/qi_seek.hpp
new file mode 100644
index 0000000000..638861acf8
--- /dev/null
+++ b/boost/spirit/repository/include/qi_seek.hpp
@@ -0,0 +1,16 @@
+/*//////////////////////////////////////////////////////////////////////////////
+ Copyright (c) 2011 Jamboree
+
+ Distributed under the 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_SPIRIT_INCLUDE_QI_REPOSITORY_SEEK
+#define BOOST_SPIRIT_INCLUDE_QI_REPOSITORY_SEEK
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/directive/seek.hpp>
+
+#endif
diff --git a/boost/spirit/repository/include/qi_subrule.hpp b/boost/spirit/repository/include/qi_subrule.hpp
new file mode 100644
index 0000000000..a146d6985b
--- /dev/null
+++ b/boost/spirit/repository/include/qi_subrule.hpp
@@ -0,0 +1,19 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ Copyright (c) 2009 Francois Barel
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_REPOSITORY_INCLUDE_QI_SUBRULE
+#define BOOST_SPIRIT_REPOSITORY_INCLUDE_QI_SUBRULE
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/nonterminal/subrule.hpp>
+
+#endif
diff --git a/boost/spirit/symbols.hpp b/boost/spirit/symbols.hpp
new file mode 100644
index 0000000000..df56a65d57
--- /dev/null
+++ b/boost/spirit/symbols.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SYMBOLS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SYMBOLS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_symbols.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_symbols.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_symbols.hpp>
+
+#endif
diff --git a/boost/spirit/symbols/symbols.hpp b/boost/spirit/symbols/symbols.hpp
new file mode 100644
index 0000000000..df56a65d57
--- /dev/null
+++ b/boost/spirit/symbols/symbols.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SYMBOLS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SYMBOLS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_symbols.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_symbols.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_symbols.hpp>
+
+#endif
diff --git a/boost/spirit/symbols/symbols_fwd.hpp b/boost/spirit/symbols/symbols_fwd.hpp
new file mode 100644
index 0000000000..930f86b44e
--- /dev/null
+++ b/boost/spirit/symbols/symbols_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SYMBOLS_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SYMBOLS_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_symbols_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_symbols_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_symbols_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/symbols/typeof.hpp b/boost/spirit/symbols/typeof.hpp
new file mode 100644
index 0000000000..07c6b33239
--- /dev/null
+++ b/boost/spirit/symbols/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_SYMBOLS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_SYMBOLS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/tree/ast.hpp b/boost/spirit/tree/ast.hpp
new file mode 100644
index 0000000000..416b10f6ef
--- /dev/null
+++ b/boost/spirit/tree/ast.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_AST
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_AST
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_ast.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_ast.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_ast.hpp>
+
+#endif
diff --git a/boost/spirit/tree/ast_fwd.hpp b/boost/spirit/tree/ast_fwd.hpp
new file mode 100644
index 0000000000..7b978d1278
--- /dev/null
+++ b/boost/spirit/tree/ast_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_AST_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_AST_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_ast_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_ast_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_ast_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/tree/common.hpp b/boost/spirit/tree/common.hpp
new file mode 100644
index 0000000000..7555b4dbfd
--- /dev/null
+++ b/boost/spirit/tree/common.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_COMMON
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_COMMON
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_common.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_common.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_common.hpp>
+
+#endif
diff --git a/boost/spirit/tree/common_fwd.hpp b/boost/spirit/tree/common_fwd.hpp
new file mode 100644
index 0000000000..039b3b0d8d
--- /dev/null
+++ b/boost/spirit/tree/common_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_COMMON_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_COMMON_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_common_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_common_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_common_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/tree/parse_tree.hpp b/boost/spirit/tree/parse_tree.hpp
new file mode 100644
index 0000000000..ef8c5d4734
--- /dev/null
+++ b/boost/spirit/tree/parse_tree.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARSE_TREE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARSE_TREE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parse_tree.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parse_tree.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parse_tree.hpp>
+
+#endif
diff --git a/boost/spirit/tree/parse_tree_fwd.hpp b/boost/spirit/tree/parse_tree_fwd.hpp
new file mode 100644
index 0000000000..8330731711
--- /dev/null
+++ b/boost/spirit/tree/parse_tree_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARSE_TREE_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARSE_TREE_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parse_tree_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parse_tree_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parse_tree_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/tree/parse_tree_utils.hpp b/boost/spirit/tree/parse_tree_utils.hpp
new file mode 100644
index 0000000000..6df07fd96e
--- /dev/null
+++ b/boost/spirit/tree/parse_tree_utils.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_PARSE_TREE_UTILS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_PARSE_TREE_UTILS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_parse_tree_utils.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_parse_tree_utils.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_parse_tree_utils.hpp>
+
+#endif
diff --git a/boost/spirit/tree/parsetree.dtd b/boost/spirit/tree/parsetree.dtd
new file mode 100644
index 0000000000..9d847c746c
--- /dev/null
+++ b/boost/spirit/tree/parsetree.dtd
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- This DTD is used for the output of Spirit parse tree's through -->
+<!-- the boost::spirit::tree_to_xml functions. -->
+<!-- Copyright (c) 2001-2007 Hartmut Kaiser -->
+<!-- Distribution under the Boost Software -->
+<!-- License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -->
+<!-- http://www.boost.org/LICENSE_1_0.txt) -->
+<!ELEMENT parsetree (parsenode)>
+<!ATTLIST parsetree
+ version CDATA "1.0"
+>
+<!ELEMENT parsenode ((value | token)?, parsenode*)>
+<!ATTLIST parsenode
+ rule CDATA #IMPLIED
+>
+<!ELEMENT value (#PCDATA | token)*>
+<!ELEMENT token (#PCDATA)>
+<!ATTLIST token
+ id CDATA #REQUIRED
+ is_root CDATA "0"
+>
diff --git a/boost/spirit/tree/tree_to_xml.hpp b/boost/spirit/tree/tree_to_xml.hpp
new file mode 100644
index 0000000000..c4dece8ce2
--- /dev/null
+++ b/boost/spirit/tree/tree_to_xml.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TREE_TO_XML
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TREE_TO_XML
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_tree_to_xml.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_tree_to_xml.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_tree_to_xml.hpp>
+
+#endif
diff --git a/boost/spirit/tree/typeof.hpp b/boost/spirit/tree/typeof.hpp
new file mode 100644
index 0000000000..fd46ee3dc4
--- /dev/null
+++ b/boost/spirit/tree/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_TREE
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_TREE
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/utility.hpp b/boost/spirit/utility.hpp
new file mode 100644
index 0000000000..1aa7fbc58f
--- /dev/null
+++ b/boost/spirit/utility.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_UTILITY
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_UTILITY
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_utility.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_utility.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_utility.hpp>
+
+#endif
diff --git a/boost/spirit/utility/chset.hpp b/boost/spirit/utility/chset.hpp
new file mode 100644
index 0000000000..8c8c188316
--- /dev/null
+++ b/boost/spirit/utility/chset.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CHSET
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CHSET
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_chset.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_chset.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_chset.hpp>
+
+#endif
diff --git a/boost/spirit/utility/chset_operators.hpp b/boost/spirit/utility/chset_operators.hpp
new file mode 100644
index 0000000000..a4e2dd0a70
--- /dev/null
+++ b/boost/spirit/utility/chset_operators.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CHSET_OPERATORS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CHSET_OPERATORS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_chset_operators.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_chset_operators.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_chset_operators.hpp>
+
+#endif
diff --git a/boost/spirit/utility/confix.hpp b/boost/spirit/utility/confix.hpp
new file mode 100644
index 0000000000..c7f9f76e34
--- /dev/null
+++ b/boost/spirit/utility/confix.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CONFIX
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CONFIX
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_confix.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_confix.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_confix.hpp>
+
+#endif
diff --git a/boost/spirit/utility/confix_fwd.hpp b/boost/spirit/utility/confix_fwd.hpp
new file mode 100644
index 0000000000..5ae89079e2
--- /dev/null
+++ b/boost/spirit/utility/confix_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_CONFIX_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_CONFIX_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_confix_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_confix_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_confix_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/utility/distinct.hpp b/boost/spirit/utility/distinct.hpp
new file mode 100644
index 0000000000..201034ea0b
--- /dev/null
+++ b/boost/spirit/utility/distinct.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_DISTINCT
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_DISTINCT
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_distinct.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_distinct.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_distinct.hpp>
+
+#endif
diff --git a/boost/spirit/utility/distinct_fwd.hpp b/boost/spirit/utility/distinct_fwd.hpp
new file mode 100644
index 0000000000..b3a68859a1
--- /dev/null
+++ b/boost/spirit/utility/distinct_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_DISTINCT_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_DISTINCT_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_distinct_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_distinct_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_distinct_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/utility/escape_char.hpp b/boost/spirit/utility/escape_char.hpp
new file mode 100644
index 0000000000..8b7374da58
--- /dev/null
+++ b/boost/spirit/utility/escape_char.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ESCAPE_CHAR
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ESCAPE_CHAR
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_escape_char.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_escape_char.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_escape_char.hpp>
+
+#endif
diff --git a/boost/spirit/utility/escape_char_fwd.hpp b/boost/spirit/utility/escape_char_fwd.hpp
new file mode 100644
index 0000000000..0db9cb9287
--- /dev/null
+++ b/boost/spirit/utility/escape_char_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_ESCAPE_CHAR_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_ESCAPE_CHAR_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_escape_char_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_escape_char_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_escape_char_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/utility/flush_multi_pass.hpp b/boost/spirit/utility/flush_multi_pass.hpp
new file mode 100644
index 0000000000..4d61fe0806
--- /dev/null
+++ b/boost/spirit/utility/flush_multi_pass.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_FLUSH_MULTI_PASS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_FLUSH_MULTI_PASS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_flush_multi_pass.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_flush_multi_pass.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_flush_multi_pass.hpp>
+
+#endif
diff --git a/boost/spirit/utility/functor_parser.hpp b/boost/spirit/utility/functor_parser.hpp
new file mode 100644
index 0000000000..3112ea2f62
--- /dev/null
+++ b/boost/spirit/utility/functor_parser.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_FUNCTOR_PARSER
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_FUNCTOR_PARSER
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_functor_parser.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_functor_parser.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_functor_parser.hpp>
+
+#endif
diff --git a/boost/spirit/utility/grammar_def.hpp b/boost/spirit/utility/grammar_def.hpp
new file mode 100644
index 0000000000..fbb7c55299
--- /dev/null
+++ b/boost/spirit/utility/grammar_def.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_GRAMMAR_DEF
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_GRAMMAR_DEF
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_grammar_def.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_grammar_def.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_grammar_def.hpp>
+
+#endif
diff --git a/boost/spirit/utility/grammar_def_fwd.hpp b/boost/spirit/utility/grammar_def_fwd.hpp
new file mode 100644
index 0000000000..54f64d2d17
--- /dev/null
+++ b/boost/spirit/utility/grammar_def_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_GRAMMAR_DEF_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_GRAMMAR_DEF_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_grammar_def_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_grammar_def_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_grammar_def_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/utility/lists.hpp b/boost/spirit/utility/lists.hpp
new file mode 100644
index 0000000000..9234263c10
--- /dev/null
+++ b/boost/spirit/utility/lists.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_LISTS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_LISTS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_lists.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_lists.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_lists.hpp>
+
+#endif
diff --git a/boost/spirit/utility/lists_fwd.hpp b/boost/spirit/utility/lists_fwd.hpp
new file mode 100644
index 0000000000..d256e5e200
--- /dev/null
+++ b/boost/spirit/utility/lists_fwd.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_LISTS_FWD
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_LISTS_FWD
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_lists_fwd.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_lists_fwd.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_lists_fwd.hpp>
+
+#endif
diff --git a/boost/spirit/utility/loops.hpp b/boost/spirit/utility/loops.hpp
new file mode 100644
index 0000000000..562e71b602
--- /dev/null
+++ b/boost/spirit/utility/loops.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_LOOPS
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_LOOPS
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_loops.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_loops.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_loops.hpp>
+
+#endif
diff --git a/boost/spirit/utility/regex.hpp b/boost/spirit/utility/regex.hpp
new file mode 100644
index 0000000000..c612c13a26
--- /dev/null
+++ b/boost/spirit/utility/regex.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_REGEX
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_REGEX
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_regex.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_regex.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_regex.hpp>
+
+#endif
diff --git a/boost/spirit/utility/rule_parser.hpp b/boost/spirit/utility/rule_parser.hpp
new file mode 100644
index 0000000000..77bdeb1841
--- /dev/null
+++ b/boost/spirit/utility/rule_parser.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_RULE_PARSER
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_RULE_PARSER
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_rule_parser.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_rule_parser.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_rule_parser.hpp>
+
+#endif
diff --git a/boost/spirit/utility/scoped_lock.hpp b/boost/spirit/utility/scoped_lock.hpp
new file mode 100644
index 0000000000..6327f68f8f
--- /dev/null
+++ b/boost/spirit/utility/scoped_lock.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_SCOPED_LOCK
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_SCOPED_LOCK
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_scoped_lock.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_scoped_lock.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_scoped_lock.hpp>
+
+#endif
diff --git a/boost/spirit/utility/typeof.hpp b/boost/spirit/utility/typeof.hpp
new file mode 100644
index 0000000000..f2044bfc21
--- /dev/null
+++ b/boost/spirit/utility/typeof.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2001-2008 Joel de Guzman
+ Copyright (c) 2001-2008 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_UTILITY
+#define BOOST_SPIRIT_DEPRECATED_INCLUDE_TYPEOF_UTILITY
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+# pragma message ("Warning: This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+# warning "This header is deprecated. Please use: boost/spirit/include/classic_typeof.hpp"
+#endif
+#endif
+
+#if !defined(BOOST_SPIRIT_USE_OLD_NAMESPACE)
+#define BOOST_SPIRIT_USE_OLD_NAMESPACE
+#endif
+#include <boost/spirit/include/classic_typeof.hpp>
+
+#endif
diff --git a/boost/spirit/version.hpp b/boost/spirit/version.hpp
new file mode 100644
index 0000000000..fdffdefd1e
--- /dev/null
+++ b/boost/spirit/version.hpp
@@ -0,0 +1,14 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2011 Hartmut Kaiser
+ http://spirit.sourceforge.net/
+
+ Distributed under the 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(SPIRIT_VERSION_NOVEMBER_13_2008_0834AM)
+#define SPIRIT_VERSION_NOVEMBER_13_2008_0834AM
+
+#include <boost/spirit/include/version.hpp>
+
+#endif